[PATCH v2] armv8: Handle EL2 Host mode

Mark Kettenis mark.kettenis at xs4all.nl
Sun Jan 31 18:07:28 CET 2021


> Date: Sun, 31 Jan 2021 16:29:21 +0000
> From: Andre Przywara <andre.przywara at arm.com>
> 
> On Sat, 30 Jan 2021 22:31:06 +0100
> Mark Kettenis <kettenis at openbsd.org> wrote:
> 
> Hi,
> 
> > 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 <kettenis at openbsd.org>
> 
> Reviewed-by: Andre Przywara <andre.przywara at arm.com>
> 
> So architecturally this is correct, but I was wondering why you would
> actually need this? I gave this a quick spin in QEMU (-cpu max),
> hacking E2H to 1 very early in start.S. However loading and executing
> the Linux kernel was fine even without this patch, so did you observe
> an actual problem? Any kernel entered in EL2 would probably take care of
> the E2H bit and CPTR itself (Linux sets E2H, FreeBSD clears it), so
> is (your?) U-Boot actually using SIMD or VFP instructions itself?

Not explicitly.  The problem I ran into was that snprintf() was trying
to save q0-q7 to the stack.  Compiling with -mgeneral-regs-only fixed
that issue, but since armv8/start.S explicitly enables the FPU I
concluded that someone deliberately chose to allow for SIMD and VFP in
U-Boot.

If we were to revisit that decision, we could save a few bytes I guess...

Cheers,

Mark

> > ---
> > 
> > v2: rename label
> > 
> >  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..979dcfef35 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_vhe		/* HCR_EL2.E2H */
> >  	mov	x0, #0x33ff
> >  	msr	cptr_el2, x0			/* Enable FP/SIMD */
> >  	b	0f
> > +el2_vhe:
> > +	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 */
> 
> 


More information about the U-Boot mailing list