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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章