Включить неон на ARM cortex-a series

Хочу инициализировать на голом железе кору А-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'.

Если я изменю FPEXC на FPSCR, программа скомпилируется и возникнет исключение обработчика повышения уровня:

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

person 0x90    schedule 07.10.2013    source источник
comment
@artlessnoise есть идеи, почему MRC p15, 4, r0, c1, c1, 2 вызывает исключение и меняет режим на Undefined в Регистрация CPSR? Я запускаю приведенный выше код сборки как Supervisor.   -  person 0x90    schedule 07.10.2013
comment
@artlessnoise, это то, что ARM претензии   -  person 0x90    schedule 08.10.2013
comment
Я думаю, вам нужно MRC p15, 0, r0, c1, c1, 2; нет 4. Это число важно. Вы прочитали Использование Advanced SIMD и VFP в режиме Hyp; Вы не используете расширения виртуализации? Кроме того, я не думаю, что вам это нужно, если вы не используете TrustZone.   -  person artless noise    schedule 08.10.2013
comment
@artlessnoise, можете ли вы опубликовать ответ с полной последовательностью?   -  person 0x90    schedule 08.10.2013
comment
eee8Ra10, где R — регистр.   -  person 0x90    schedule 08.10.2013


Ответы (2)


Последовательность инициализации VFPU можно найти в u-boot источник.

.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 list, исправлена ​​ошибка vmsr FPEXC в файле binutils ветвь 2.23, а также HEAD и ветка разработки 2.24, которые будут выпущены в ближайшее время. Исправления существуют в версиях 2.23.1 и 2.23.2 binutils.

Вот пример сеанса,

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

person Community    schedule 09.10.2013

Вам нужно обновить binutils из git. Эта проблема была исправлена ​​ранее в этом году в этот коммит, но, по-видимому, с тех пор релизов не было. Либо закодируйте инструкцию вручную.

person Jester    schedule 07.10.2013
comment
@Jake'Alquimista'LEE binutils не gcc. Кто бы ни проголосовал, не хочешь объяснить? - person Jester; 07.10.2013
comment
@artlessnoise Ладно, поверю тебе на слово. Коммит, который я нашел, датирован более поздней версией 2.23, и я еще не вижу релиза 2.24 (без тегов). - person Jester; 08.10.2013
comment
Я понимаю. Я должен был вернуться еще, я только что нашел самое последнее изменение и предположил, что это было первое исправление. - person Jester; 08.10.2013
comment
@Jester Я не тот, кто проголосовал за твой ответ. Я голосую за это прямо сейчас. Вы заслужили это своим ответом :) - person Jake 'Alquimista' LEE; 08.10.2013