由于在做DFD 测试过程中需要测试 EL1 状态下的 self-hosted trace 功能,但是这个测试是在UEFI中做的,在开发验证阶段UEFI默认是运行在EL3 下的,所以如果要完成测试就需要从EL3跳转到EL1, 由于在查找EL3 跳转到EL1的汇编代码时,发现ARMv8和ARMv9下两者在 SCTRL_EL3的配置是有差异的,所以就引入了下文对 SCTRL_ELx的介绍。
首先看下 ARMv8/ARMv9 从 EL3 跳转到 EL1 的汇编代码:
ARMv8:
mrs x0, scr_el3
orr x0, x0, #(0x1 << 15) // 设置 SCR_EL3 的 HCE 位为 1
msr scr_el3, x0
mov x0, #(0x3 << 22) // 设置 SPSR_EL3 的 M[4:0] 位为 0b11011,即 EL1h 模式
msr spsr_el3, x0
adr x0, el1_entry_func // 设置 x0 寄存器为 EL1 的入口地址
msr elr_el3, x0 // 将 EL1 的入口地址存入 ELR_EL3
eret // 执行 ELRET 指令,跳转到 EL1
el1_entry_func:
// Set up TRBE
MOV w0, #0
LDR x0, =TRBE_BASE_ADDRESS // BASE=0x90000000 Trace Buffer Base pointer address
MSR TRBBASER_EL1, x0
ARMv9:
mrs x0, sctlr_el3
orr x0, x0, #(0x1 << 28) // 设置 SCTLR_EL3 的 EE 位为 1
msr sctlr_el3, x0
mov x0, #(0x1 << 3) // 设置 HCR_EL2 的 RW 位为 1,使得 EL2 可以访问所有寄存器
msr hcr_el2, x0
mov x0, #(0x3 << 0) // 设置 CPTR_EL2 的 TFP、TCM、TWE 和 TCP 位为 0b1111,使得 EL2 可以访问所有 CP15 寄存器
msr cptr_el2, x0
mov x0, #(0x3 << 2) // 设置 SCR_EL3 的 RES1[2:0] 位为 0b011,即禁用 EL3 的访问权限检查
msr scr_el3, x0
adr x0, el1_entry_func // 设置 x0 寄存器为 EL1 的入口地址
msr elr_el3, x0 // 将 EL1 的入口地址存入 ELR_EL3
eret // 执行 ELRET 指令,跳转到 EL1
el1_entry_func:
// Set up TRBE
MOV w0, #0
LDR x0, =TRBE_BASE_ADDRESS // BASE=0x90000000 Trace Buffer Base pointer address
MSR TRBBASER_EL1, x0
armv8 架构中,SCTLR_ELx 寄存器是系统控制寄存器,用于控制系统的运行状态和特性。它包含了多个位域,每个位域控制某个特定的系统行为。以下是一些常见的位域及其功能:
armv9 架构中的 SCTRL_ELx 寄存器与armv8架构中的类似,但有一些新的位域,如:
总的来说,SCTLR_ELx 寄存器是非常重要的系统控制寄存器,它可以控制系统的运行模式、缓存的行为、对齐检查和异常的行为等。在系统的启动过程中,操作系统会初始化 SCTLR_ELx 寄存器的各个位域,以确保系统的正常运行。
ARMv9 中的 SCTLR_ELx 寄存器是系统控制寄存器,用于控制处理器的系统配置和行为。其中,x 可以是 0、1、2 或 3,分别代表 EL0、EL1、EL2 和 EL3。
下图为 SCTLR_EL1:
SCTLR_ELx 寄存器的具体功能和位定义如下:
SCTLR_ELx 寄存器中的一些位在不同的 EL 中具有不同的行为和意义。例如,EE 位在 EL1 和 EL2 中分别用于控制异常处理的字节顺序。
下图为 SCTLR_EL3:
在 armv9 架构中,SCTLR_EL3 寄存器还包含了tme和tmt bit位域,用于控制EL3级别的内存访问。它们的作用如下:
总的来说,tme和tmt bit位域的作用是控制EL3级别的内存访问的加密和隔离。在一些安全性要求较高的系统中,这些位域的设置可以提高系统的安全性和保护机密数据。
推荐查阅:ChatGPT