[U-Boot] [PATCH v2 2/3] arm: armv7: allow unaligned memory access
Heinrich Schuchardt
xypron.glpk at gmx.de
Wed Apr 4 10:52:45 UTC 2018
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.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.
>> 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)
>>
>
More information about the U-Boot
mailing list