aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2017-12-19 02:45:16 -0800
committerH.J. Lu <hjl.tools@gmail.com>2017-12-19 02:45:34 -0800
commitcba595c350e52194e10c0006732e1991e3d0803b (patch)
tree833da57e0eae667c21ce447aa9502a64e3c05527
parentf81ddabffd76ac9dd600b02adbf3e1dac4bb10ec (diff)
downloadglibc-cba595c350e52194e10c0006732e1991e3d0803b.tar
glibc-cba595c350e52194e10c0006732e1991e3d0803b.tar.gz
glibc-cba595c350e52194e10c0006732e1991e3d0803b.tar.bz2
glibc-cba595c350e52194e10c0006732e1991e3d0803b.zip
x86: Add feature_1 to tcbhead_t [BZ #22563]
On x86, padding in struct __jmp_buf_tag is used for shadow stack pointer to support Shadow Stack in Intel Control-flow Enforcemen Technology. cancel_jmp_buf has been updated to include saved_mask so that it is as large as struct __jmp_buf_tag. We must suport the old cancel_jmp_buf in existing binaries. Since symbol versioning doesn't work on cancel_jmp_buf, feature_1 is added to tcbhead_t so that setjmp and longjmp can check if shadow stack is enabled. NB: Shadow stack is enabled only if all modules are shadow stack enabled. [BZ #22563] * sysdeps/i386/nptl/tcb-offsets.sym (FEATURE_1_OFFSET): New. * sysdeps/i386/nptl/tls.h (tcbhead_t): Add feature_1. * sysdeps/x86_64/nptl/tcb-offsets.sym (FEATURE_1_OFFSET): New. * sysdeps/x86_64/nptl/tls.h (tcbhead_t): Rename __glibc_unused1 to feature_1.
-rw-r--r--ChangeLog9
-rw-r--r--sysdeps/i386/nptl/tcb-offsets.sym1
-rw-r--r--sysdeps/i386/nptl/tls.h4
-rw-r--r--sysdeps/x86_64/nptl/tcb-offsets.sym1
-rw-r--r--sysdeps/x86_64/nptl/tls.h5
5 files changed, 19 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 73dea64520..c408eb2350 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,15 @@
2017-12-19 H.J. Lu <hongjiu.lu@intel.com>
[BZ #22563]
+ * sysdeps/i386/nptl/tcb-offsets.sym (FEATURE_1_OFFSET): New.
+ * sysdeps/i386/nptl/tls.h (tcbhead_t): Add feature_1.
+ * sysdeps/x86_64/nptl/tcb-offsets.sym (FEATURE_1_OFFSET): New.
+ * sysdeps/x86_64/nptl/tls.h (tcbhead_t): Rename __glibc_unused1
+ to feature_1.
+
+2017-12-19 H.J. Lu <hongjiu.lu@intel.com>
+
+ [BZ #22563]
* bits/types/__cancel_jmp_buf_tag.h: New file.
* sysdeps/unix/sysv/linux/x86/bits/types/__cancel_jmp_buf_tag.h
* sysdeps/unix/sysv/linux/x86/pthreaddef.h: Likewise.
diff --git a/sysdeps/i386/nptl/tcb-offsets.sym b/sysdeps/i386/nptl/tcb-offsets.sym
index 695a810386..250f1a6e13 100644
--- a/sysdeps/i386/nptl/tcb-offsets.sym
+++ b/sysdeps/i386/nptl/tcb-offsets.sym
@@ -15,3 +15,4 @@ POINTER_GUARD offsetof (tcbhead_t, pointer_guard)
#ifndef __ASSUME_PRIVATE_FUTEX
PRIVATE_FUTEX offsetof (tcbhead_t, private_futex)
#endif
+FEATURE_1_OFFSET offsetof (tcbhead_t, feature_1)
diff --git a/sysdeps/i386/nptl/tls.h b/sysdeps/i386/nptl/tls.h
index f9a6b11ecf..7d4b18c16a 100644
--- a/sysdeps/i386/nptl/tls.h
+++ b/sysdeps/i386/nptl/tls.h
@@ -50,6 +50,10 @@ typedef struct
void *__private_tm[4];
/* GCC split stack support. */
void *__private_ss;
+ /* Bit 0: IBT.
+ Bit 1: SHSTK.
+ */
+ unsigned int feature_1;
} tcbhead_t;
# define TLS_MULTIPLE_THREADS_IN_TCB 1
diff --git a/sysdeps/x86_64/nptl/tcb-offsets.sym b/sysdeps/x86_64/nptl/tcb-offsets.sym
index 8a25c482cb..03b6dba5c3 100644
--- a/sysdeps/x86_64/nptl/tcb-offsets.sym
+++ b/sysdeps/x86_64/nptl/tcb-offsets.sym
@@ -15,6 +15,7 @@ VGETCPU_CACHE_OFFSET offsetof (tcbhead_t, vgetcpu_cache)
#ifndef __ASSUME_PRIVATE_FUTEX
PRIVATE_FUTEX offsetof (tcbhead_t, private_futex)
#endif
+FEATURE_1_OFFSET offsetof (tcbhead_t, feature_1)
-- Not strictly offsets, but these values are also used in the TCB.
TCB_CANCELSTATE_BITMASK CANCELSTATE_BITMASK
diff --git a/sysdeps/x86_64/nptl/tls.h b/sysdeps/x86_64/nptl/tls.h
index 9b8ad82550..cec864f231 100644
--- a/sysdeps/x86_64/nptl/tls.h
+++ b/sysdeps/x86_64/nptl/tls.h
@@ -56,7 +56,10 @@ typedef struct
# else
int __glibc_reserved1;
# endif
- int __glibc_unused1;
+ /* Bit 0: IBT.
+ Bit 1: SHSTK.
+ */
+ unsigned int feature_1;
/* Reservation of some values for the TM ABI. */
void *__private_tm[4];
/* GCC split stack support. */