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都設置完成;