summaryrefslogtreecommitdiffstats
path: root/arch/arm/include/asm
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2013-06-09 17:15:56 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2013-06-09 17:15:56 -0700
commit0b52a3c89c8f44d7a936da8b374789dc0f43b188 (patch)
treee43d677f78037bbf063f9c07de7b32dfa0bf87f6 /arch/arm/include/asm
parent6dbda5bfe16bbb18af3ab249974daab9143be77f (diff)
parent509eb76ebf9771abc9fe51859382df2571f11447 (diff)
downloadlinux-0b52a3c89c8f44d7a936da8b374789dc0f43b188.tar.gz
linux-0b52a3c89c8f44d7a936da8b374789dc0f43b188.tar.bz2
linux-0b52a3c89c8f44d7a936da8b374789dc0f43b188.zip
Merge branch 'fixes' of git://git.linaro.org/people/rmk/linux-arm
Pull ARM fixes from Russell King: "The biggest two fixes are fixing a compilation error with the decompressor, and a problem with our __my_cpu_offset implementation. Other changes are very trivial and small, which seems to be the way for most -rc stuff." * 'fixes' of git://git.linaro.org/people/rmk/linux-arm: ARM: 7747/1: pcpu: ensure __my_cpu_offset cannot be re-ordered across barrier() ARM: 7750/1: update legacy CPU ID in decompressor cache support jump table ARM: 7743/1: compressed/head.S: work around new binutils warning ARM: 7742/1: topology: export cpu_topology ARM: 7737/1: fix kernel decompressor compilation error with CONFIG_DEBUG_SEMIHOSTING
Diffstat (limited to 'arch/arm/include/asm')
-rw-r--r--arch/arm/include/asm/percpu.h11
1 files changed, 9 insertions, 2 deletions
diff --git a/arch/arm/include/asm/percpu.h b/arch/arm/include/asm/percpu.h
index 968c0a14e0a3..209e6504922e 100644
--- a/arch/arm/include/asm/percpu.h
+++ b/arch/arm/include/asm/percpu.h
@@ -30,8 +30,15 @@ static inline void set_my_cpu_offset(unsigned long off)
static inline unsigned long __my_cpu_offset(void)
{
unsigned long off;
- /* Read TPIDRPRW */
- asm("mrc p15, 0, %0, c13, c0, 4" : "=r" (off) : : "memory");
+ register unsigned long *sp asm ("sp");
+
+ /*
+ * Read TPIDRPRW.
+ * We want to allow caching the value, so avoid using volatile and
+ * instead use a fake stack read to hazard against barrier().
+ */
+ asm("mrc p15, 0, %0, c13, c0, 4" : "=r" (off) : "Q" (*sp));
+
return off;
}
#define __my_cpu_offset __my_cpu_offset()