diff options
author | Russell King <rmk+kernel@arm.linux.org.uk> | 2014-08-28 13:08:14 +0100 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2014-09-26 14:39:54 +0100 |
commit | 195b58add463f697fb802ed55e26759094d40a54 (patch) | |
tree | d3523c21a3bb610a87672356770a83c1e3c0ca8d /arch/arm/kernel/entry-header.S | |
parent | 8b521cb2947d8811b4cf7fc6a7a6ebde35218243 (diff) | |
download | talos-op-linux-195b58add463f697fb802ed55e26759094d40a54.tar.gz talos-op-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.S | 16 |
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 |