[PATCH 1/2] ARM: armv7: Add C wrapper for allow_unaligned()

Marek Vasut marex at denx.de
Sat Jul 1 15:00:27 CEST 2023


Rename current assembler implementation of allow_unaligned() to
v7_arch_cp15_allow_unaligned() and add it into armv7.h header,
then add C wrapper of allow_unaligned().

This fixes misbehavior when linking U-Boot on ARMv7a i.MX6Q, where the
CPU specific allow_unaligned() implementation was ignored and instead the
__weak allow_unaligned() implementation from lib/efi_loader/efi_setup.c
was used, which led to "data abort" just before booting Linux via tftp,
in efi_dp_from_file() -> path_to_uefi() -> utf16_put() .

Adding the wrapper fixes the problem.

Fixes: c7c0ca37673 ("efi_loader: fix efi_dp_from_file()")
Signed-off-by: Marek Vasut <marex at denx.de>
---
Cc: Fabio Estevam <festevam at denx.de>
Cc: Heinrich Schuchardt <xypron.glpk at gmx.de>
Cc: Simon Glass <sjg at chromium.org>
Cc: Tom Rini <trini at konsulko.com>
---
 arch/arm/cpu/armv7/cpu.c     | 5 +++++
 arch/arm/cpu/armv7/sctlr.S   | 6 +++---
 arch/arm/include/asm/armv7.h | 1 +
 3 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/arch/arm/cpu/armv7/cpu.c b/arch/arm/cpu/armv7/cpu.c
index 68807d20997..6259ffa5108 100644
--- a/arch/arm/cpu/armv7/cpu.c
+++ b/arch/arm/cpu/armv7/cpu.c
@@ -83,3 +83,8 @@ int cleanup_before_linux(void)
 {
 	return cleanup_before_linux_select(CBL_ALL);
 }
+
+void allow_unaligned(void)
+{
+	v7_arch_cp15_allow_unaligned();
+}
diff --git a/arch/arm/cpu/armv7/sctlr.S b/arch/arm/cpu/armv7/sctlr.S
index bd56e41afe1..d44b21498f6 100644
--- a/arch/arm/cpu/armv7/sctlr.S
+++ b/arch/arm/cpu/armv7/sctlr.S
@@ -8,15 +8,15 @@
 #include <linux/linkage.h>
 
 /*
- * void allow_unaligned(void) - allow unaligned access
+ * void v7_arch_cp15_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)
+ENTRY(v7_arch_cp15_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)
+ENDPROC(v7_arch_cp15_allow_unaligned)
diff --git a/arch/arm/include/asm/armv7.h b/arch/arm/include/asm/armv7.h
index 2fb824b69e2..c002998ac0b 100644
--- a/arch/arm/include/asm/armv7.h
+++ b/arch/arm/include/asm/armv7.h
@@ -156,6 +156,7 @@ void v7_arch_cp15_set_l2aux_ctrl(u32 l2auxctrl, u32 cpu_midr,
 				 u32 cpu_rev);
 void v7_arch_cp15_set_acr(u32 acr, u32 cpu_midr, u32 cpu_rev_comb,
 			  u32 cpu_variant, u32 cpu_rev);
+void v7_arch_cp15_allow_unaligned(void);
 #endif /* ! __ASSEMBLY__ */
 
 #endif
-- 
2.40.1



More information about the U-Boot mailing list