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

Alexander Graf agraf at suse.de
Wed Apr 4 09:46:45 UTC 2018



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.

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:

  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)
> 


More information about the U-Boot mailing list