prevent reordering of or1k and powerpc thread pointer loads
authorRich Felker <dalias@aerifal.cx>
Thu, 15 Oct 2015 16:08:51 +0000 (12:08 -0400)
committerRich Felker <dalias@aerifal.cx>
Thu, 15 Oct 2015 16:08:51 +0000 (12:08 -0400)
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.

arch/or1k/pthread_arch.h
arch/powerpc/pthread_arch.h

index e826997e6bf38cd6baa9f5f2c7fdd90e0cf446b5..ad631694fb6b0efce86a9ab71cd126f5b13d433f 100644 (file)
@@ -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));
 }
index 1cbfc223ad23e3745243cf90a058ef1be75043d7..bb7405d112d7f4244afbccbd15a459e2ce5fddb7 100644 (file)
@@ -5,6 +5,7 @@ static inline struct pthread *__pthread_self()
        __asm__ __volatile__ ("mr %0, 2" : "=r"(tp) : : );
 #else
        register char *tp __asm__("r2");
+       __asm__ __volatile__ ("" : "=r" (tp) );
 #endif
        return (pthread_t)(tp - 0x7000 - sizeof(struct pthread));
 }