【ARMv8/v9 异常模型入门及渐进2 - 系统控制寄存器 SCTRL_ELx 介绍】

文章目录

    • SCTRL_ELx 介绍背景
    • ARMv8 SCTLR_ELx 介绍
    • ARMv9 SCTLR_ELx 介绍

SCTRL_ELx 介绍背景

由于在做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 介绍

armv8 架构中,SCTLR_ELx 寄存器是系统控制寄存器,用于控制系统的运行状态和特性。它包含了多个位域,每个位域控制某个特定的系统行为。以下是一些常见的位域及其功能:

  • M: 控制系统的运行模式,0表示使用AArch32模式,1表示使用AArch64模式。
  • C: 控制缓存的使能和行为。
  • I: 控制指令缓存的使能和行为。
  • A: 控制对齐检查的行为。
  • D: 控制数据缓存的使能和行为。
  • Z: 控制EL0使用的异常向量表。

armv9 架构中的 SCTRL_ELx 寄存器与armv8架构中的类似,但有一些新的位域,如:

  • EE: 控制异常的使能和行为。
  • UCE: 控制对未缓存的内存的访问。
  • FPE: 控制浮点异常的行为。
  • E0E: 控制EL0的异常向量表。
  • EAE: 控制对齐检查的行为。
  • WXN: 控制可执行代码的写保护。

总的来说,SCTLR_ELx 寄存器是非常重要的系统控制寄存器,它可以控制系统的运行模式、缓存的行为、对齐检查和异常的行为等。在系统的启动过程中,操作系统会初始化 SCTLR_ELx 寄存器的各个位域,以确保系统的正常运行。

ARMv9 SCTLR_ELx 介绍

ARMv9 中的 SCTLR_ELx 寄存器是系统控制寄存器,用于控制处理器的系统配置和行为。其中,x 可以是 0、1、2 或 3,分别代表 EL0、EL1、EL2 和 EL3。

下图为 SCTLR_EL1:
【ARMv8/v9 异常模型入门及渐进2 - 系统控制寄存器 SCTRL_ELx 介绍】_第1张图片
SCTLR_ELx 寄存器的具体功能和位定义如下:

  • M: MMU Enable bit。当该位为 1 时,启用 MMU。
  • A: Alignment check enable bit。当该位为 1 时,启用地址对齐检查。
  • C: Cache enable bit。当该位为 1 时,启用数据和指令缓存。
  • SA0: Stack Alignment Check for EL0. 当该位为 1 时,启用 EL0 栈的地址对齐检查。
  • SA: Stack Alignment Check bit。当该位为 1 时,启用所有栈的地址对齐检查。
  • CPAC: Coprocessor Access Control。用于控制协处理器的访问权限。
  • I: Instruction cache enable bit。当该位为 1 时,启用指令缓存。
  • D: Data cache enable bit。当该位为 1 时,启用数据缓存。
  • UCI: User Cache Inhibit。当该位为 1 时,禁用用户空间的缓存。
  • EE: Exception Endianness。当该位为 1 时,异常处理使用大端模式。
  • E0E: Endianness of EL0。当该位为 1 时,EL0 使用大端模式。
  • WxN: Write permission implies XN. 当该位为 1 时,写权限也意味着禁用执行权限。
  • WXN: Write permission implies Execute Never。当该位为 1 时,写权限也意味着禁用执行权限。
  • nTWE: Not trap WFE。当该位为 1 时,WFE 指令不会陷入到睡眠状态。
  • nTWI: Not trap WFI。当该位为 1 时,WFI 指令不会陷入到睡眠状态。
  • UCT: User Cache Type。用于控制用户空间的缓存类型。
  • nTLSMD: Not trap Load/Store Multiple Decrement。当该位为 1 时,LDM 和 STM 指令不会陷入到睡眠状态。
  • nTLE: Not trap Little-endian。当该位为 1 时,处理器不会陷入到睡眠状态,即使在小端模式下。
  • EE_LITTLE: Exception Endianness Little-endian。当该位为 1 时,异常处理使用小端模式。
  • SPINTMASK 位域控制了EL1级别的中断控制器(GIC)的中断屏蔽。当spintmask被设置为1时,GIC中断被屏蔽,当spiintmask被设置为0时,GIC中断被开启。
  • NMI bit位域控制了EL1级别的非屏蔽中断(NMI)的行为。当nmi bit被设置为1时,NMI被屏蔽,当nmi bit被设置为0时,NMI被开启。

SCTLR_ELx 寄存器中的一些位在不同的 EL 中具有不同的行为和意义。例如,EE 位在 EL1 和 EL2 中分别用于控制异常处理的字节顺序。
下图为 SCTLR_EL3:
【ARMv8/v9 异常模型入门及渐进2 - 系统控制寄存器 SCTRL_ELx 介绍】_第2张图片
在 armv9 架构中,SCTLR_EL3 寄存器还包含了tme和tmt bit位域,用于控制EL3级别的内存访问。它们的作用如下:

  • tme 位域控制了EL3级别的内存加密(Transparent Memory Encryption)的使能。当tme被设置为1时,EL3级别的内存访问将被加密,当tme被设置为0时,EL3级别的内存访问将不被加密。
  • tmt bit位域控制了EL3级别的内存隔离(Transparent Memory Tagging)的使能。当tmt bit被设置为1时,EL3级别的内存访问将被隔离,当tmt bit被设置为0时,EL3级别的内存访问将不被隔离。

总的来说,tme和tmt bit位域的作用是控制EL3级别的内存访问的加密和隔离。在一些安全性要求较高的系统中,这些位域的设置可以提高系统的安全性和保护机密数据。

推荐查阅:ChatGPT

你可能感兴趣的:(#,ARM,System,Exception,java,开发语言)