2.1 --- a/stage2/handlers.S Sat Dec 05 19:42:12 2015 +0100
2.2 +++ b/stage2/handlers.S Sun Dec 06 00:55:36 2015 +0100
2.3 @@ -1,7 +1,7 @@
2.4 /*
2.5 * Handler routines.
2.6 *
2.7 - * Copyright (C) 2008 by Maurus Cuelenaere
2.8 + * Copyright (C) 2015 nfd
2.9 * Copyright (C) 2015 Paul Boddie <paul@boddie.org.uk>
2.10 *
2.11 * This program is free software: you can redistribute it and/or modify
2.12 @@ -20,183 +20,80 @@
2.13
2.14 .text
2.15 .extern irq_handle
2.16 -.extern irq_counter
2.17 -.globl _exc_stack
2.18 -.globl real_exception_handler
2.19 +.globl interrupt_handler
2.20 .set noreorder
2.21 .set noat
2.22
2.23 -#define C0_STATUS $12
2.24 -#define C0_CAUSE $13
2.25 -#define C0_EPC $14
2.26 -#define C0_CONFIG $16
2.27 -#define C0_ERROREPC $30
2.28 -#define S_CauseExcCode 2
2.29 -#define M_CauseExcCode (0x1f << S_CauseExcCode)
2.30 -
2.31 -_exc_stack:
2.32 - .word 0
2.33 +interrupt_handler:
2.34 + sw $at, -4($sp)
2.35 + sw $v0, -8($sp)
2.36 + sw $v1, -12($sp)
2.37 + sw $a0, -16($sp)
2.38 + sw $a1, -20($sp)
2.39 + sw $a2, -24($sp)
2.40 + sw $a3, -28($sp)
2.41 + sw $t0, -32($sp)
2.42 + sw $t1, -36($sp)
2.43 + sw $t2, -40($sp)
2.44 + sw $t3, -44($sp)
2.45 + sw $t4, -48($sp)
2.46 + sw $t5, -52($sp)
2.47 + sw $t6, -56($sp)
2.48 + sw $t7, -60($sp)
2.49 + sw $s0, -64($sp)
2.50 + sw $s1, -68($sp)
2.51 + sw $s2, -72($sp)
2.52 + sw $s3, -76($sp)
2.53 + sw $s4, -80($sp)
2.54 + sw $s5, -84($sp)
2.55 + sw $s6, -88($sp)
2.56 + sw $s7, -92($sp)
2.57 + sw $t8, -96($sp)
2.58 + sw $t9, -100($sp)
2.59 + sw $gp, -104($sp)
2.60 + sw $fp, -108($sp)
2.61 + sw $ra, -112($sp)
2.62
2.63 -real_exception_handler:
2.64 - addiu $sp, -0x88 /* multiple of 8 */
2.65 - sw $ra, 0($sp)
2.66 - sw $fp, 4($sp)
2.67 - sw $gp, 8($sp)
2.68 - sw $t9, 0xC($sp)
2.69 - sw $t8, 0x10($sp)
2.70 - sw $s7, 0x14($sp)
2.71 - sw $s6, 0x18($sp)
2.72 - sw $s5, 0x1C($sp)
2.73 - sw $s4, 0x20($sp)
2.74 - sw $s3, 0x24($sp)
2.75 - sw $s2, 0x28($sp)
2.76 - sw $s1, 0x2C($sp)
2.77 - sw $s0, 0x30($sp)
2.78 - sw $t7, 0x34($sp)
2.79 - sw $t6, 0x38($sp)
2.80 - sw $t5, 0x3C($sp)
2.81 - sw $t4, 0x40($sp)
2.82 - sw $t3, 0x44($sp)
2.83 - sw $t2, 0x48($sp)
2.84 - sw $t1, 0x4C($sp)
2.85 - sw $t0, 0x50($sp)
2.86 - sw $a3, 0x54($sp)
2.87 - sw $a2, 0x58($sp)
2.88 - sw $a1, 0x5C($sp)
2.89 - sw $a0, 0x60($sp)
2.90 - sw $v1, 0x64($sp)
2.91 - sw $v0, 0x68($sp)
2.92 - sw $1, 0x6C($sp)
2.93 - mflo $k0
2.94 - nop
2.95 - sw $k0, 0x70($sp)
2.96 - mfhi $k0
2.97 - nop
2.98 - sw $k0, 0x74($sp)
2.99 - mfc0 $k0, C0_STATUS
2.100 - sll $zero, 1
2.101 - sll $zero, 1
2.102 - sll $zero, 1
2.103 - sll $zero, 1
2.104 - sw $k0, 0x78($sp)
2.105 - mfc0 $k0, C0_EPC
2.106 - sll $zero, 1
2.107 - sll $zero, 1
2.108 - sll $zero, 1
2.109 - sll $zero, 1
2.110 - sw $k0, 0x7C($sp)
2.111 - mfc0 $k0, C0_ERROREPC
2.112 - sll $zero, 1
2.113 - sll $zero, 1
2.114 - sll $zero, 1
2.115 - sll $zero, 1
2.116 - sw $k0, 0x80($sp)
2.117 -
2.118 - li $k1, M_CauseExcCode
2.119 - mfc0 $k0, C0_CAUSE
2.120 - and $k0, $k1
2.121 - beq $zero, $k0, _int
2.122 - nop
2.123 - j _exception
2.124 - nop
2.125 -
2.126 -_int:
2.127 - /* Initialise the kernel stack. */
2.128 + addi $sp, $sp, -112
2.129
2.130 - la $k1, _exc_stack
2.131 - lw $k0, 0($k1)
2.132 - sw $sp, 0($k0)
2.133 - addiu $k0, -4
2.134 - move $sp, $k0
2.135 -
2.136 - /* Initialise the globals pointer. */
2.137 + /* Invoke the handler. */
2.138
2.139 - lui $gp, %hi(_GLOBAL_OFFSET_TABLE_)
2.140 - ori $gp, $gp, %lo(_GLOBAL_OFFSET_TABLE_)
2.141 -
2.142 - /* Test with counter. */
2.143 -
2.144 - la $t0, irq_counter
2.145 - lw $t1, 0($t0)
2.146 - addiu $t1, $t1, 1
2.147 - sw $t1, 0($t0)
2.148 -
2.149 - /* Invoke the handler. */
2.150 + jal irq_handle
2.151 + nop
2.152
2.153 - jal irq_handle
2.154 - nop
2.155 -
2.156 - /* Restore the user stack. */
2.157 -
2.158 - addiu $sp, 4
2.159 - lw $sp, 0($sp)
2.160 -
2.161 - j _exception_return
2.162 - nop
2.163 -
2.164 -_exception:
2.165 - j _exception_return
2.166 - nop
2.167 + addi $sp, $sp, 112
2.168
2.169 -_exception_return:
2.170 - lw $ra, 0($sp)
2.171 - lw $fp, 4($sp)
2.172 - lw $gp, 8($sp)
2.173 - lw $t9, 0xC($sp)
2.174 - lw $t8, 0x10($sp)
2.175 - lw $s7, 0x14($sp)
2.176 - lw $s6, 0x18($sp)
2.177 - lw $s5, 0x1C($sp)
2.178 - lw $s4, 0x20($sp)
2.179 - lw $s3, 0x24($sp)
2.180 - lw $s2, 0x28($sp)
2.181 - lw $s1, 0x2C($sp)
2.182 - lw $s0, 0x30($sp)
2.183 - lw $t7, 0x34($sp)
2.184 - lw $t6, 0x38($sp)
2.185 - lw $t5, 0x3C($sp)
2.186 - lw $t4, 0x40($sp)
2.187 - lw $t3, 0x44($sp)
2.188 - lw $t2, 0x48($sp)
2.189 - lw $t1, 0x4C($sp)
2.190 - lw $t0, 0x50($sp)
2.191 - lw $a3, 0x54($sp)
2.192 - lw $a2, 0x58($sp)
2.193 - lw $a1, 0x5C($sp)
2.194 - lw $a0, 0x60($sp)
2.195 - lw $v1, 0x64($sp)
2.196 - lw $v0, 0x68($sp)
2.197 - lw $1, 0x6C($sp)
2.198 - lw $k0, 0x70($sp)
2.199 - mtlo $k0
2.200 - nop
2.201 - lw $k0, 0x74($sp)
2.202 - mthi $k0
2.203 - nop
2.204 - lw $k0, 0x78($sp)
2.205 - mtc0 $k0, C0_STATUS
2.206 - nop
2.207 - sll $zero, 1
2.208 - sll $zero, 1
2.209 - sll $zero, 1
2.210 - sll $zero, 1
2.211 - lw $k0, 0x7C($sp)
2.212 - mtc0 $k0, C0_EPC
2.213 - nop
2.214 - sll $zero, 1
2.215 - sll $zero, 1
2.216 - sll $zero, 1
2.217 - sll $zero, 1
2.218 - lw $k0, 0x80($sp)
2.219 - mtc0 $k0, C0_ERROREPC
2.220 - nop
2.221 - sll $zero, 1
2.222 - sll $zero, 1
2.223 - sll $zero, 1
2.224 - sll $zero, 1
2.225 - addiu $sp, 0x88 /* multiple of 8 */
2.226 - eret
2.227 - nop
2.228 + lw $at, -4($sp)
2.229 + lw $v0, -8($sp)
2.230 + lw $v1, -12($sp)
2.231 + lw $a0, -16($sp)
2.232 + lw $a1, -20($sp)
2.233 + lw $a2, -24($sp)
2.234 + lw $a3, -28($sp)
2.235 + lw $t0, -32($sp)
2.236 + lw $t1, -36($sp)
2.237 + lw $t2, -40($sp)
2.238 + lw $t3, -44($sp)
2.239 + lw $t4, -48($sp)
2.240 + lw $t5, -52($sp)
2.241 + lw $t6, -56($sp)
2.242 + lw $t7, -60($sp)
2.243 + lw $s0, -64($sp)
2.244 + lw $s1, -68($sp)
2.245 + lw $s2, -72($sp)
2.246 + lw $s3, -76($sp)
2.247 + lw $s4, -80($sp)
2.248 + lw $s5, -84($sp)
2.249 + lw $s6, -88($sp)
2.250 + lw $s7, -92($sp)
2.251 + lw $t8, -96($sp)
2.252 + lw $t9, -100($sp)
2.253 + lw $gp, -104($sp)
2.254 + lw $fp, -108($sp)
2.255 + lw $ra, -112($sp)
2.256 +
2.257 + eret
2.258 + nop
2.259
2.260 .set reorder
2.261 .set at