On implementations that support VHE, the layout of the CPTR_EL2 register depends on whether HCR_EL2.E2H is set. Check this bit and and set the aprropriate bits to enable access to the FP/SIMD registers. This allows U-Boot to run on systems that pass control to U-Boot in EL2 with EL2 Host mode enabled such as machine with Apple's M1 SoC.
Signed-off-by: Mark Kettenis <kette...@openbsd.org> --- arch/arm/cpu/armv8/start.S | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/arch/arm/cpu/armv8/start.S b/arch/arm/cpu/armv8/start.S index 662449156b..a259717e67 100644 --- a/arch/arm/cpu/armv8/start.S +++ b/arch/arm/cpu/armv8/start.S @@ -133,9 +133,15 @@ pie_fixup_done: #endif b 0f 2: set_vbar vbar_el2, x0 + mrs x0, hcr_el2 + tbnz x0, #34, el2_host /* HCR_EL2.E2H */ mov x0, #0x33ff msr cptr_el2, x0 /* Enable FP/SIMD */ b 0f +el2_host: + mov x0, #3 << 20 + msr cptr_el2, x0 /* Enable FP/SIMD */ + b 0f 1: set_vbar vbar_el1, x0 mov x0, #3 << 20 msr cpacr_el1, x0 /* Enable FP/SIMD */ -- 2.30.0