aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNiek Linnenbank <nieklinnenbank@gmail.com>2019-12-02 22:09:43 +0100
committerPeter Maydell <peter.maydell@linaro.org>2019-12-16 10:46:35 +0000
commit0c7f8c43daf6556078e51de98aa13f069e505985 (patch)
tree97b00fa5515242f18014587812523f3537537d9d
parentf96f3d5f09973ef40f164cf2d5fd98ce5498b82a (diff)
downloadqemu-0c7f8c43daf6556078e51de98aa13f069e505985.zip
qemu-0c7f8c43daf6556078e51de98aa13f069e505985.tar.gz
qemu-0c7f8c43daf6556078e51de98aa13f069e505985.tar.bz2
arm/arm-powerctl: set NSACR.{CP11, CP10} bits in arm_set_cpu_on()
This change ensures that the FPU can be accessed in Non-Secure mode when the CPU core is reset using the arm_set_cpu_on() function call. The NSACR.{CP11,CP10} bits define the exception level required to access the FPU in Non-Secure mode. Without these bits set, the CPU will give an undefined exception trap on the first FPU access for the secondary cores under Linux. This is necessary because in this power-control codepath QEMU is effectively emulating a bit of EL3 firmware, and has to set the CPU up as the EL3 firmware would. Fixes: fc1120a7f5 Cc: qemu-stable@nongnu.org Signed-off-by: Niek Linnenbank <nieklinnenbank@gmail.com> [PMM: added clarifying para to commit message] Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
-rw-r--r--target/arm/arm-powerctl.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/target/arm/arm-powerctl.c b/target/arm/arm-powerctl.c
index f77a950..b064513 100644
--- a/target/arm/arm-powerctl.c
+++ b/target/arm/arm-powerctl.c
@@ -104,6 +104,9 @@ static void arm_set_cpu_on_async_work(CPUState *target_cpu_state,
/* Processor is not in secure mode */
target_cpu->env.cp15.scr_el3 |= SCR_NS;
+ /* Set NSACR.{CP11,CP10} so NS can access the FPU */
+ target_cpu->env.cp15.nsacr |= 3 << 10;
+
/*
* If QEMU is providing the equivalent of EL3 firmware, then we need
* to make sure a CPU targeting EL2 comes out of reset with a