On Wed, May 30, 2018 at 7:54 AM, H.J. Lu <hongjiu...@intel.com> wrote:
> 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
>
> Update SEG_READ and SEG_WRITE to use the offset of __private_tm as base
> and correct the offset of pointer_guard for x32.
>
> Tested on i686, x86-64 and x32.  OK for trunk and release branches?
>

Any comments, objections?

BTW, this patch doesn't change ABI of libitm.

> H.J.
> ---
>         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).
> ---
>  libitm/config/linux/x86/tls.h | 24 ++++++++++++------------
>  1 file changed, 12 insertions(+), 12 deletions(-)
>
> diff --git a/libitm/config/linux/x86/tls.h b/libitm/config/linux/x86/tls.h
> index 5f3fd273c0e..ca6a5af3d4f 100644
> --- a/libitm/config/linux/x86/tls.h
> +++ b/libitm/config/linux/x86/tls.h
> @@ -42,8 +42,8 @@ namespace GTM HIDDEN {
>
>  #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_READ(OFS)         "movq\t%%fs:(80+" #OFS "*8),%0"
> +# define SEG_WRITE(OFS)                "movq\t%0,%%fs:(80+" #OFS "*8)"
>  # define SEG_DECODE_READ(OFS)  SEG_READ(OFS) "\n\t" \
>                                 "rorq\t$17,%0\n\t" \
>                                 "xorq\t%%fs:48,%0"
> @@ -52,18 +52,18 @@ namespace GTM HIDDEN {
>                                 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_READ(OFS)          "movl\t%%fs:(48+" #OFS "*4),%0"
> +# define SEG_WRITE(OFS)         "movl\t%0,%%fs:(48+" #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" \
> +                               "xorl\t%%fs:28,%0"
> +# define SEG_ENCODE_WRITE(OFS)  "xorl\t%%fs:28,%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_READ(OFS)  "movl\t%%gs:(36+" #OFS "*4),%0"
> +# define SEG_WRITE(OFS) "movl\t%0,%%gs:(36+" #OFS "*4)"
>  # define SEG_DECODE_READ(OFS)  SEG_READ(OFS) "\n\t" \
>                                 "rorl\t$9,%0\n\t" \
>                                 "xorl\t%%gs:24,%0"
> @@ -75,26 +75,26 @@ namespace GTM HIDDEN {
>  static inline struct gtm_thread *gtm_thr(void)
>  {
>    struct gtm_thread *r;
> -  asm volatile (SEG_READ(10) : "=r"(r));
> +  asm volatile (SEG_READ(0) : "=r"(r));
>    return r;
>  }
>
>  static inline void set_gtm_thr(struct gtm_thread *x)
>  {
> -  asm volatile (SEG_WRITE(10) : : "r"(x));
> +  asm volatile (SEG_WRITE(0) : : "r"(x));
>  }
>
>  static inline struct abi_dispatch *abi_disp(void)
>  {
>    struct abi_dispatch *r;
> -  asm volatile (SEG_DECODE_READ(11) : "=r"(r));
> +  asm volatile (SEG_DECODE_READ(1) : "=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));
> +  asm volatile (SEG_ENCODE_WRITE(1) : "=r"(scratch) : "0"(x));
>  }
>
>  #undef SEG_READ
> --
> 2.17.0
>



-- 
H.J.

Reply via email to