1

我想在裸金属皮质 A-15 上初始化 NEON cp。在遵循ARM 的指令后,我在平台初始化序列的末尾编写了这个序列:

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'.

如果我更改FPEXCFPSCR程序编译并且正在运行引发 unhandler 异常:

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

2 回答 2

3

可以在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邮件列表中所述,vmsr FPEXC 错误已在binutils 2.23 分支以及即将发布的 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处于活动状态的系统。

于 2013-10-09T19:51:35.530 回答
2

您需要从 git 更新 binutils。这个问题在今年早些时候的这个提交中得到了修复,但显然从那以后就没有发布过。或者,手动编码指令。

于 2013-10-07T18:14:17.993 回答