arm: arm11: allow unaligned memory access
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Tue, 19 Nov 2019 03:02:10 +0000 (04:02 +0100)
committerHeinrich Schuchardt <xypron.glpk@gmx.de>
Tue, 19 Nov 2019 11:10:22 +0000 (12:10 +0100)
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 set the enable
unaligned data support flag and to clear the aligned flag in the system
control register (SCTLR). It is called when UEFI related commands like
bootefi are invoked.

Reported-by: Cristian Ciocaltea <cristian.ciocaltea@gmail.com>
Tested-by: Cristian Ciocaltea <cristian.ciocaltea@gmail.com>
Tested-by: Guillaume Gardet <Guillaume.Gardet@arm.com>
Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
arch/arm/cpu/arm11/Makefile
arch/arm/cpu/arm11/sctlr.S [new file with mode: 0644]

index 5d721fce12b50337572c133a40c6cf00c982a212..5dfa01ae8d05881088ea79bbbdf9cef57f7ee1e9 100644 (file)
@@ -4,3 +4,7 @@
 # Wolfgang Denk, DENX Software Engineering, wd@denx.de.
 
 obj-y  = cpu.o
+
+ifneq ($(CONFIG_SPL_BUILD),y)
+obj-$(CONFIG_EFI_LOADER) += sctlr.o
+endif
diff --git a/arch/arm/cpu/arm11/sctlr.S b/arch/arm/cpu/arm11/sctlr.S
new file mode 100644 (file)
index 0000000..74a7fc4
--- /dev/null
@@ -0,0 +1,25 @@
+/* SPDX-License-Identifier:    GPL-2.0+ */
+/*
+ *  Routines to access the system control register
+ *
+ *  Copyright (c) 2019 Heinrich Schuchardt
+ */
+
+#include <linux/linkage.h>
+
+/*
+ * void allow_unaligned(void) - allow unaligned access
+ *
+ * This routine sets the enable unaligned data support flag and clears the
+ * aligned flag in the system control register.
+ * After calling this routine unaligned access does no longer leads to a
+ * data abort or undefined behavior but is handled by the CPU.
+ * For details see the "ARM Architecture Reference Manual" for ARMv6.
+ */
+ENTRY(allow_unaligned)
+       mrc     p15, 0, r0, c1, c0, 0   @ load system control register
+       orr     r0, r0, #1 << 22        @ set unaligned data support flag
+       bic     r0, r0, #2              @ clear aligned flag
+       mcr     p15, 0, r0, c1, c0, 0   @ write system control register
+       bx      lr                      @ return
+ENDPROC(allow_unaligned)