[U-Boot] [PATCH v2 2/3] arm: armv7: allow unaligned memory access

Leif Lindholm leif.lindholm at linaro.org
Wed Apr 4 16:26:26 UTC 2018


On Wed, Apr 04, 2018 at 11:46:45AM +0200, Alexander Graf wrote:
> On 03.04.18 21:59, Heinrich Schuchardt wrote:
> > The UEFI spec mandates that unaligned memory access should be enabled if
> > supported by the CPU architecture.
> > 
> > This patch implements the function unaligned_access() to reset the aligned
> > access flag in the system control register (SCTLR). It is called when the
> > bootefi command is invoked.
> > 
> > Signed-off-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
> 
> This will not work unfortunately. Unaligned accesses are only handled by
> hardware on armv7 (and armv8) when the underlying memory is mapped as
> cached. Given the extremely wild situation on armv7 for page table
> setups, I'm not terribly confident to give anyone even the slightest
> hint that unaligned accesses would work on armv7.

Then having RAM mapped as Normal (not necessarily cacheable) should be
an automatic prerequisite for CONFIG_EFI, and if possible we should
write scary error messages to the console if this is not the case.

> IMHO we should really update the UEFI spec and mandate that all memory
> accesses have to be aligned on armv7.

Changing ABIs in backwards-incompatible ways is the opposite of what
UEFI is for.

> It's what grub is doing today already:
> 
>   http://git.savannah.gnu.org/cgit/grub.git/tree/configure.ac#n1279

Don't read too much into that. That comes for three reasons:
1) The U-boot API port.
2) Support for pre-v7 devices (like raspberry pi 1).
3) The wild changes in toolchain behaviour seen between
   various releases between gcc ~4.5 and gcc5.

There is no reason for that to be used for the arm-efi target, it's
just pure laziness on my behalf not to have changed it when the
arm-efi port was added.

> My recommendation would be to just pass the same compiler flags to iPXE
> on armv7.

Please don't.

/
    Leif

> 
> Alex
> 
> > ---
> >  arch/arm/cpu/armv7/Makefile |  4 ++++
> >  arch/arm/cpu/armv7/sctlr.S  | 23 +++++++++++++++++++++++
> >  2 files changed, 27 insertions(+)
> >  create mode 100644 arch/arm/cpu/armv7/sctlr.S
> > 
> > diff --git a/arch/arm/cpu/armv7/Makefile b/arch/arm/cpu/armv7/Makefile
> > index b14ee54519..cdb56e490b 100644
> > --- a/arch/arm/cpu/armv7/Makefile
> > +++ b/arch/arm/cpu/armv7/Makefile
> > @@ -12,6 +12,10 @@ obj-y	+= cache_v7.o cache_v7_asm.o
> >  obj-y	+= cpu.o cp15.o
> >  obj-y	+= syslib.o
> >  
> > +ifneq ($(CONFIG_SPL_BUILD),y)
> > +obj-$(CONFIG_EFI_LOADER) += sctlr.o
> > +endif
> > +
> >  ifneq ($(CONFIG_SKIP_LOWLEVEL_INIT),y)
> >  obj-y	+= lowlevel_init.o
> >  endif
> > diff --git a/arch/arm/cpu/armv7/sctlr.S b/arch/arm/cpu/armv7/sctlr.S
> > new file mode 100644
> > index 0000000000..cfdb7d2a52
> > --- /dev/null
> > +++ b/arch/arm/cpu/armv7/sctlr.S
> > @@ -0,0 +1,23 @@
> > +/*
> > + *  Routines to access the system control register
> > + *
> > + *  Copyright (c) 2018 Heinrich Schuchardt
> > + *
> > + *  SPDX-License-Identifier:     GPL-2.0+
> > + */
> > +
> > +#include <linux/linkage.h>
> > +
> > +/*
> > + * void allow_unaligned(void) - allow unaligned access
> > + *
> > + * This routine clears the aligned flag in the system control register.
> > + * After calling this routine unaligned access does no longer lead to a
> > + * data abort but is handled by the CPU.
> > + */
> > +ENTRY(allow_unaligned)
> > +	mrc	p15, 0, r0, c1, c0, 0	@ load system control register
> > +	bic	r0, r0, #2		@ clear aligned flag
> > +	mcr	p15, 0, r0, c1, c0, 0	@ write system control register
> > +	bx	lr			@ return
> > +ENDPROC(allow_unaligned)
> > 


More information about the U-Boot mailing list