\r
\r
Irq_Handler:\r
- // Save link register\r
- mov r3, lr\r
+ // Setup return address. This requires subtraction from LR.\r
+ sub lr, lr, #4\r
\r
- // We don't want to use the IRQ mode\r
- // so swich back to sys mode.\r
- mov r2, #0xDF\r
- msr cpsr_c, r2\r
- \r
- // Restore link register again\r
- mov lr, r3\r
+ // Store return stuff on system mode's stack\r
+ srsdb sp!, #31 // 31 = System mode\r
+ \r
+ // Switch to system mode.\r
+ cpsid i, #31 // 31 = system mode \r
\r
// Push registers on stack\r
push {REG_SAVE,lr}\r
\r
// Restore registers\r
pop {REG_SAVE,lr}\r
- subs pc, lr, #0x4\r
\r
+ // Return using stuff from stack.\r
+ rfeia sp!\r
\r
/**\r
* Fake an interrupt stack to be able to return to thread mode.\r