From: H.J. Lu Date: Tue, 19 Dec 2017 10:45:16 +0000 (-0800) Subject: x86: Add feature_1 to tcbhead_t [BZ #22563] X-Git-Tag: glibc-2.27~248 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cba595c350e52194e10c0006732e1991e3d0803b;p=thirdparty%2Fglibc.git 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. --- diff --git a/ChangeLog b/ChangeLog index 73dea64520f..c408eb23508 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2017-12-19 H.J. Lu + + [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 [BZ #22563] diff --git a/sysdeps/i386/nptl/tcb-offsets.sym b/sysdeps/i386/nptl/tcb-offsets.sym index 695a8103863..250f1a6e13e 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 f9a6b11ecf3..7d4b18c16ad 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 8a25c482cb0..03b6dba5c3e 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 9b8ad82550f..cec864f231d 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. */