文章目录
1、ARMV8 SCR.FIQ/SCR.IRQ的bit位定义
意思就是说,如果SCR.IRQ=0,IRQ中断不会target到EL3,如果SCR.IRQ=1,则IRQ将会被target到EL3
同样FIQ也是如此,如果SCR.FIQ=0,FIQ中断不会target到EL3,如果SCR.FIQ=1,则FIQ将会被target到EL3
2、SCR.FIQ/SCR.IRQ的配置
那么SCR.FIQ/SCR.IRQ是在哪里配置的呢? 因为SCR只有SCR_EL3寄存器,只能在EL3级别操作.
在linux+optee的双系统环境下,SCR_EL3的IRQ和FIQ的比特位是在ATF中完成的,ATF对这部分配置的代码进行了封装,
如下代码所示,注册了一个cpu执行在non-secure时来响应一个secure中断的机制。传入的参数是INTR_TYPE_S_EL1和flag=0,
在该函数的底层,则会配置SCR.FIQ=1.
也就是说,当cpu跑在linux的时候,来了一个FIQ中断,此时FIQ将被target到EL3,即cpu跳转到VBAR_EL3 + fiq_offset
/*
* Register an interrupt handler for S-EL1 interrupts
* when generated during code executing in the
* non-secure state.
*/
flags = 0;
set_interrupt_rm_flag(flags, NON_SECURE);
rc = register_interrupt_type_handler(INTR_TYPE_S_EL1,
opteed_sel1_interrupt_handler,
flags);