192 | | addiu $29, $29, -21*4 // 21 registers to save (18 temp regs + HI + LO + $31) |
193 | | sw $31, 20*4($29) // $31 because, it is lost by jal irq_handler |
| 192 | addiu $29, $29, -23*4 // 23 registers to save (18 tmp regs+HI+LO+$31+EPC+SR) |
| 193 | mfc0 $27, $14 // $27 <- EPC (addr of syscall instruction) |
| 194 | mfc0 $26, $12 // $26 <- SR (status register) |
| 195 | sw $31, 22*4($29) // $31 because, it is lost by jal irq_handler |
| 196 | sw $27, 21*4($29) // save EPC (return address of IRQ) |
| 197 | sw $26, 20*4($29) // save SR (status register) |
| 198 | mtc0 $0, $12 // SR <- kernel-mode without INT (UM=0 ERL=0 EXL=0 IE=0) |
202 | | [etc.] |
203 | | lw $31, 20*4($29) // restore also $31 |
204 | | addiu $29, $29, 21*4 // restore the stack pointer |
| 207 | [etc.] |
| 208 | lw $26, 20*4($29) // get old SR |
| 209 | lw $27, 21*4($29) // get return address of syscall |
| 210 | lw $31, 22*4($29) // restore $31 |
| 211 | mtc0 $26, $12 // restore SR |
| 212 | mtc0 $27, $14 // restore EPC |
| 213 | addiu $29, $29, 23*4 // restore the stack pointer |
207 | | Pourquoi, ne sauvez que les registres temporaires ? |
208 | | {{{#!protected ------------------------------------------------------------------------------------ |
209 | | '' |
210 | | * On doit sauver les registres temporaires parce que l'IRQ peut interrompre le programme n'importe quand et qu'il faudra revenir à l'application interrompue dans le même état donc sans perte d'information dans les registres. On ne sauve pas les registres persistants parce que ce sera à la fonction `irq_handler()` de s'en charger, si c'est nécessaire. |
| 216 | Pourquoi, ne sauver que les registres temporaires ? |
| 217 | {{{#!protected ------------------------------------------------------------------------------------ |
| 218 | '' |
| 219 | * On doit sauver les registres temporaires parce que l'IRQ peut interrompre le programme n'importe quand et qu'il faudra revenir à l'application interrompue dans le même état donc sans perte d'information dans les registres. On ne sauve pas les registres persistants parce que ce sera fait dans la fonction `irq_handler()`, si c'est nécessaire. |