1.1 --- a/stage2/handlers.S Sat Feb 27 23:41:17 2016 +0100
1.2 +++ b/stage2/handlers.S Sun Feb 28 01:18:09 2016 +0100
1.3 @@ -20,6 +20,7 @@
1.4
1.5 .text
1.6 .extern irq_handle
1.7 +.extern current_registers
1.8 .extern current_stack_pointer
1.9 .extern current_task
1.10 .globl interrupt_handler
1.11 @@ -32,11 +33,6 @@
1.12 jal save_state
1.13 nop
1.14
1.15 - /* Record the stack pointer. */
1.16 -
1.17 - la $k0, current_stack_pointer
1.18 - sw $sp, 0($k0)
1.19 -
1.20 /* Invoke the handler. */
1.21
1.22 jal irq_handle
1.23 @@ -45,7 +41,8 @@
1.24 /* Switch the stack pointer. */
1.25
1.26 la $k0, current_stack_pointer
1.27 - lw $sp, 0($k0)
1.28 + lw $k1, 0($k0) /* &stack_pointers[current_task] */
1.29 + lw $sp, 0($k1)
1.30
1.31 /* Set the current task ASID. */
1.32
1.33 @@ -54,81 +51,89 @@
1.34 mtc0 $k1, $10 /* CP0_ENTRYHI */
1.35 nop
1.36
1.37 + /* Obtain the current task's registers. */
1.38 +
1.39 j load_and_return
1.40 nop
1.41
1.42 save_state:
1.43 - sw $at, -4($sp)
1.44 - sw $v0, -8($sp)
1.45 - sw $v1, -12($sp)
1.46 - sw $a0, -16($sp)
1.47 - sw $a1, -20($sp)
1.48 - sw $a2, -24($sp)
1.49 - sw $a3, -28($sp)
1.50 - sw $t0, -32($sp)
1.51 - sw $t1, -36($sp)
1.52 - sw $t2, -40($sp)
1.53 - sw $t3, -44($sp)
1.54 - sw $t4, -48($sp)
1.55 - sw $t5, -52($sp)
1.56 - sw $t6, -56($sp)
1.57 - sw $t7, -60($sp)
1.58 - sw $s0, -64($sp)
1.59 - sw $s1, -68($sp)
1.60 - sw $s2, -72($sp)
1.61 - sw $s3, -76($sp)
1.62 - sw $s4, -80($sp)
1.63 - sw $s5, -84($sp)
1.64 - sw $s6, -88($sp)
1.65 - sw $s7, -92($sp)
1.66 - sw $t8, -96($sp)
1.67 - /* sw $t9, -100($sp) */
1.68 - /* sw $gp, -104($sp) */
1.69 - sw $fp, -108($sp)
1.70 - /* sw $ra, -112($sp) */
1.71 + /* Obtain a store of registers for the current task. */
1.72 +
1.73 + la $k0, current_registers
1.74 + lw $k1, 0($k0)
1.75 +
1.76 + sw $at, 4($k1)
1.77 + sw $v0, 8($k1)
1.78 + sw $v1, 12($k1)
1.79 + sw $a0, 16($k1)
1.80 + sw $a1, 20($k1)
1.81 + sw $a2, 24($k1)
1.82 + sw $a3, 28($k1)
1.83 + sw $t0, 32($k1)
1.84 + sw $t1, 36($k1)
1.85 + sw $t2, 40($k1)
1.86 + sw $t3, 44($k1)
1.87 + sw $t4, 48($k1)
1.88 + sw $t5, 52($k1)
1.89 + sw $t6, 56($k1)
1.90 + sw $t7, 60($k1)
1.91 + sw $s0, 64($k1)
1.92 + sw $s1, 68($k1)
1.93 + sw $s2, 72($k1)
1.94 + sw $s3, 76($k1)
1.95 + sw $s4, 80($k1)
1.96 + sw $s5, 84($k1)
1.97 + sw $s6, 88($k1)
1.98 + sw $s7, 92($k1)
1.99 + sw $t8, 96($k1)
1.100 +
1.101 + /* t9, gp and ra are already saved */
1.102 +
1.103 + sw $fp, 108($k1)
1.104
1.105 mfc0 $k0, $14 /* CP0_EPC */
1.106 nop
1.107 - sw $k0, -116($sp)
1.108 + sw $k0, 116($k1)
1.109
1.110 - addi $sp, $sp, -120
1.111 j $ra
1.112 nop
1.113
1.114 load_and_return:
1.115 + /* Obtain a store of registers for the current task. */
1.116
1.117 - addi $sp, $sp, 120
1.118 + la $k0, current_registers
1.119 + lw $k1, 0($k0)
1.120
1.121 - lw $at, -4($sp)
1.122 - lw $v0, -8($sp)
1.123 - lw $v1, -12($sp)
1.124 - lw $a0, -16($sp)
1.125 - lw $a1, -20($sp)
1.126 - lw $a2, -24($sp)
1.127 - lw $a3, -28($sp)
1.128 - lw $t0, -32($sp)
1.129 - lw $t1, -36($sp)
1.130 - lw $t2, -40($sp)
1.131 - lw $t3, -44($sp)
1.132 - lw $t4, -48($sp)
1.133 - lw $t5, -52($sp)
1.134 - lw $t6, -56($sp)
1.135 - lw $t7, -60($sp)
1.136 - lw $s0, -64($sp)
1.137 - lw $s1, -68($sp)
1.138 - lw $s2, -72($sp)
1.139 - lw $s3, -76($sp)
1.140 - lw $s4, -80($sp)
1.141 - lw $s5, -84($sp)
1.142 - lw $s6, -88($sp)
1.143 - lw $s7, -92($sp)
1.144 - lw $t8, -96($sp)
1.145 - lw $t9, -100($sp)
1.146 - lw $gp, -104($sp)
1.147 - lw $fp, -108($sp)
1.148 - lw $ra, -112($sp)
1.149 + lw $at, 4($k1)
1.150 + lw $v0, 8($k1)
1.151 + lw $v1, 12($k1)
1.152 + lw $a0, 16($k1)
1.153 + lw $a1, 20($k1)
1.154 + lw $a2, 24($k1)
1.155 + lw $a3, 28($k1)
1.156 + lw $t0, 32($k1)
1.157 + lw $t1, 36($k1)
1.158 + lw $t2, 40($k1)
1.159 + lw $t3, 44($k1)
1.160 + lw $t4, 48($k1)
1.161 + lw $t5, 52($k1)
1.162 + lw $t6, 56($k1)
1.163 + lw $t7, 60($k1)
1.164 + lw $s0, 64($k1)
1.165 + lw $s1, 68($k1)
1.166 + lw $s2, 72($k1)
1.167 + lw $s3, 76($k1)
1.168 + lw $s4, 80($k1)
1.169 + lw $s5, 84($k1)
1.170 + lw $s6, 88($k1)
1.171 + lw $s7, 92($k1)
1.172 + lw $t8, 96($k1)
1.173 + lw $t9, 100($k1)
1.174 + lw $gp, 104($k1)
1.175 + lw $fp, 108($k1)
1.176 + lw $ra, 112($k1)
1.177
1.178 - lw $k0, -116($sp)
1.179 + lw $k0, 116($k1)
1.180 mtc0 $k0, $14 /* CP0_EPC */
1.181 nop
1.182