【问题标题】:Change ARM Mode to System Mode (CPSR) on ARMv8-A在 ARMv8-A 上将 ARM 模式更改为系统模式 (CPSR)
【发布时间】:2017-12-19 19:41:40
【问题描述】:

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

【问题讨论】:

  • 这是什么芯片,在你尝试之前你处于什么模式? (和执行级别)
  • @old_timer SoC 是 BCM 2837。在 Aarch32 模式下使用 Raspberry Pi 3。异常级别并不为人所知,但我能够从 CPSR 获得 M 位 [4:0]。不幸的是,这些位的输出没有任何意义。结果是 0b00101,据我所知,它与任何模式都没有关联。
  • 您是否在没有 config.txt 的情况下进行引导?并得到你所得到的?
  • @old_timer 我们正在使用 config.txt,它看起来像:“device_tree=”(未设置值默认为我们正在使用的 atags)。据我所知,不需要在 config.txt 中输入与我的问题相关的任何内容,但如果我错了,请纠正我。
  • 当然有一个问题,你为什么要进入svc模式,hyp模式让一些事情变得更容易,但当然取决于你想要做什么......

标签: assembly arm processor


【解决方案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 为 arm 放置的引导代码会“分类”内核并让内核 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:

所以你不会让他们四个几乎并行运行相同的代码......

【讨论】:

  • 如果您只是添加对裸机工作可能感兴趣或可能不感兴趣的设备树内容,那么只会将数据放在 arm 地址空间中的偏移量 0x100 处,并且您可能仍会在 0x8000 处启动64 位模式我认为是 0x80000 没有 kernel_old=1。
  • 这段代码会让你在 pi2 和 pi3 上进入 svc 模式,如果我感到困惑并且这不是你想要做的,那么请忽略。
  • 我在我的程序中首先运行此代码(在向量表上进行分支,然后首先执行此操作)。如果您执行 kernel_old 操作,那么您将在 svc 模式下启动,但使用 Broadcom 芯片和/或 gpu 启动 arm,您会同时使所有四个内核退出复位。如果你不做 kernel_old 的事情,那么在过去的近一年里,gpu 引导加载程序一直将 arm 置于 hyp 模式,所以你必须做一个或另一个才能进入 svc 模式。
  • 我假设您可以将 orr r0,r0,#0x13 更改为直接进入系统模式而不是 svc 模式,因为那是该行正在执行的操作。
  • no 上面的 bic 指令使用 0x1F 使低 5 位为零,然后 0x13 的 orr 使低 5 位 0x13。但是如果你想设置所有五个低位,你不需要先清除它们,你不需要 bic 0x1F 你可以只使用 orr 0x1f 并设置所有它们......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-25
  • 1970-01-01
  • 2018-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多