ICC_SRE_EL3:控制EL3下选择系统寄存器接口,或内存映射接口,作为GIC CPU接口;(非正规表述就是对ICC_*/ICH*寄存器的访问是通过寄存器接口还是内存映射接口,如果使用内存映射接口,则访问寄存器会发生异常,并被本异常等级捕获)
bit3 Enable:使能低异常等级对ICC_SRE_EL1/2的访问;
0-将Secure/non-Secure EL1(ICC_SRE_EL3的SRE==1即使用系统寄存器接口)对ICC_SRE_EL1的访问、EL2对ICC_SRE_EL1/2的访问捕获到EL3;
1-不捕获;
bit2 DIB:禁用IRQ bypass;
0-使能IRQ bypass;
1-禁用IRQ bypass;
bit1 DFB:禁用FIQ bypass,同DIB;
bit0 SRE:使能系统寄存器;
0-必须使用内存映射接口,EL3访问任意ICH_*或ICC_*寄存器(除了ICC_SRE_EL1/2/3)都会捕获到EL3;
1-系统寄存器接口到ICH_*寄存器和EL1/2/3的ICC_*寄存器在EL3中使能;
ICC_SRE_EL2:控制EL2下选择系统寄存器接口或内存映射接口作为GIC CPU接口;
bit3 Enable:使能低异常等级对ICC_SRE_EL1的访问;
0-Non-secure EL1对ICC_SRE_EL1的访问会被捕获到EL2
1-Non-secure EL1对ICC_SRE_EL1的访问不会被捕获到EL2
bit2 DIB:禁用IRQ bypass
bit1 DFB:禁用FIQ bypass
bit0 SRE:使能系统寄存器;
0-必须使用内存映射接口,EL2访问任意ICH_*或ICC_*寄存器(除了ICC_SRE_EL1、ICC_SRE_EL2)都会被捕获到EL2;
1-在EL2中使用系统寄存器接口对ICH_*以及EL1/2的ICC_*寄存器访问;
ICC_SRE_EL1:控制EL1下选择系统寄存器接口或内存映射接口作为GIC CPU接口;
bit2 DIB,bit1 DFB;不比赘述;
bit0 SRE:同EL3/2
0-必须使用内存映射接口,从EL1访问任意ICC*系统寄存器(除了ICC_SRE_EL1)都会被捕获到EL1;
1-当前异常状态使用系统寄存器接口;
msr SCR_EL3, xzr // 开机处于EL3,NS位置零,于是访问ICC_SRE_EL1其实处理的是ICC_SRE_EL1的安全域接口;
mov x0, #15
msr ICC_SRE_EL3, x0
isb
即设置EL3不捕获对ICC_SRE_EL1/2的访问;IRQ、FIQ的bypass禁用;使用系统寄存器接口。
msr ICC_SRE_EL1, x0
设置ICC_SRE_EL1的安全域接口
mov x3, #(SCR_EL3_RW | \
SCR_EL3_SMD | \
SCR_EL3_HCE | /*add hce, enable el2*/ \
SCR_EL3_NS)
msr SCR_EL3, x3
isb
在EL3中切换低异常等级到Non-secure域,这样访问ICC_SRE_EL1就是处理其Non-secure域接口,同样,仅有Non-secure接口的ICC_SRE_EL2也可以处理。
mov x0, #15
msr ICC_SRE_EL2, x0
isb
msr ICC_SRE_EL1, x0
EL3/2/1 Secure/Non-secure域的ICC_SRE_ELx都设置完成;