为什么EL1配置需要设置堆栈指针?

问题描述 投票:0回答:1

我正在研究树莓派的一些裸机代码,特别是用于 QEMU 模拟的代码。它从EL3下降到EL1,但是为什么需要从EL2为EL1配置设置sp_el1,并在EL1中再次设置sp?如果我删除代码中的任何两个 sp 分配,它就不会产生中断。 谢谢你的帮助😀

raspberry-pi arm qemu bare-metal
1个回答
0
投票

在AArch64架构中,有四个物理堆栈指针寄存器:SP_EL0、SP_EL1、SP_EL2和SP_EL3。当在 EL0 处执行时,当前使用的堆栈指针“SP”寄存器始终为 SP_EL0。在较高的异常级别,有一个状态位 PSTATE.SPSel 定义“SP”是什么:

  • 如果 SPSel 为 1,则执行将使用该异常级别的 SP_ELx
  • 如果 SPSel 为 0,则使用 SP_EL0。

SPSel 可以由 MSR 直接设置,但也可以在异常返回时根据 SPSR_ELx 中的值设置。复位时,SPSel 为 1。

在您的代码中,EL2 处的代码设置 SP_EL1,但当它下降到 EL1 时,它使用选择“EL1t”的 SPSR_EL2 值,这意味着“EL1,使用 SP_EL0”(与 EL1h 相反)。因此,当 EL1 运行时,它正在使用尚未被任何人初始化的 SP_EL0。 “mov sp, x1”正在初始化 SP_EL0。

当你对EL1进行中断时,CPU将转到EL1h,这就是为什么需要设置SP_EL1以及SP_EL0。

© www.soinside.com 2019 - 2024. All rights reserved.