1.1 --- a/stage2/handlers.S Thu Jun 25 17:58:04 2015 +0200
1.2 +++ b/stage2/handlers.S Tue Jun 30 16:07:50 2015 +0200
1.3 @@ -20,6 +20,7 @@
1.4
1.5 .text
1.6 .extern irq_handle
1.7 +.extern irq_counter
1.8 .globl real_exception_handler
1.9 .set noreorder
1.10 .set noat
1.11 @@ -28,11 +29,12 @@
1.12 #define C0_CAUSE $13
1.13 #define C0_EPC $14
1.14 #define C0_CONFIG $16
1.15 +#define C0_ERROREPC $30
1.16 #define S_CauseExcCode 2
1.17 #define M_CauseExcCode (0x1f << S_CauseExcCode)
1.18
1.19 real_exception_handler:
1.20 - addiu $sp, -0x80
1.21 + addiu $sp, -0x88 /* multiple of 8 */
1.22 sw $ra, 0($sp)
1.23 sw $fp, 4($sp)
1.24 sw $gp, 8($sp)
1.25 @@ -79,6 +81,12 @@
1.26 sll $zero, 1
1.27 sll $zero, 1
1.28 sw $k0, 0x7C($sp)
1.29 + mfc0 $k0, C0_ERROREPC
1.30 + sll $zero, 1
1.31 + sll $zero, 1
1.32 + sll $zero, 1
1.33 + sll $zero, 1
1.34 + sw $k0, 0x80($sp)
1.35
1.36 li $k1, M_CauseExcCode
1.37 mfc0 $k0, C0_CAUSE
1.38 @@ -89,6 +97,18 @@
1.39 nop
1.40
1.41 _int:
1.42 + /* Initialise the globals pointer. */
1.43 +
1.44 + lui $gp, %hi(_GLOBAL_OFFSET_TABLE_)
1.45 + ori $gp, $gp, %lo(_GLOBAL_OFFSET_TABLE_)
1.46 +
1.47 + /* Test with counter. */
1.48 +
1.49 + la $t0, irq_counter
1.50 + lw $t1, 0($t0)
1.51 + addiu $t1, $t1, 1
1.52 + sw $t1, 0($t0)
1.53 +
1.54 /* Invoke the handler. */
1.55
1.56 jal irq_handle
1.57 @@ -97,18 +117,6 @@
1.58 nop
1.59
1.60 _exception:
1.61 - move $a0, $sp
1.62 - mfc0 $a1, C0_CAUSE
1.63 - sll $zero, 1
1.64 - sll $zero, 1
1.65 - sll $zero, 1
1.66 - sll $zero, 1
1.67 - mfc0 $a2, C0_EPC
1.68 - sll $zero, 1
1.69 - sll $zero, 1
1.70 - sll $zero, 1
1.71 - sll $zero, 1
1.72 - /* jal exception_handler */
1.73 j _exception_return
1.74 nop
1.75
1.76 @@ -161,7 +169,14 @@
1.77 sll $zero, 1
1.78 sll $zero, 1
1.79 sll $zero, 1
1.80 - addiu $sp, 0x80
1.81 + lw $k0, 0x80($sp)
1.82 + mtc0 $k0, C0_ERROREPC
1.83 + nop
1.84 + sll $zero, 1
1.85 + sll $zero, 1
1.86 + sll $zero, 1
1.87 + sll $zero, 1
1.88 + addiu $sp, 0x88 /* multiple of 8 */
1.89 eret
1.90 nop
1.91