This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH] i386: Change offset of __private_ss to 0x30
- From: "H.J. Lu" <hjl dot tools at gmail dot com>
- Cc: Uros Bizjak <ubizjak at gmail dot com>, GNU C Library <libc-alpha at sourceware dot org>
- Date: Wed, 30 May 2018 07:49:06 -0700
- Subject: [PATCH] i386: Change offset of __private_ss to 0x30
On Wed, May 30, 2018 at 5:13 AM, H.J. Lu <hongjiu.lu@intel.com> 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?
--
H.J.
From 5dc6c46daaabb501f345be2c10dfb952c1d5b5bf Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <hjl.tools@gmail.com>
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 <tcb-offsets.h>
#endif
--
2.17.0