In glibc, sysdeps/i386/nptl/tls.h has typedef struct { void *tcb; /* Pointer to the TCB. Not necessarily the thread descriptor used by libpthread. */ dtv_t *dtv; void *self; /* Pointer to the thread descriptor. */ int multiple_threads; uintptr_t sysinfo; uintptr_t stack_guard; uintptr_t pointer_guard; int gscope_flag; int __glibc_reserved1; /* Reservation of some values for the TM ABI. */ void *__private_tm[4]; /* GCC split stack support. */ void *__private_ss; } tcbhead_t; and sysdeps/x86_64/nptl/tls.h has typedef struct { void *tcb; /* Pointer to the TCB. Not necessarily the thread descriptor used by libpthread. */ dtv_t *dtv; void *self; /* Pointer to the thread descriptor. */ int multiple_threads; int gscope_flag; uintptr_t sysinfo; uintptr_t stack_guard; uintptr_t pointer_guard; unsigned long int vgetcpu_cache[2]; int __glibc_reserved1; int __glibc_unused1; /* Reservation of some values for the TM ABI. */ void *__private_tm[4]; /* GCC split stack support. */ void *__private_ss; long int __glibc_reserved2; /* Must be kept even if it is no longer used by glibc since programs, like AddressSanitizer, depend on the size of tcbhead_t. */ __128bits __glibc_unused2[8][4] __attribute__ ((aligned (32))); void *__padding[8]; } tcbhead_t; The offsets of __private_tm are i386: 36 bytes x32: 48 bytes x86_64: 80 bytes and the offsets of pointer_guard are: i386: 24 bytes x32: 28 bytes x86_64: 48 bytes But config/linux/x86/tls.h had #ifdef __x86_64__ #ifdef __LP64__ # define SEG_READ(OFS) "movq\t%%fs:(" #OFS "*8),%0" # define SEG_WRITE(OFS) "movq\t%0,%%fs:(" #OFS "*8)" # define SEG_DECODE_READ(OFS) SEG_READ(OFS) "\n\t" \ "rorq\t$17,%0\n\t" \ "xorq\t%%fs:48,%0" # define SEG_ENCODE_WRITE(OFS) "xorq\t%%fs:48,%0\n\t" \ "rolq\t$17,%0\n\t" \ SEG_WRITE(OFS) #else // For X32. # define SEG_READ(OFS) "movl\t%%fs:(" #OFS "*4),%0" # define SEG_WRITE(OFS) "movl\t%0,%%fs:(" #OFS "*4)" # define SEG_DECODE_READ(OFS) SEG_READ(OFS) "\n\t" \ "rorl\t$9,%0\n\t" \ "xorl\t%%fs:24,%0" # define SEG_ENCODE_WRITE(OFS) "xorl\t%%fs:24,%0\n\t" \ "roll\t$9,%0\n\t" \ SEG_WRITE(OFS) #endif #else # define SEG_READ(OFS) "movl\t%%gs:(" #OFS "*4),%0" # define SEG_WRITE(OFS) "movl\t%0,%%gs:(" #OFS "*4)" # define SEG_DECODE_READ(OFS) SEG_READ(OFS) "\n\t" \ "rorl\t$9,%0\n\t" \ "xorl\t%%gs:24,%0" # define SEG_ENCODE_WRITE(OFS) "xorl\t%%gs:24,%0\n\t" \ "roll\t$9,%0\n\t" \ SEG_WRITE(OFS) #endif static inline struct gtm_thread *gtm_thr(void) { struct gtm_thread *r; asm volatile (SEG_READ(10) : "=r"(r)); return r; } static inline void set_gtm_thr(struct gtm_thread *x) { asm volatile (SEG_WRITE(10) : : "r"(x)); } static inline struct abi_dispatch *abi_disp(void) { struct abi_dispatch *r; asm volatile (SEG_DECODE_READ(11) : "=r"(r)); return r; } static inline void set_abi_disp(struct abi_dispatch *x) { void *scratch; asm volatile (SEG_ENCODE_WRITE(11) : "=r"(scratch) : "0"(x)); } SEG_READ, SEG_WRITE, SEG_DECODE_READ and SEG_ENCODE_WRITE were correct only for x86-64. Update SEG_READ and SEG_WRITE to use the offset of __private_tm as base and correct the offset of pointer_guard for x32. This patch doesn't change ABI of libitm. PR libitm/85988 * config/linux/x86/tls.h (SEG_READ): Use the offset of __private_tm as base. (SEG_WRITE): Likewise. (SEG_ENCODE_WRITE): Correct the offset of pointer_guard for x32. (gtm_thr): Replace SEG_READ(10) with SEG_READ(0). (set_gtm_thr): Replace SEG_WRITE(10) with SEG_WRITE(0). (abi_disp): Replace SEG_DECODE_READ(11) with SEG_DECODE_READ(1). (set_abi_disp): Replace SEG_ENCODE_WRITE(11) with SEG_ENCODE_WRITE(1). From-SVN: r261491
Name |
Last commit
|
Last update |
---|---|---|
INSTALL | Loading commit data... | |
config | Loading commit data... | |
contrib | Loading commit data... | |
fixincludes | Loading commit data... | |
gcc | Loading commit data... | |
gnattools | Loading commit data... | |
gotools | Loading commit data... | |
include | Loading commit data... | |
intl | Loading commit data... | |
libada | Loading commit data... | |
libatomic | Loading commit data... | |
libbacktrace | Loading commit data... | |
libcc1 | Loading commit data... | |
libcpp | Loading commit data... | |
libdecnumber | Loading commit data... | |
libffi | Loading commit data... | |
libgcc | Loading commit data... | |
libgfortran | Loading commit data... | |
libgo | Loading commit data... | |
libgomp | Loading commit data... | |
libhsail-rt | Loading commit data... | |
libiberty | Loading commit data... | |
libitm | Loading commit data... | |
libobjc | Loading commit data... | |
liboffloadmic | Loading commit data... | |
libquadmath | Loading commit data... | |
libsanitizer | Loading commit data... | |
libssp | Loading commit data... | |
libstdc++-v3 | Loading commit data... | |
libvtv | Loading commit data... | |
lto-plugin | Loading commit data... | |
maintainer-scripts | Loading commit data... | |
zlib | Loading commit data... | |
.dir-locals.el | Loading commit data... | |
.gitattributes | Loading commit data... | |
.gitignore | Loading commit data... | |
ABOUT-NLS | Loading commit data... | |
COPYING | Loading commit data... | |
COPYING.LIB | Loading commit data... | |
COPYING.RUNTIME | Loading commit data... | |
COPYING3 | Loading commit data... | |
COPYING3.LIB | Loading commit data... | |
ChangeLog | Loading commit data... | |
ChangeLog.jit | Loading commit data... | |
ChangeLog.tree-ssa | Loading commit data... | |
MAINTAINERS | Loading commit data... | |
Makefile.def | Loading commit data... | |
Makefile.in | Loading commit data... | |
Makefile.tpl | Loading commit data... | |
README | Loading commit data... | |
compile | Loading commit data... | |
config-ml.in | Loading commit data... | |
config.guess | Loading commit data... | |
config.rpath | Loading commit data... | |
config.sub | Loading commit data... | |
configure | Loading commit data... | |
configure.ac | Loading commit data... | |
depcomp | Loading commit data... | |
install-sh | Loading commit data... | |
libtool-ldflags | Loading commit data... | |
libtool.m4 | Loading commit data... | |
ltgcc.m4 | Loading commit data... | |
ltmain.sh | Loading commit data... | |
ltoptions.m4 | Loading commit data... | |
ltsugar.m4 | Loading commit data... | |
ltversion.m4 | Loading commit data... | |
lt~obsolete.m4 | Loading commit data... | |
missing | Loading commit data... | |
mkdep | Loading commit data... | |
mkinstalldirs | Loading commit data... | |
move-if-change | Loading commit data... | |
symlink-tree | Loading commit data... | |
ylwrap | Loading commit data... |