aboutsummaryrefslogtreecommitdiff
path: root/arch/arm/cpu
diff options
context:
space:
mode:
authorHeinrich Schuchardt <xypron.glpk@gmx.de>2019-11-19 04:02:10 +0100
committerHeinrich Schuchardt <xypron.glpk@gmx.de>2019-11-19 12:10:22 +0100
commitd47a774680d18ee5dea43d8b631048c3dc1a2b5f (patch)
tree6331d80b34db5030e1176d6c8ae4bda3a9f51f8a /arch/arm/cpu
parentb20bb09b2108c8368cce7d2801e5e746f4279e1f (diff)
downloadu-boot-d47a774680d18ee5dea43d8b631048c3dc1a2b5f.zip
u-boot-d47a774680d18ee5dea43d8b631048c3dc1a2b5f.tar.gz
u-boot-d47a774680d18ee5dea43d8b631048c3dc1a2b5f.tar.bz2
arm: arm11: allow unaligned memory access
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>
Diffstat (limited to 'arch/arm/cpu')
-rw-r--r--arch/arm/cpu/arm11/Makefile4
-rw-r--r--arch/arm/cpu/arm11/sctlr.S25
2 files changed, 29 insertions, 0 deletions
diff --git a/arch/arm/cpu/arm11/Makefile b/arch/arm/cpu/arm11/Makefile
index 5d721fc..5dfa01a 100644
--- a/arch/arm/cpu/arm11/Makefile
+++ b/arch/arm/cpu/arm11/Makefile
@@ -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
index 0000000..74a7fc4
--- /dev/null
+++ b/arch/arm/cpu/arm11/sctlr.S
@@ -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)