aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorClement Deschamps <clement.deschamps@greensocs.com>2019-11-11 13:44:16 +0000
committerPeter Maydell <peter.maydell@linaro.org>2019-11-11 13:44:16 +0000
commit45c078f163fd47c35e7505d98928fae63baada7d (patch)
tree4441671577a639ebb5e96d6d5731e92a739c963b /include
parent894d354fd834476ebc347cdd2706533b7cc761d5 (diff)
hw/arm/boot: Set NSACR.{CP11, CP10} in dummy SMC setup routinepull-target-arm-20191111
The boot.c code usually puts the CPU into NS mode directly when it is booting a kernel. Since fc1120a7f5f2d4b6 this has included a requirement to set NSACR to give NS state access to the FPU; we fixed that for the usual code path in ece628fcf6. However, it is also possible for a board model to request an alternative mode of booting, where its 'board_setup' code hook runs in Secure state and is responsible for doing the S->NS transition after it has done whatever work it must do in Secure state. In this situation the board_setup code now also needs to update NSACR. This affects all boards which set info->secure_board_setup, which is currently the 'raspi' and 'highbank' families. They both use the common arm_write_secure_board_setup_dummy_smc(). Set the NSACR CP11 and CP10 bits in the code written by that function, to allow FPU access in Non-Secure state when using dummy SMC setup routine. Otherwise an AArch32 kernel booted on the highbank or raspi boards will UNDEF as soon as it tries to use the FPU. Update the comment describing secure_board_setup to note the new requirements on users of it. This fixes a kernel panic when booting raspbian on raspi2. Successfully tested with: 2017-01-11-raspbian-jessie-lite.img 2018-11-13-raspbian-stretch-lite.img 2019-07-10-raspbian-buster-lite.img Fixes: fc1120a7f5 Signed-off-by: Clement Deschamps <clement.deschamps@greensocs.com> Tested-by: Laurent Bonnans <laurent.bonnans@here.com> Message-id: 20191104151137.81931-1-clement.deschamps@greensocs.com Reviewed-by: Peter Maydell <peter.maydell@linaro.org> [PMM: updated comment to boot.h to note new requirement on users of secure_board_setup; edited/rewrote commit message] Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'include')
-rw-r--r--include/hw/arm/boot.h7
1 files changed, 5 insertions, 2 deletions
diff --git a/include/hw/arm/boot.h b/include/hw/arm/boot.h
index 7f4d0ca7cd..ce2b48b88b 100644
--- a/include/hw/arm/boot.h
+++ b/include/hw/arm/boot.h
@@ -107,9 +107,12 @@ struct arm_boot_info {
void (*write_board_setup)(ARMCPU *cpu,
const struct arm_boot_info *info);
- /* If set, the board specific loader/setup blob will be run from secure
+ /*
+ * If set, the board specific loader/setup blob will be run from secure
* mode, regardless of secure_boot. The blob becomes responsible for
- * changing to non-secure state if implementing a non-secure boot
+ * changing to non-secure state if implementing a non-secure boot,
+ * including setting up EL3/Secure registers such as the NSACR as
+ * required by the Linux booting ABI before the switch to non-secure.
*/
bool secure_board_setup;