From patchwork Wed May 30 14:49:06 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 27570 Received: (qmail 57017 invoked by alias); 30 May 2018 14:49:25 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 46208 invoked by uid 89); 30 May 2018 14:49:10 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-24.0 required=5.0 tests=AWL, BAYES_00, FREEMAIL_FROM, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_NUMSUBJECT, MISSING_HEADERS, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy=lp64 X-HELO: mail-oi0-f44.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:cc; bh=uX4tsA7kuxrnfVmP8qQFECENl67hSVOYFfEXYJRW6Bg=; b=kgsTJ2G+0NjuzDnYH+M5R1P6IQCQtIudVclYtRsUu+wDzEdziKIqztVNjIbKKx6h1j uVIargfyWBjVqWnXyQZVfwaSIvsH6d5OZ170bj2KzLCao39NA05B6sY2Il+i4ZzzPbiV pwZL0RK1We9HSpNhqj+7Xu15Jk0JwTN3R6LNhAyECS81I1Dw6macSM+VIRDtcCNzDl/g +gNq/TljsL9eNfFJk3hDme50GahuMrLI6iU4cbBCC7vDW9Ma36sDyP/sWwoDSlVqthOV P1xrnt1T5sH3R/wq5cL27sMAkAKTHgMffQjBJENw30EpiE/K8fJ4VpZOOF4u3bL0E5Sa f14A== X-Gm-Message-State: APt69E0vtpQlWhoF1tdHeh2wu7s7i1ce5sAu0QsNOsnJmAEL2Jk56OwV 0g84JCGyfiWL9teVhvUoEYKbYL5xCfP1/8zpJVPgcQ== X-Received: by 2002:aca:b888:: with SMTP id i130-v6mt1886552oif.279.1527691747500; Wed, 30 May 2018 07:49:07 -0700 (PDT) MIME-Version: 1.0 From: "H.J. Lu" Date: Wed, 30 May 2018 07:49:06 -0700 Message-ID: Subject: [PATCH] i386: Change offset of __private_ss to 0x30 Cc: Uros Bizjak , GNU C Library On Wed, May 30, 2018 at 5:13 AM, H.J. Lu wrote: > TARGET_THREAD_SPLIT_STACK_OFFSET has been wrong for Linux/i386 from > the start. Should we change glibc for GCC's mistake or fix GCC? > We have to update tcbhead_t to match GCC to avoid libgcc ABI change. OK for master? From 5dc6c46daaabb501f345be2c10dfb952c1d5b5bf Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Wed, 30 May 2018 07:41:55 -0700 Subject: [PATCH] i386: Change offset of __private_ss to 0x30 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; The offset of __private_ss is 0x34. But GCC defines /* We steal the last transactional memory word. */ #define TARGET_THREAD_SPLIT_STACK_OFFSET 0x30 and libgcc/config/i386/morestack.S has cmpl %gs:0x30,%eax # See if we have enough space. movl %eax,%gs:0x30 # Save the new stack boundary. movl %eax,%gs:0x30 # Save the new stack boundary. movl %ecx,%gs:0x30 # Save new stack boundary. movl %eax,%gs:0x30 movl %gs:0x30,%eax movl %eax,%gs:0x30 Since update TARGET_THREAD_SPLIT_STACK_OFFSET changes split stack ABI, this patch updates tcbhead_t to match GCC. [BZ #23250] * sysdeps/i386/nptl/tls.h (tcbhead_t): Change __private_tm[4] to _private_tm[3] and add __glibc_reserved2. Add _Static_assert of offset of __private_ss == 0x30. * sysdeps/x86_64/nptl/tls.h: Add Add _Static_assert of offset of __private_ss == 0x40 for ILP32 and == 0x70 for LP64. --- sysdeps/i386/nptl/tls.h | 7 ++++++- sysdeps/x86_64/nptl/tls.h | 10 ++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/sysdeps/i386/nptl/tls.h b/sysdeps/i386/nptl/tls.h index 6c36e58e9c..afb71ce431 100644 --- a/sysdeps/i386/nptl/tls.h +++ b/sysdeps/i386/nptl/tls.h @@ -43,11 +43,16 @@ typedef struct int gscope_flag; int __glibc_reserved1; /* Reservation of some values for the TM ABI. */ - void *__private_tm[4]; + void *__private_tm[3]; /* GCC split stack support. */ void *__private_ss; + void *__glibc_reserved2; } tcbhead_t; +/* morestack.S in libgcc uses offset 0x30 to access __private_ss, */ +_Static_assert (offsetof (tcbhead_t, __private_ss) == 0x30, + "offset of __private_ss != 0x30"); + # define TLS_MULTIPLE_THREADS_IN_TCB 1 #else /* __ASSEMBLER__ */ diff --git a/sysdeps/x86_64/nptl/tls.h b/sysdeps/x86_64/nptl/tls.h index 6da1c04a98..65c0051dcf 100644 --- a/sysdeps/x86_64/nptl/tls.h +++ b/sysdeps/x86_64/nptl/tls.h @@ -65,6 +65,16 @@ typedef struct void *__padding[8]; } tcbhead_t; +# ifdef __ILP32__ +/* morestack.S in libgcc uses offset 0x40 to access __private_ss, */ +_Static_assert (offsetof (tcbhead_t, __private_ss) == 0x40, + "offset of __private_ss != 0x40"); +# else +/* morestack.S in libgcc uses offset 0x70 to access __private_ss, */ +_Static_assert (offsetof (tcbhead_t, __private_ss) == 0x70, + "offset of __private_ss != 0x70"); +# endif + #else /* __ASSEMBLER__ */ # include #endif -- 2.17.0