arm: Enable the VFP
PATCH v3 1/1 arm: Enable the VFP
Variable argument macros frequently depend on floating point registers. Indeed we needed to enable the VFP for arm64 since its introduction in order to use printf and the like. Somehow we didn't need to do that for arm32 until recently when compiling with GCC 9.
Tested-by Thomas Huth <[email protected]>
Signed-off-by Andrew Jones <[email protected]>
---
v3: Added Thomas' t-b and suggested .gitlab-ci.yml change.
v2: Added '-mfpu=vfp' cflag to deal with older compilers
.gitlab-ci.yml | 2 +- arm/Makefile.arm | 2 +- arm/cstart.S | 14 +++++++++++++- 3 files changed, 15 insertions(+), 3 deletions(-)
.gitlab-ci.yml +1 -1
@@ -17,7 +17,7 @@ build-aarch64: build-arm: script: - - dnf install -y qemu-system-arm gcc-arm-linux-gnu-8.2.1-1.fc30.2 + - dnf install -y qemu-system-arm gcc-arm-linux-gnu - ./configure --arch=arm --cross-prefix=arm-linux-gnu- - make -j2 - ACCEL=tcg ./run_tests.sh
arm/Makefile.arm +1 -1
@@ -5,7 +5,7 @@ # bits = 32 ldarch = elf32-littlearm -machine = -marm +machine = -marm -mfpu=vfp # stack.o relies on frame pointers. KEEP_FRAME_POINTER := y
arm/cstart.S +13 -1
@@ -50,10 +50,11 @@ start: mov r0, r2 push {r0-r1} - /* set up vector table and mode stacks */ + /* set up vector table, mode stacks, and enable the VFP */ mov r0, lr @ lr is stack top (see above), @ which is the exception stacks base bl exceptions_init + bl enable_vfp /* complete setup */ pop {r0-r1}
@@ -100,6 +101,16 @@ exceptions_init: isb mov pc, lr +enable_vfp: + /* Enable full access to CP10 and CP11: */ + mov r0, #(3 << 22 | 3 << 20) + mcr p15, 0, r0, c1, c0, 2 + isb + /* Set the FPEXC.EN bit to enable Advanced SIMD and VFP: */ + mov r0, #(1 << 30) + vmsr fpexc, r0 + mov pc, lr + .text .global get_mmu_off
@@ -130,6 +141,7 @@ secondary_entry: ldr r0, [r1] mov sp, r0 bl exceptions_init + bl enable_vfp /* finish init in C code */ bl secondary_cinit
Signature · 1 line
2.21.0