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

时间:2017-07-14 16:14:18

标签: assembly arm processor

我在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

1 个答案:

答案 0 :(得分:1)

对于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

在树莓派网站上的裸金属论坛上有很多人,这个主题有不同的变化。与旧时代不同,你不能在HYP模式下改变cpsr一次,但是如果你看一下eret指令它接受一个新的cpsr以及分支(需要一个新的lr来提供给pc)并不是真正的回报而是改变cpsr的方法。这就是我所知道的裸金属人员正在做的事情。

这里当然需要进行这些工作,并且它们恰好与pi一起工作。

如果你有一个config.txt,那么你需要小心一点,GPU为手臂“放置”核心的引导代码,让核心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:

所以你没有让他们四个人几乎并行地运行相同的代码......