gcc/libitm
H.J. Lu 97cad5113b libitm/x86: Correct offsets of __private_tm and pointer_guard
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
2018-06-12 04:08:52 -07:00
..
config libitm/x86: Correct offsets of __private_tm and pointer_guard 2018-06-12 04:08:52 -07:00
testsuite [testsuite] Add scan-ltrans-tree-dump 2018-05-02 12:16:32 +00:00
ChangeLog libitm/x86: Correct offsets of __private_tm and pointer_guard 2018-06-12 04:08:52 -07:00
Makefile.am re PR other/79046 (g++ -print-file-name=plugin uses full version number in path) 2017-01-17 10:38:48 +01:00
Makefile.in Enable building libitm with Intel CET 2017-11-17 23:59:41 +01:00
aatree.cc Update copyright years. 2018-01-03 11:03:58 +01:00
aatree.h Update copyright years. 2018-01-03 11:03:58 +01:00
acinclude.m4 Enable building libitm with Intel CET 2017-11-17 23:59:41 +01:00
aclocal.m4 Disable hwcaps on libgfortran 2016-12-12 13:40:21 +00:00
alloc.cc Update copyright years. 2018-01-03 11:03:58 +01:00
alloc_c.cc Update copyright years. 2018-01-03 11:03:58 +01:00
alloc_cpp.cc Update copyright years. 2018-01-03 11:03:58 +01:00
barrier.cc Update copyright years. 2018-01-03 11:03:58 +01:00
beginend.cc PR c++/58407 - deprecated implicit copy ops. 2018-05-18 16:02:48 -04:00
clone.cc Update copyright years. 2018-01-03 11:03:58 +01:00
common.h Update copyright years. 2018-01-03 11:03:58 +01:00
config.h.in acinclude.m4 (LIBITM_CHECK_AS_HTM): New. 2013-07-15 12:23:49 -05:00
configure Regenerate configure of target libraries 2018-04-24 09:45:26 -07:00
configure.ac Update copyright years. 2018-01-03 11:03:58 +01:00
configure.tgt Update copyright years. 2018-01-03 11:03:58 +01:00
containers.h Update copyright years. 2018-01-03 11:03:58 +01:00
dispatch.h Update copyright years. 2018-01-03 11:03:58 +01:00
eh_cpp.cc Update copyright years. 2018-01-03 11:03:58 +01:00
libitm.h Update copyright years. 2018-01-03 11:03:58 +01:00
libitm.map Support __cxa_free_exception and fix exception handling. 2015-11-20 00:10:08 +00:00
libitm.spec.in
libitm.texi gcc.c (process_command): Update copyright notice dates. 2018-01-03 10:17:54 +01:00
libitm_i.h Update copyright years. 2018-01-03 11:03:58 +01:00
local.cc Update copyright years. 2018-01-03 11:03:58 +01:00
local_atomic Update copyright years. 2018-01-03 11:03:58 +01:00
method-gl.cc Update copyright years. 2018-01-03 11:03:58 +01:00
method-ml.cc Update copyright years. 2018-01-03 11:03:58 +01:00
method-serial.cc Update copyright years. 2018-01-03 11:03:58 +01:00
query.cc Update copyright years. 2018-01-03 11:03:58 +01:00
retry.cc Update copyright years. 2018-01-03 11:03:58 +01:00
useraction.cc Update copyright years. 2018-01-03 11:03:58 +01:00
util.cc Update copyright years. 2018-01-03 11:03:58 +01:00