在ARM cortex-a系列上启用霓虹灯

时间:2013-10-07 17:36:37

标签: assembly arm neon bare-metal cortex-a

我想初始化一个裸机皮质A-15 NEON cp。在跟随ARM's directives后,我在我的平台init序列的末尾写了这个序列:

MOV r0, #0x00F00000
MRC p15, 0, r0, c1, c1, 2
ORR r0, r0, #0x0C00 
BIC r0, r0, #0xC000 
MCR p15, 0, r0, c1, c1, 2
ISB
MRC p15, 4, r0, c1, c1, 2
BIC r0, r0,  #0x0C00
BIC r0, r0, #(3<<14)
MCR p15, 4, r0, c1, c1, 2
ISB
MOV r3, #0x40000000
VMSR FPEXC, r3

我收到此错误:

Error: operand 0 must be FPSCR -- `vmsr FPEXC,r3'

我正在使用arm-eabi-as --version

GNU assembler (GNU Binutils) 2.21
Copyright 2010 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or later.
This program has absolutely no warranty.
This assembler was configured for a target of `arm-eabi'.

如果我将FPEXC更改为FPSCR,则程序将编译并且正在运行的引发unhandler异常:

MRC p15, 4, r0, c1, c1, 2

2 个答案:

答案 0 :(得分:2)

你需要从git更新binutils。这个问题已于今年早些时候在this commit修复,但显然自那时以来一直没有发布。 或者,手动编码指令。

答案 1 :(得分:2)

可以在u-boot source中找到初始化VFPU的序列。

.macro init_vfpu
  ldr r0, =(0xF << 20)
  mcr p15, 0, r0, c1, c0, 2
  mov r3, #0x40000000
  .long 0xeee83a10
  /* vmsr FPEXC, r3 */
.endm /* init_vfpu */

binutils mailing list中所述, vmsr FPEXC错误已修复在 binutils 2.23 branch以及HEAD和2.24中开发部门即将发布。修复程序存在于 binutils 的2.23.1和2.23.2版本中。

以下是示例会话

$ cat t.S
init_vpu:
  ldr r0, =(0xF << 20)
  mcr p15, 0, r0, c1, c0, 2
  mov r3, #0x40000000
  vmsr FPEXC, r3
  bx  lr
  .ltorg
$ arm-none-linux-gnueabi-as -march=armv7-a -mcpu=cortex-a15 -mfpu=neon t.S -o t.o
$ arm-none-linux-gnueabi-as --version | grep assembler
GNU assembler (crosstool-NG hg+default-86a8d1d467c8) 2.23.1
This assembler was configured for a target of `arm-none-linux-gnueabi'.
$ objdump --version | grep Binutils
GNU objdump (GNU Binutils for Ubuntu) 2.23.2
$ objdump -S t.o 

t.o:     file format elf32-littlearm

Disassembly of section .text:

00000000 <init_vpu>:
   0:   e3a0060f        mov     r0, #15728640   ; 0xf00000
   4:   ee010f50        mcr     15, 0, r0, cr1, cr0, {2}
   8:   e3a03101        mov     r3, #1073741824 ; 0x40000000
   c:   eee83a10        vmsr    fpexc, r3
  10:   e12fff1e        bx      lr

以上序列适用于所有 Cortex-A 系列。该序列适用于没有虚拟化 TrustZone 活动的系统。