ARM: armv7: Add C wrapper for allow_unaligned()
authorMarek Vasut <marex@denx.de>
Sat, 1 Jul 2023 15:26:18 +0000 (17:26 +0200)
committerHeinrich Schuchardt <heinrich.schuchardt@canonical.com>
Sat, 1 Jul 2023 15:29:15 +0000 (17:29 +0200)
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() .

The problem is triggerd by c7c0ca37673 ("efi_loader: fix efi_dp_from_file()") .
Adding the wrapper fixes the problem.

Fixes: 78f90aaeecc ("arm: armv7: allow unaligned memory access")
Signed-off-by: Marek Vasut <marex@denx.de>
arch/arm/cpu/armv7/cpu.c
arch/arm/cpu/armv7/sctlr.S
arch/arm/include/asm/armv7.h

index 68807d2..6259ffa 100644 (file)
@@ -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();
+}
index bd56e41..d44b214 100644 (file)
@@ -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)
index 2fb824b..c002998 100644 (file)
@@ -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