arm: armv7: allow unaligned memory access
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Tue, 3 Apr 2018 19:59:33 +0000 (21:59 +0200)
committerAlexander Graf <agraf@suse.de>
Sun, 3 Jun 2018 13:27:21 +0000 (15:27 +0200)
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@gmx.de>
[agraf: fix SPDX identifier]
Signed-off-by: Alexander Graf <agraf@suse.de>
arch/arm/cpu/armv7/Makefile
arch/arm/cpu/armv7/sctlr.S [new file with mode: 0644]

index 26056647df01f1db645bb9ee67c453df43b57dcc..4f4647c90ac1f7d291676b05c07c648c492db108 100644 (file)
@@ -12,6 +12,10 @@ obj-y        += syslib.o
 
 obj-$(CONFIG_SYS_ARM_MPU) += mpu_v7r.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 (file)
index 0000000..bd56e41
--- /dev/null
@@ -0,0 +1,22 @@
+/* SPDX-License-Identifier:     GPL-2.0+ */
+/*
+ *  Routines to access the system control register
+ *
+ *  Copyright (c) 2018 Heinrich Schuchardt
+ */
+
+#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)