about summary refs log tree commit diff
path: root/arch/or1k
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2015-10-15 12:08:51 -0400
committerRich Felker <dalias@aerifal.cx>2015-10-15 12:08:51 -0400
commit92637bb0d8f13940aebd2a8116cc935c3e7d8266 (patch)
treed3c5f18bda12af14834b0d2eeb484c24e80e3cf0 /arch/or1k
parent74483c5955a632af5d9a4783cc2b541764450551 (diff)
downloadmusl-92637bb0d8f13940aebd2a8116cc935c3e7d8266.tar.gz
musl-92637bb0d8f13940aebd2a8116cc935c3e7d8266.tar.xz
musl-92637bb0d8f13940aebd2a8116cc935c3e7d8266.zip
prevent reordering of or1k and powerpc thread pointer loads
other archs use asm for the thread pointer load, so making that asm
volatile is sufficient to inform the compiler that it has a "side
effect" (crashing or giving the wrong result if the thread pointer was
not yet initialized) that prevents reordering. however, powerpc and
or1k have dedicated general purpose registers for the thread pointer
and did not need to use any asm to access it; instead, "local register
variables with a specified register" were used. however, there is no
specification for ordering constraints on this type of usage, and
presumably use of the thread pointer could be reordered across its
initialization.

to impose an ordering, I have added empty volatile asm blocks that
produce the "local register variable with a specified register" as
an output constraint.
Diffstat (limited to 'arch/or1k')
-rw-r--r--arch/or1k/pthread_arch.h1
1 files changed, 1 insertions, 0 deletions
diff --git a/arch/or1k/pthread_arch.h b/arch/or1k/pthread_arch.h
index e826997e..ad631694 100644
--- a/arch/or1k/pthread_arch.h
+++ b/arch/or1k/pthread_arch.h
@@ -6,6 +6,7 @@ static inline struct pthread *__pthread_self()
 	__asm__ __volatile__ ("l.ori %0, r10, 0" : "=r" (tp) );
 #else
 	register char *tp __asm__("r10");
+	__asm__ __volatile__ ("" : "=r" (tp) );
 #endif
 	return (struct pthread *) (tp - sizeof(struct pthread));
 }