65 lines
2.2 KiB
Diff
65 lines
2.2 KiB
Diff
|
From 50ae76602cfb1079a3062a18c1767dce525985f0 Mon Sep 17 00:00:00 2001
|
||
|
From: Heinrich Schuchardt <xypron.glpk@gmx.de>
|
||
|
Date: Tue, 19 Nov 2019 04:02:10 +0100
|
||
|
Subject: [PATCH] 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>
|
||
|
Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
|
||
|
---
|
||
|
arch/arm/cpu/arm11/Makefile | 4 ++++
|
||
|
arch/arm/cpu/arm11/sctlr.S | 25 +++++++++++++++++++++++++
|
||
|
2 files changed, 29 insertions(+)
|
||
|
create mode 100644 arch/arm/cpu/arm11/sctlr.S
|
||
|
|
||
|
diff --git a/arch/arm/cpu/arm11/Makefile b/arch/arm/cpu/arm11/Makefile
|
||
|
index 5d721fce12..5dfa01ae8d 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 0000000000..74a7fc4a25
|
||
|
--- /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)
|