.section .text .arm #include .global main_irq_handler .type main_irq_handler, %function main_irq_handler: sub lr, lr, #4 @ Fix return address srsdb sp!, #(SR_SVC_MODE) @ Store IRQ mode LR and SPSR on the SVC stack cps #(SR_SVC_MODE) @ Switch to SVC mode push {r0-r3,r12} @ Preserve registers and r1, sp, #4 sub sp, sp, r1 @ Word-align stack push {r1,lr} bl GIC_AckIRQ @ Acknowledge interrupt, get handler address cmp r0, #0 beq .Lskip_irq cpsie i blx r0 @ Branch to interrupt handler with IRQs enabled cpsid i .Lskip_irq: pop {r1,lr} add sp, sp, r1 @ Restore stack pointer pop {r0-r3,lr} @ Restore registers rfeia sp! @ Return From Exception