首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在内核模块中使用'dccmvac‘时出现汇编程序错误

在内核模块中使用'dccmvac‘时出现汇编程序错误
EN

Stack Overflow用户
提问于 2020-07-30 08:54:05
回答 1查看 105关注 0票数 0

当我试图在Raspberry Pi 3B+ (ARMv8a,AARCH32)上编译内核模块中的以下代码时,我得到了一个“错误指令”错误。根据ARMv8a的ARM参考手册,此指令在AARCH32的异常级别0 (EL0)中未定义,但我在内核模块中使用它,因此我不理解该问题。

代码语言:javascript
复制
__asm(
"mov r9,%0 \n\t"
"mov r10,%1 \n\t"
"mov r1,#0 \n\t
"str r1,[r9] \n\t"
"str r1,[r10] \n\t"
"DCCMVAC r9 \n\t"
"DCCMVAC r10 \n\t"
:
:"r" (firstPtr),
 "r" (secondPtr)
:"r1","r9","r10","memory"
);

与组件相关的消息如下,

代码语言:javascript
复制
/tmp/ccCmW5TY.s: Assembler messages:
/tmp/ccCmW5TY.s:221: Error: bad instruction `dccmvac r9'
/tmp/ccCmW5TY.s:222: Error: bad instruction `dccmvac r10'
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-30 10:15:34

GNU as可能无法识别DCCMVAC指令:根据Arm文档,DCCMVAC指令是通过在CP15协处理器上执行操作来执行的:

代码语言:javascript
复制
MCR{<c>}{<q>} <coproc>, {#}<opc1>, <Rt>, <CRn>, <CRm>{, {#}<opc2>} 
with the following values:
coproc  opc1    CRn     CRm     opc2
0b1111  0b000   0b0111  0b1010  0b001

在文件CMSIS/Core_A/Include/cmsis_gcc.hCMSIS/Core_A/Include/cmsis_cp15.h中,CMSIS_5项目中有一个实现,其形式为以下定义/函数/宏。

我们可以重用一些代码来构建示例程序dccmvac.c

代码语言:javascript
复制
#include <stdint.h>
  
#define __ASM                                  __asm
#define __set_CP(cp, op1, Rt, CRn, CRm, op2) __ASM volatile("MCR p" # cp ", " # op1 ", %0, c" # CRn ", c" # CRm ", " # op2 : : "r" (Rt) : "memory" )
#define __STATIC_FORCEINLINE                   __attribute__((always_inline)) static inline

/** \brief  Set DCCMVAC
    
  Data cache clean
 */
__STATIC_FORCEINLINE void __set_DCCMVAC(uint32_t value)
{
  __set_CP(15, 0, value, 7, 10, 1);
}

int main()
{
  __set_DCCMVAC(0x12345678U);

  return 0;
}


/opt/arm/9/gcc-arm-9.2-2019.12-x86_64-arm-none-eabi/bin/arm-none-eabi-gcc -c -o dccmvac.o dccmvac.c
/opt/arm/9/gcc-arm-9.2-2019.12-x86_64-arm-none-eabi/bin/arm-none-eabi-objdump -D  dccmvac.o



dccmvac.o:     file format elf32-littlearm


Disassembly of section .text:

00000000 <main>:
   0:   e52db004        push    {fp}            ; (str fp, [sp, #-4]!)
   4:   e28db000        add     fp, sp, #0
   8:   e24dd00c        sub     sp, sp, #12
   c:   e59f3020        ldr     r3, [pc, #32]   ; 34 <main+0x34>
  10:   e50b3008        str     r3, [fp, #-8]
  14:   e51b3008        ldr     r3, [fp, #-8]
  18:   ee073f3a        mcr     15, 0, r3, cr7, cr10, {1}
  1c:   e1a00000        nop                     ; (mov r0, r0)
  20:   e3a03000        mov     r3, #0
  24:   e1a00003        mov     r0, r3
  28:   e28bd000        add     sp, fp, #0
  2c:   e49db004        pop     {fp}            ; (ldr fp, [sp], #4)
  30:   e12fff1e        bx      lr
  34:   12345678        eorsne  r5, r4, #120, 12        ; 0x7800000

在执行mcr 15, 0, r3, cr7, cr10, {1}之前,正在将值0x123456781加载到r3中。

使用shell-storm反汇编0xee073f3a可以实现:

0x0000000000000000: EE 07 3F 3A mcr p15, #0, r3, c7, c10, #1

现在,您应该已经掌握了在代码中使用DCCMVAC指令所需的信息--只需记住,Arm CMSIS_5代码是在Apache-2.0许可下获得许可的,因此不能简单地复制/粘贴到内核模块中-您可能应该改用arch/arm/mm/cache-v7m.S中定义的Linux dccmvac宏,或者编写您自己的等效代码。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63164575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档