1.1 --- a/stage2/handlers.S Sat Dec 05 19:42:12 2015 +0100
1.2 +++ b/stage2/handlers.S Sun Dec 06 00:55:36 2015 +0100
1.3 @@ -1,7 +1,7 @@
1.4 /*
1.5 * Handler routines.
1.6 *
1.7 - * Copyright (C) 2008 by Maurus Cuelenaere
1.8 + * Copyright (C) 2015 nfd
1.9 * Copyright (C) 2015 Paul Boddie <paul@boddie.org.uk>
1.10 *
1.11 * This program is free software: you can redistribute it and/or modify
1.12 @@ -20,183 +20,80 @@
1.13
1.14 .text
1.15 .extern irq_handle
1.16 -.extern irq_counter
1.17 -.globl _exc_stack
1.18 -.globl real_exception_handler
1.19 +.globl interrupt_handler
1.20 .set noreorder
1.21 .set noat
1.22
1.23 -#define C0_STATUS $12
1.24 -#define C0_CAUSE $13
1.25 -#define C0_EPC $14
1.26 -#define C0_CONFIG $16
1.27 -#define C0_ERROREPC $30
1.28 -#define S_CauseExcCode 2
1.29 -#define M_CauseExcCode (0x1f << S_CauseExcCode)
1.30 -
1.31 -_exc_stack:
1.32 - .word 0
1.33 +interrupt_handler:
1.34 + sw $at, -4($sp)
1.35 + sw $v0, -8($sp)
1.36 + sw $v1, -12($sp)
1.37 + sw $a0, -16($sp)
1.38 + sw $a1, -20($sp)
1.39 + sw $a2, -24($sp)
1.40 + sw $a3, -28($sp)
1.41 + sw $t0, -32($sp)
1.42 + sw $t1, -36($sp)
1.43 + sw $t2, -40($sp)
1.44 + sw $t3, -44($sp)
1.45 + sw $t4, -48($sp)
1.46 + sw $t5, -52($sp)
1.47 + sw $t6, -56($sp)
1.48 + sw $t7, -60($sp)
1.49 + sw $s0, -64($sp)
1.50 + sw $s1, -68($sp)
1.51 + sw $s2, -72($sp)
1.52 + sw $s3, -76($sp)
1.53 + sw $s4, -80($sp)
1.54 + sw $s5, -84($sp)
1.55 + sw $s6, -88($sp)
1.56 + sw $s7, -92($sp)
1.57 + sw $t8, -96($sp)
1.58 + sw $t9, -100($sp)
1.59 + sw $gp, -104($sp)
1.60 + sw $fp, -108($sp)
1.61 + sw $ra, -112($sp)
1.62
1.63 -real_exception_handler:
1.64 - addiu $sp, -0x88 /* multiple of 8 */
1.65 - sw $ra, 0($sp)
1.66 - sw $fp, 4($sp)
1.67 - sw $gp, 8($sp)
1.68 - sw $t9, 0xC($sp)
1.69 - sw $t8, 0x10($sp)
1.70 - sw $s7, 0x14($sp)
1.71 - sw $s6, 0x18($sp)
1.72 - sw $s5, 0x1C($sp)
1.73 - sw $s4, 0x20($sp)
1.74 - sw $s3, 0x24($sp)
1.75 - sw $s2, 0x28($sp)
1.76 - sw $s1, 0x2C($sp)
1.77 - sw $s0, 0x30($sp)
1.78 - sw $t7, 0x34($sp)
1.79 - sw $t6, 0x38($sp)
1.80 - sw $t5, 0x3C($sp)
1.81 - sw $t4, 0x40($sp)
1.82 - sw $t3, 0x44($sp)
1.83 - sw $t2, 0x48($sp)
1.84 - sw $t1, 0x4C($sp)
1.85 - sw $t0, 0x50($sp)
1.86 - sw $a3, 0x54($sp)
1.87 - sw $a2, 0x58($sp)
1.88 - sw $a1, 0x5C($sp)
1.89 - sw $a0, 0x60($sp)
1.90 - sw $v1, 0x64($sp)
1.91 - sw $v0, 0x68($sp)
1.92 - sw $1, 0x6C($sp)
1.93 - mflo $k0
1.94 - nop
1.95 - sw $k0, 0x70($sp)
1.96 - mfhi $k0
1.97 - nop
1.98 - sw $k0, 0x74($sp)
1.99 - mfc0 $k0, C0_STATUS
1.100 - sll $zero, 1
1.101 - sll $zero, 1
1.102 - sll $zero, 1
1.103 - sll $zero, 1
1.104 - sw $k0, 0x78($sp)
1.105 - mfc0 $k0, C0_EPC
1.106 - sll $zero, 1
1.107 - sll $zero, 1
1.108 - sll $zero, 1
1.109 - sll $zero, 1
1.110 - sw $k0, 0x7C($sp)
1.111 - mfc0 $k0, C0_ERROREPC
1.112 - sll $zero, 1
1.113 - sll $zero, 1
1.114 - sll $zero, 1
1.115 - sll $zero, 1
1.116 - sw $k0, 0x80($sp)
1.117 -
1.118 - li $k1, M_CauseExcCode
1.119 - mfc0 $k0, C0_CAUSE
1.120 - and $k0, $k1
1.121 - beq $zero, $k0, _int
1.122 - nop
1.123 - j _exception
1.124 - nop
1.125 -
1.126 -_int:
1.127 - /* Initialise the kernel stack. */
1.128 + addi $sp, $sp, -112
1.129
1.130 - la $k1, _exc_stack
1.131 - lw $k0, 0($k1)
1.132 - sw $sp, 0($k0)
1.133 - addiu $k0, -4
1.134 - move $sp, $k0
1.135 -
1.136 - /* Initialise the globals pointer. */
1.137 + /* Invoke the handler. */
1.138
1.139 - lui $gp, %hi(_GLOBAL_OFFSET_TABLE_)
1.140 - ori $gp, $gp, %lo(_GLOBAL_OFFSET_TABLE_)
1.141 -
1.142 - /* Test with counter. */
1.143 -
1.144 - la $t0, irq_counter
1.145 - lw $t1, 0($t0)
1.146 - addiu $t1, $t1, 1
1.147 - sw $t1, 0($t0)
1.148 -
1.149 - /* Invoke the handler. */
1.150 + jal irq_handle
1.151 + nop
1.152
1.153 - jal irq_handle
1.154 - nop
1.155 -
1.156 - /* Restore the user stack. */
1.157 -
1.158 - addiu $sp, 4
1.159 - lw $sp, 0($sp)
1.160 -
1.161 - j _exception_return
1.162 - nop
1.163 -
1.164 -_exception:
1.165 - j _exception_return
1.166 - nop
1.167 + addi $sp, $sp, 112
1.168
1.169 -_exception_return:
1.170 - lw $ra, 0($sp)
1.171 - lw $fp, 4($sp)
1.172 - lw $gp, 8($sp)
1.173 - lw $t9, 0xC($sp)
1.174 - lw $t8, 0x10($sp)
1.175 - lw $s7, 0x14($sp)
1.176 - lw $s6, 0x18($sp)
1.177 - lw $s5, 0x1C($sp)
1.178 - lw $s4, 0x20($sp)
1.179 - lw $s3, 0x24($sp)
1.180 - lw $s2, 0x28($sp)
1.181 - lw $s1, 0x2C($sp)
1.182 - lw $s0, 0x30($sp)
1.183 - lw $t7, 0x34($sp)
1.184 - lw $t6, 0x38($sp)
1.185 - lw $t5, 0x3C($sp)
1.186 - lw $t4, 0x40($sp)
1.187 - lw $t3, 0x44($sp)
1.188 - lw $t2, 0x48($sp)
1.189 - lw $t1, 0x4C($sp)
1.190 - lw $t0, 0x50($sp)
1.191 - lw $a3, 0x54($sp)
1.192 - lw $a2, 0x58($sp)
1.193 - lw $a1, 0x5C($sp)
1.194 - lw $a0, 0x60($sp)
1.195 - lw $v1, 0x64($sp)
1.196 - lw $v0, 0x68($sp)
1.197 - lw $1, 0x6C($sp)
1.198 - lw $k0, 0x70($sp)
1.199 - mtlo $k0
1.200 - nop
1.201 - lw $k0, 0x74($sp)
1.202 - mthi $k0
1.203 - nop
1.204 - lw $k0, 0x78($sp)
1.205 - mtc0 $k0, C0_STATUS
1.206 - nop
1.207 - sll $zero, 1
1.208 - sll $zero, 1
1.209 - sll $zero, 1
1.210 - sll $zero, 1
1.211 - lw $k0, 0x7C($sp)
1.212 - mtc0 $k0, C0_EPC
1.213 - nop
1.214 - sll $zero, 1
1.215 - sll $zero, 1
1.216 - sll $zero, 1
1.217 - sll $zero, 1
1.218 - lw $k0, 0x80($sp)
1.219 - mtc0 $k0, C0_ERROREPC
1.220 - nop
1.221 - sll $zero, 1
1.222 - sll $zero, 1
1.223 - sll $zero, 1
1.224 - sll $zero, 1
1.225 - addiu $sp, 0x88 /* multiple of 8 */
1.226 - eret
1.227 - nop
1.228 + lw $at, -4($sp)
1.229 + lw $v0, -8($sp)
1.230 + lw $v1, -12($sp)
1.231 + lw $a0, -16($sp)
1.232 + lw $a1, -20($sp)
1.233 + lw $a2, -24($sp)
1.234 + lw $a3, -28($sp)
1.235 + lw $t0, -32($sp)
1.236 + lw $t1, -36($sp)
1.237 + lw $t2, -40($sp)
1.238 + lw $t3, -44($sp)
1.239 + lw $t4, -48($sp)
1.240 + lw $t5, -52($sp)
1.241 + lw $t6, -56($sp)
1.242 + lw $t7, -60($sp)
1.243 + lw $s0, -64($sp)
1.244 + lw $s1, -68($sp)
1.245 + lw $s2, -72($sp)
1.246 + lw $s3, -76($sp)
1.247 + lw $s4, -80($sp)
1.248 + lw $s5, -84($sp)
1.249 + lw $s6, -88($sp)
1.250 + lw $s7, -92($sp)
1.251 + lw $t8, -96($sp)
1.252 + lw $t9, -100($sp)
1.253 + lw $gp, -104($sp)
1.254 + lw $fp, -108($sp)
1.255 + lw $ra, -112($sp)
1.256 +
1.257 + eret
1.258 + nop
1.259
1.260 .set reorder
1.261 .set at