On 04/04/2018 11:46 AM, 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.g...@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.
>> extremely wild situation on armv7 Is this a deficiency of the CPUs or of U-Boot? Could you, please, provide an example where it would not work. > > IMHO we should really update the UEFI spec and mandate that all memory > accesses have to be aligned on armv7. It's what grub is doing today already: Do you really expect the spec to be changed in a way that currently working EFI executables will suddenly break? I am not confident this will happen. Best regards Heinrich > > http://git.savannah.gnu.org/cgit/grub.git/tree/configure.ac#n1279 > > My recommendation would be to just pass the same compiler flags to iPXE > on armv7. > > > 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) >> > _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot