[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