在 ARMv8-A 上将 ARM 模式更改为系统模式 (CPSR)

Change ARM Mode to System Mode (CPSR) on ARMv8-A

我在 32 位模式下使用 ARM Cortex A53(4 核)处理器(ARMv8 架构)。我需要使用这条指令进入系统模式:

cpsid if, #0x1F

但是这条指令,cps,让我的系统崩溃了。在 ARM1176JZF-S(ARMv6 架构)上,这条线完美无缺。我调查了一下,它似乎与低权限级别有关,但 svc 指令并没有像我想象的那样解决问题。我需要做什么才能在这个架构中完成系统模式?

控制位来源: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0344i/ch02s14s08.html

这是我从中获取 CPS 信息的地方(在更改系统模式时): http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dai0527a/index.html

我的 pi2 和 pi3 退出 hyp 模式的代码(假设 sd 卡上没有 config.txt):

mrs r0,cpsr
bic r0,r0,#0x1F
orr r0,r0,#0x13
msr spsr_cxsf,r0
add r0,pc,#4
msr ELR_hyp,r0
eret

raspberry pi 站点上的 baremetal 论坛上有很多人,这个主题也有变体。与过去的美好时光不同,您不能在 HYP 模式下只更改一次 cpsr,但是如果您查看 eret 指令,它会接受一个新的 cpsr 以及分支(需要一个新的 lr 来提供给 pc)并不是真正的 return 但是一种改变 cpsr 的方法。这就是我认识的裸机用户的做法。

这里当然需要一些假设才能使这项工作正常进行,而且它们恰好与 pi 一起工作。

如果你有 config.txt 那么你需要小心一点,GPU 为 arm "sorts" 核心放置的 bootstrap 代码也让核心 0 通过将它们全部置于 HYP 模式。 (pi2 和 pi3),如果你选择打败它:

kernel_old=1
disable_commandline_tags=1

那么就由你来对核心进行排序了

    mrs x0,mpidr_el1
    mov x1,#0xC1000000
    bic x1,x0,x1
    cbz x1,zero
not_zero:
    wfi
    b not_zero
zero:

所以你没有所有四个 运行 几乎并行的相同代码...