在内核启动期间检查 ARM 是否处于管理模式或中断模式

Checking if ARM is in supervisor mode or interrupt mode during kernel bootup

我必须检查 ARM 处理器在内核启动期间是否处于 SVC 或 IRQ 模式。也就是说,我想在中断启用之前和中断启用之后插入一些代码以将 ARM 模式检查到 start_kernel() 函数中。

我知道我需要 SPSRCPSR 值(位)来检查 ARM 中的模式,但我该如何编写start_kernel 函数中的代码,因为读取 CPSR/SPSR 位的代码在汇编中?在启动期间检查 ARM 模式的汇编代码放在哪里?有什么方法可以转储 SPSR/CPSR 值吗?

我不敢想象为什么这应该是一个问题,但幸运的是有一个简单的答案:

处于SVC模式

very first thing* the kernel entrypoint does is to forcibly switch into SVC mode and mask interrupts。要在稍后以 start_kernel 方式访问 C 代码时以某种方式处于错误模式,将需要系统以难以想象的方式严重损坏。我能想到的唯一可能的方法是,如果有一些安全固件 运行 异步(例如,关闭安全定时器中断)故意破坏非安全状态,这太荒谬了。

* 好吧,第二件事如果内核是用 KVM 支持构建的并且进入 HYP,但是嘿...

在启动后,ARM 处理器处于安全 SVC 模式,在此模式下,您可以访问 CPSR 寄存器(前 6 位)以检查处于哪种模式,但是当内核运行时,您处于用户非安全模式并且此模式不安全,您无法访问 CPSR 和 SPSR 寄存器以及 copro 15 寄存器。

唯一的方法是编写生成异常的代码以切换监控模式“使用 SMC assebmbly 指令”以跳转到监控安全模式,然后在该模式下重置 "NS" 位以切换到非-secure 然后你生成另一个异常来切换 SVC 模式(SVC 指令汇编调用)现在你处于主管安全模式,然后你可以访问 CPSR 和 SPSR 寄存器