mirror of
https://github.com/fluencelabs/musl
synced 2025-05-30 16:11:40 +00:00
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.
19 lines
506 B
C
19 lines
506 B
C
/* or1k use variant I, but with the twist that tp points to the end of TCB */
|
|
static inline struct pthread *__pthread_self()
|
|
{
|
|
#ifdef __clang__
|
|
char *tp;
|
|
__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));
|
|
}
|
|
|
|
#define TLS_ABOVE_TP
|
|
#define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread))
|
|
|
|
/* word-offset to 'pc' in mcontext_t */
|
|
#define CANCEL_REG_IP 32
|