GICv3-4零散的寄存器解读(1)

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


 

发布了37 篇原创文章 · 获赞 4 · 访问量 3374
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章