在正式进入handle_arch_irq之前,汇编层已经将处理器中的通用寄存器,SP,PSTATE等保存进了regs中。然后C代码中的el1_interrupt还会做一些中断前的简单处理。最新的代码已经将EL0和EL1中的FIQ和IRQ中断处理移动到了C代码中。
1.el1_irq
el1_irq调用到了el1_interrupt_handler handle_arch_irq
SYM_CODE_START_LOCAL_NOALIGN(el1_irq)
kernel_entry 1
el1_interrupt_handler handle_arch_irq
kernel_exit 1
2.el1_interrupt_handler
.macro el1_interrupt_handler, handler:req
enable_da_f
mov x0, sp //将当前的栈指针保存在寄存器 x0 中
bl enter_el1_irq_or_nmi
irq_handler \handler
#ifdef CONFIG_PREEMPTION
ldr x24, [tsk, #TSK_TI_PREEMPT] // get preempt count
alternative_if ARM64_HAS_IRQ_PRIO_MASKING
/*
* DA_F were cleared at start of handling. If anything is set in DAIF,
* we come back from an NMI, so skip preemption
*/
mrs x0, daif
orr x24, x24, x0
alternative_else_nop_endif
cbnz x24, 1f // preempt count !&