我想初始化一个裸机皮质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
答案 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 活动的系统。