Enable building libitm with Intel CET
authorIgor Tsimbalist <igor.v.tsimbalist@intel.com>
Fri, 17 Nov 2017 22:59:41 +0000 (23:59 +0100)
committerIgor Tsimbalist <itsimbal@gcc.gnu.org>
Fri, 17 Nov 2017 22:59:41 +0000 (23:59 +0100)
libitm/
* Makefile.in: Regenerate.
* acinclude.m4: Add enable.m4 and cet.m4.
* config/x86/sjlj.S: Include cet.h.
(_ITM_beginTransaction): Add _CET_ENDBR.
Save Shadow Stack pointer.
(GTM_longjmp): Add _CET_ENDBR. Restore Shadow Stack pointer.
* config/x86/target.h (struct gtm_jmpbuf):
Add new field for Shadow Stack pointer.
* configure: Regenerate.
* configure.ac: Set CET_FLAGS. Update XCFLAGS.
* configure.ac: Update libtool_VERSION for x86.
* testsuite/Makefile.in: Regenerate.

From-SVN: r254908

libitm/ChangeLog
libitm/Makefile.in
libitm/acinclude.m4
libitm/config/x86/sjlj.S
libitm/configure
libitm/configure.ac
libitm/testsuite/Makefile.in

index 196ac9a1ab2ea46bc6804f226be2264cab4b9c75..fb2e949322487903b650192a4b7bac94445bc756 100644 (file)
@@ -1,3 +1,18 @@
+2017-11-17  Igor Tsimbalist  <igor.v.tsimbalist@intel.com>
+
+       * Makefile.in: Regenerate.
+       * acinclude.m4: Add enable.m4 and cet.m4.
+       * config/x86/sjlj.S: Include cet.h.
+       (_ITM_beginTransaction): Add _CET_ENDBR.
+       Save Shadow Stack pointer.
+       (GTM_longjmp): Add _CET_ENDBR. Restore Shadow Stack pointer.
+       * config/x86/target.h (struct gtm_jmpbuf):
+       Add new field for Shadow Stack pointer.
+       * configure: Regenerate.
+       * configure.ac: Set CET_FLAGS. Update XCFLAGS.
+       * configure.ac: Update libtool_VERSION for x86.
+       * testsuite/Makefile.in: Regenerate.
+
 2017-11-17  Igor Tsimbalist  <igor.v.tsimbalist@intel.com>
 
        * libitm/config/x86/target.h: Add new field (ssp).
index bd16ce0cfb816ba939d68cebe4dd849bf94e9bcc..703f279efdd2846419457f0015d21992c9606630 100644 (file)
@@ -78,7 +78,7 @@ am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \
        $(top_srcdir)/../ltoptions.m4 $(top_srcdir)/../ltsugar.m4 \
        $(top_srcdir)/../ltversion.m4 $(top_srcdir)/../lt~obsolete.m4 \
        $(top_srcdir)/acinclude.m4 $(top_srcdir)/../libtool.m4 \
-       $(top_srcdir)/configure.ac
+       $(top_srcdir)/../config/cet.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
 am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
index c81b3e909a75648c3d8c288017bedf1baaaf30c0..cd8150ce95f2e51356b6286b24e67007c006794b 100644 (file)
@@ -149,6 +149,7 @@ s390*)
 esac])
 
 sinclude(../libtool.m4)
+sinclude(../config/cet.m4)
 dnl The lines below arrange for aclocal not to bring an installed
 dnl libtool.m4 into aclocal.m4, while still arranging for automake to
 dnl add a definition of LIBTOOL to Makefile.in.
index 7de417ca101c83e5557a6be7498b9ddb1f2815e7..006e44db0eb61bda5d7643cc7c3219faf34f8bac 100644 (file)
@@ -25,6 +25,7 @@
 
 #include "asmcfi.h"
 #include "config.h"
+#include "cet.h"
 
 #define CONCAT1(a, b) CONCAT2(a, b)
 #define CONCAT2(a, b) a ## b
@@ -73,6 +74,7 @@
 
 SYM(_ITM_beginTransaction):
        cfi_startproc
+       _CET_ENDBR
 #ifdef __x86_64__
 #ifdef HAVE_AS_RTM
        /* Custom HTM fast path.  We start the HW transaction here and let
@@ -138,6 +140,10 @@ SYM(_ITM_beginTransaction):
        movq    %r14, -32(%rax)
        movq    %r15, -24(%rax)
        xorq    %rdx, %rdx
+       /* Save zero or shadow stack pointer in the new field.  */
+#if defined(__SHSTK__) && defined(__CET__)
+       rdsspq  %rdx
+#endif
        movq    %rdx, -16(%rax)
        leaq    -72(%rax), %rsi
        call    SYM(GTM_begin_transaction)
@@ -170,6 +176,10 @@ SYM(_ITM_beginTransaction):
        movl    %edi, 16(%esp)
        movl    %ebp, 20(%esp)
        xorl    %edx, %edx
+       /* Save zero or shadow stack pointer in the new field.  */
+#if defined(__SHSTK__) && defined(__CET__)
+       rdsspd  %edx
+#endif
        movl    %edx, 24(%esp)
        leal    4(%esp), %edx
 #if defined HAVE_ATTRIBUTE_VISIBILITY || !defined __PIC__
@@ -197,6 +207,7 @@ SYM(_ITM_beginTransaction):
 
 SYM(GTM_longjmp):
        cfi_startproc
+       _CET_ENDBR
 #ifdef __x86_64__
        movq    (%rsi), %rcx
        movq    8(%rsi), %rbx
@@ -210,6 +221,33 @@ SYM(GTM_longjmp):
        cfi_offset(%rip, 64)
        cfi_register(%rsp, %rcx)
        movq    %rcx, %rsp
+#if defined(__SHSTK__) && defined(__CET__)
+       /* Check if Shadow Stack is enabled.  */
+       xorq    %rcx, %rcx
+       rdsspq  %rcx
+       testq   %rcx, %rcx
+       je      .L1
+       /* Calculate number of frames to skip.  */
+       subq    56(%rsi), %rcx
+       negq    %rcx
+       shrq    $3, %rcx
+       incq    %rcx
+       /* If # of frames is greater 255 then loop
+          and adjust.  */
+       cmpq    $255, %rcx
+       jle     .L3
+       movl    $255, %edi
+       .p2align 4,,10
+       .p2align 3
+.L4:
+       incsspq %rdi
+       subq    $255, %rcx
+       cmpq    $255, %rcx
+       jg      .L4
+.L3:
+       incsspq %rcx
+.L1:
+#endif
        jmp     *64(%rsi)
 #else
        movl    (%edx), %ecx
@@ -221,6 +259,35 @@ SYM(GTM_longjmp):
        cfi_offset(%eip, 24)
        cfi_register(%esp, %ecx)
        movl    %ecx, %esp
+#if defined(__SHSTK__) && defined(__CET__)
+       /* Check if Shadow Stack is enabled.  */
+       xorl    %ecx, %ecx
+       rdsspd  %ecx
+       testl   %ecx, %ecx
+       je      .L1
+       /* Calculate # of frames to skip.  */
+       subl    20(%edx), %ecx
+       negl    %ecx
+       shrl    $2, %ecx
+       incl    %ecx
+       /* If # of frames is greater 255 then loop
+          and adjust.  */
+       cmpl    $255, %ecx
+       jle     .L3
+       pushl   %eax
+       movl    $255, %eax
+       .p2align 4,,10
+       .p2align 3
+.L4:
+       incsspd %eax
+       subl    $255, %ecx
+       cmpl    $255, %ecx
+       jg      .L4
+       popl    %eax
+.L3:
+       incsspd %ecx
+.L1:
+#endif
        jmp     *24(%edx)
 #endif
        cfi_endproc
index 775f370fbb5dc75197d62bd395f92cbd67c92210..d061c8c26597c2bc87b3cfebbaddb0d83e456fac 100644 (file)
@@ -777,6 +777,7 @@ enable_maintainer_mode
 enable_linux_futex
 enable_tls
 enable_symvers
+enable_cet
 with_gcc_major_version_only
 '
       ac_precious_vars='build_alias
@@ -1426,6 +1427,8 @@ Optional Features:
   --enable-tls            Use thread-local storage [default=yes]
   --enable-symvers=STYLE  enables symbol versioning of the shared library
                           [default=yes]
+  --enable-cet            enable Intel CET in target libraries
+                          [default=default]
 
 Optional Packages:
   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
@@ -11794,7 +11797,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 11797 "configure"
+#line 11800 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -11900,7 +11903,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 11903 "configure"
+#line 11906 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
 
 XCFLAGS="$XCFLAGS $XPCFLAGS"
 
+# Add CET specific flags if CET is enabled
+ # Check whether --enable-cet was given.
+if test "${enable_cet+set}" = set; then :
+  enableval=$enable_cet;
+      case "$enableval" in
+       yes|no|default) ;;
+       *) as_fn_error "Unknown argument to enable/disable cet" "$LINENO" 5 ;;
+                          esac
+
+else
+  enable_cet=default
+fi
+
+
+case "$host" in
+  i[34567]86-*-linux* | x86_64-*-linux*)
+    case "$enable_cet" in
+      default)
+       # Check if assembler supports CET.
+       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+asm ("setssbsy");
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  enable_cet=yes
+else
+  enable_cet=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+       ;;
+      yes)
+       # Check if assembler supports CET.
+       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+asm ("setssbsy");
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  as_fn_error "assembler with CET support is required for --enable-cet" "$LINENO" 5
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+       ;;
+    esac
+    ;;
+  *)
+    enable_cet=no
+    ;;
+esac
+if test x$enable_cet = xyes; then
+  CET_FLAGS="-fcf-protection -mcet"
+fi
+
+XCFLAGS="$XCFLAGS $CET_FLAGS"
+
 
 
 
index c5ecd394a4305ec5350d7032eb792f162dca9ce5..ad77fcae2a677029cb1f6f0585f46554f6015038 100644 (file)
@@ -260,6 +260,10 @@ fi
 
 XCFLAGS="$XCFLAGS $XPCFLAGS"
 
+# Add CET specific flags if CET is enabled
+GCC_CET_FLAGS(CET_FLAGS)
+XCFLAGS="$XCFLAGS $CET_FLAGS"
+
 AC_SUBST(config_path)
 AC_SUBST(XCFLAGS)
 AC_SUBST(XLDFLAGS)
index eb9e992279ddfccac3c5795eda095c4af6a752d9..34dcdd2dae07f7726bcc3b9d58c9372fcbe47dc4 100644 (file)
@@ -70,7 +70,7 @@ am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \
        $(top_srcdir)/../ltoptions.m4 $(top_srcdir)/../ltsugar.m4 \
        $(top_srcdir)/../ltversion.m4 $(top_srcdir)/../lt~obsolete.m4 \
        $(top_srcdir)/acinclude.m4 $(top_srcdir)/../libtool.m4 \
-       $(top_srcdir)/configure.ac
+       $(top_srcdir)/../config/cet.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
 mkinstalldirs = $(SHELL) $(top_srcdir)/../mkinstalldirs