【问题标题】:MCR and MRC does not exist on AARCH64?AARCH64 上不存在 MCR 和 MRC?
【发布时间】:2015-09-03 11:39:41
【问题描述】:

我正在尝试基于 Board 在 AARCH64 上编译“mrc”和“mcr”指令,但我看到以下错误消息

   tmp/ccqOHmrK.s: Assembler messages:
  /tmp/ccqOHmrK.s:43: Error: unknown mnemonic `mrc' -- `mrc p15,0,x0,c14,c3,1'
  /tmp/ccqOHmrK.s:53: Error: unknown mnemonic `mrc' -- `mrc p15,0,x2,c14,c3,0'

我尝试查看内核源代码 /arch/arm64,但没有在没有仿真的情况下使用 mcr&&mrc。

是语法问题吗?

【问题讨论】:

    标签: assembly linux-kernel arm64


    【解决方案1】:

    您应该将这些替换为适当的msr 说明。 例如,arch/arm/include/asm/arch_timer.h 有:

    case ARCH_TIMER_REG_CTRL:
        asm volatile("mcr p15, 0, %0, c14, c3, 1" : : "r" (val));
    

    arch/arm64/include/asm/arch_timer.h 中的对应项有:

    case ARCH_TIMER_REG_CTRL:
        asm volatile("msr cntv_ctl_el0,  %0" : : "r" (val));
    

    【讨论】:

    • 好的,谢谢。但我可以从你那里知道,MCR/MRC 在 ARMv8 中是否已弃用?
    • 它们当然没有在指令集文档中列出,汇编器也不知道它们,所以我会说它们不存在。
    • 链接无效。
    • 幸运的是,我将代码复制到了答案中。链接仅供参考。无论如何,更新了它们,但不知道它们能保持稳定多久。谢谢。
    【解决方案2】:

    MCRMRC 在 ARMv8 中不存在。

    在 ARMv7-A 中,系统寄存器通常通过协处理器 15 (CP15) 操作访问,并使用 MCRMRC 访问。但是,AArch64 不支持协处理器。

    在 AArch64 中,系统配置通过系统寄存器控制,并使用 MSRMRS 指令访问。

    如果要访问系统寄存器,可以参考 Arm 架构参考手册。例如,D13.4.15 中的 PMSELR_EL0

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-03
      • 2011-05-24
      • 2013-11-01
      • 2012-02-24
      • 2014-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多