aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/arch/arm/kernel/entry-header.S
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@arm.linux.org.uk>2014-08-28 13:08:14 +0100
committerRussell King <rmk+kernel@arm.linux.org.uk>2014-09-26 14:39:54 +0100
commit195b58add463f697fb802ed55e26759094d40a54 (patch)
treed3523c21a3bb610a87672356770a83c1e3c0ca8d /arch/arm/kernel/entry-header.S
parentARM: 8152/1: Convert pr_warning to pr_warn (diff)
downloadwireguard-linux-195b58add463f697fb802ed55e26759094d40a54.tar.xz
wireguard-linux-195b58add463f697fb802ed55e26759094d40a54.zip
ARM: Avoid writing to control register on every exception
If we are not changing the control register value, avoid writing to it. Writes to the control register can be very expensive, taking around a hundred cycles or so. Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm/kernel/entry-header.S')
-rw-r--r--arch/arm/kernel/entry-header.S16
1 files changed, 12 insertions, 4 deletions
diff --git a/arch/arm/kernel/entry-header.S b/arch/arm/kernel/entry-header.S
index 8db307d0954b..7b729394e78a 100644
--- a/arch/arm/kernel/entry-header.S
+++ b/arch/arm/kernel/entry-header.S
@@ -37,11 +37,19 @@
#endif
.endm
- .macro alignment_trap, rtemp, label
#ifdef CONFIG_ALIGNMENT_TRAP
- ldr \rtemp, \label
- ldr \rtemp, [\rtemp]
- mcr p15, 0, \rtemp, c1, c0
+#define ATRAP(x...) x
+#else
+#define ATRAP(x...)
+#endif
+
+ .macro alignment_trap, rtmp1, rtmp2, label
+#ifdef CONFIG_ALIGNMENT_TRAP
+ mrc p15, 0, \rtmp2, c1, c0, 0
+ ldr \rtmp1, \label
+ ldr \rtmp1, [\rtmp1]
+ teq \rtmp1, \rtmp2
+ mcrne p15, 0, \rtmp1, c1, c0, 0
#endif
.endm