Enable building libgcc with CET options.
authorIgor Tsimbalist <igor.v.tsimbalist@intel.com>
Fri, 17 Nov 2017 13:34:39 +0000 (14:34 +0100)
committerIgor Tsimbalist <itsimbal@gcc.gnu.org>
Fri, 17 Nov 2017 13:34:39 +0000 (14:34 +0100)
Enable building libgcc with CET options by default on Linux/x86 if
binutils supports CET v2.0.  It can be disabled with --disable-cet.
It is an error to configure GCC with --enable-cet if bintuiils
doesn't support CET v2.0.

ENDBR instruction is added to __morestack_large_model since it is
called indirectly.

2017-11-17  Igor Tsimbalist  <igor.v.tsimbalist@intel.com>

config/
* cet.m4: New file.

gcc/
* config.gcc (extra_headers): Add cet.h for x86 targets.
* config/i386/cet.h: New file.
* doc/install.texi: Add --enable-cet/--disable-cet.

libgcc/
* Makefile.in (configure_deps): Add $(srcdir)/../config/cet.m4.
(CET_FLAGS): New.
* config/i386/morestack.S: Include <cet.h>.
(__morestack_large_model): Add _CET_ENDBR at function entrance.
* config/i386/resms64.h: Include <cet.h>.
* config/i386/resms64f.h: Likewise.
* config/i386/resms64fx.h: Likewise.
* config/i386/resms64x.h: Likewise.
* config/i386/savms64.h: Likewise.
* config/i386/savms64f.h: Likewise.
* config/i386/t-linux (HOST_LIBGCC2_CFLAGS): Add $(CET_FLAGS).
(CRTSTUFF_T_CFLAGS): Likewise.
* configure.ac: Include ../config/cet.m4.
Set and substitute CET_FLAGS.
* configure: Regenerated.

From-SVN: r254868

18 files changed:
config/ChangeLog
config/cet.m4 [new file with mode: 0644]
gcc/ChangeLog
gcc/config.gcc
gcc/config/i386/cet.h [new file with mode: 0644]
gcc/doc/install.texi
libgcc/ChangeLog
libgcc/Makefile.in
libgcc/config/i386/morestack.S
libgcc/config/i386/resms64.h
libgcc/config/i386/resms64f.h
libgcc/config/i386/resms64fx.h
libgcc/config/i386/resms64x.h
libgcc/config/i386/savms64.h
libgcc/config/i386/savms64f.h
libgcc/config/i386/t-linux
libgcc/configure
libgcc/configure.ac

index 90e1af4779dd0b39c3ab66c06839044f1e993e8f..2bb5244caa4f1c1d3170d593337eff7c79d3136e 100644 (file)
@@ -1,3 +1,7 @@
+2017-11-17  Igor Tsimbalist  <igor.v.tsimbalist@intel.com>
+
+       * cet.m4: New file.
+
 2017-11-15  Alexandre Oliva <aoliva@redhat.com>
 
        * bootstrap-debug-lean.mk (do-compare): Use the
diff --git a/config/cet.m4 b/config/cet.m4
new file mode 100644 (file)
index 0000000..715f4bd
--- /dev/null
@@ -0,0 +1,38 @@
+dnl
+dnl GCC_CET_FLAGS
+dnl    (SHELL-CODE_HANDLER)
+dnl
+AC_DEFUN([GCC_CET_FLAGS],[dnl
+GCC_ENABLE(cet, default, ,[enable Intel CET in target libraries],
+          permit yes|no|default)
+case "$host" in
+  i[[34567]]86-*-linux* | x86_64-*-linux*)
+    case "$enable_cet" in
+      default)
+       # Check if assembler supports CET.
+       AC_COMPILE_IFELSE(
+        [AC_LANG_PROGRAM(
+         [],
+         [asm ("setssbsy");])],
+        [enable_cet=yes],
+        [enable_cet=no])
+       ;;
+      yes)
+       # Check if assembler supports CET.
+       AC_COMPILE_IFELSE(
+        [AC_LANG_PROGRAM(
+         [],
+         [asm ("setssbsy");])],
+        [],
+        [AC_MSG_ERROR([assembler with CET support is required for --enable-cet])])
+       ;;
+    esac
+    ;;
+  *)
+    enable_cet=no
+    ;;
+esac
+if test x$enable_cet = xyes; then
+  $1="-fcf-protection -mcet"
+fi
+])
index 030a13ca282a87509a916b45e30cc3cd416ef996..a08574d7aafb7534a018231a0ec5fdc348516272 100644 (file)
@@ -1,3 +1,9 @@
+2017-11-17  Igor Tsimbalist  <igor.v.tsimbalist@intel.com>
+
+       * config.gcc (extra_headers): Add cet.h for x86 targets.
+       * config/i386/cet.h: New file.
+       * doc/install.texi: Add --enable-cet/--disable-cet.
+
 2017-11-17  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/83017
index 8ee8e8c7c8b37e81294754ce91b6b2c8f4435ef9..24f904455b0b49e1a9944b0fcbf112316fb1c57e 100644 (file)
@@ -379,7 +379,7 @@ i[34567]86-*-*)
                       avx512vbmivlintrin.h avx5124fmapsintrin.h avx5124vnniwintrin.h
                       avx512vpopcntdqintrin.h clwbintrin.h mwaitxintrin.h
                       clzerointrin.h pkuintrin.h sgxintrin.h cetintrin.h
-                      gfniintrin.h"
+                      gfniintrin.h cet.h"
        ;;
 x86_64-*-*)
        cpu_type=i386
@@ -404,7 +404,7 @@ x86_64-*-*)
                       avx512vbmivlintrin.h avx5124fmapsintrin.h avx5124vnniwintrin.h
                       avx512vpopcntdqintrin.h clwbintrin.h mwaitxintrin.h
                       clzerointrin.h pkuintrin.h sgxintrin.h cetintrin.h
-                      gfniintrin.h"
+                      gfniintrin.h cet.h"
        ;;
 ia64-*-*)
        extra_headers=ia64intrin.h
diff --git a/gcc/config/i386/cet.h b/gcc/config/i386/cet.h
new file mode 100644 (file)
index 0000000..7300844
--- /dev/null
@@ -0,0 +1,93 @@
+/* ELF program property for Intel CET.
+   Copyright (C) 2017 Free Software Foundation, Inc.
+
+   This file is free software; you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published by the
+   Free Software Foundation; either version 3, or (at your option) any
+   later version.
+
+   This file is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   Under Section 7 of GPL version 3, you are granted additional
+   permissions described in the GCC Runtime Library Exception, version
+   3.1, as published by the Free Software Foundation.
+
+   You should have received a copy of the GNU General Public License and
+   a copy of the GCC Runtime Library Exception along with this program;
+   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+   <http://www.gnu.org/licenses/>.
+ */
+
+/* Add x86 feature with IBT and/or SHSTK bits to ELF program property
+   if they are enabled.  Otherwise, contents in this header file are
+   unused.  Define _CET_ENDBR for assembly codes.  _CET_ENDBR should be
+   placed unconditionally at the entrance of a function whose address
+   may be taken.  */
+
+#ifndef _CET_H_INCLUDED
+#define _CET_H_INCLUDED
+
+#ifdef __ASSEMBLER__
+
+# ifdef __IBT__
+#  ifdef __x86_64__
+#   define _CET_ENDBR endbr64
+#  else
+#   define _CET_ENDBR endbr32
+#  endif
+# else
+#  define _CET_ENDBR
+# endif
+
+# ifdef __ELF__
+#  ifdef __CET__
+#   ifdef __IBT__
+/* GNU_PROPERTY_X86_FEATURE_1_IBT.  */
+#    define __PROPERTY_IBT 0x1
+#   else
+#    define __PROPERTY_IBT 0x0
+#   endif
+
+#   ifdef __SHSTK__
+/* GNU_PROPERTY_X86_FEATURE_1_SHSTK.  */
+#    define __PROPERTY_SHSTK 0x2
+#   else
+#    define __PROPERTY_SHSTK 0x0
+#   endif
+
+#   define __PROPERTY_BITS (__PROPERTY_IBT | __PROPERTY_SHSTK)
+
+#   ifdef __LP64__
+#    define __PROPERTY_ALIGN 3
+#   else
+#    define __PROPERTY_ALIGN 2
+#   endif
+
+       .pushsection ".note.gnu.property", "a"
+       .p2align __PROPERTY_ALIGN
+       .long 1f - 0f           /* name length.  */
+       .long 4f - 1f           /* data length.  */
+       /* NT_GNU_PROPERTY_TYPE_0.   */
+       .long 5                 /* note type.  */
+0:
+       .asciz "GNU"            /* vendor name.  */
+1:
+       .p2align __PROPERTY_ALIGN
+       /* GNU_PROPERTY_X86_FEATURE_1_AND.  */
+       .long 0xc0000002        /* pr_type.  */
+       .long 3f - 2f           /* pr_datasz.  */
+2:
+       /* GNU_PROPERTY_X86_FEATURE_1_XXX.  */
+       .long __PROPERTY_BITS
+3:
+       .p2align __PROPERTY_ALIGN
+4:
+       .popsection
+#  endif /* __CET__ */
+# endif /* __ELF__ */
+#endif /* __ASSEMBLER__ */
+
+#endif /* _CET_H_INCLUDED */
index 22e5731f6cd69bc718e07e75829c80ee43fc8901..a9032c9021c28a78569ddbf401074f84c7ff89ea 100644 (file)
@@ -2065,6 +2065,19 @@ explicitly specify the directory where they are installed.  The
 shorthand for
 @option{--with-hsa-runtime-lib=@/@var{hsainstalldir}/lib} and
 @option{--with-hsa-runtime-include=@/@var{hsainstalldir}/include}.
+
+@item --enable-cet
+@itemx --disable-cet
+Enable building target run-time libraries with control-flow
+instrumentation, see @option{-fcf-protection} option.  When
+@code{--enable-cet} is specified target libraries are configured
+to add @option{-fcf-protection} and, if needed, other target
+specific options to a set of building options.
+
+The option is enabled by default on Linux/x86 if target binutils
+supports @code{Intel CET} instructions.  In this case the target
+libraries are configured to get additional @option{-fcf-protection}
+and @option{-mcet} options.
 @end table
 
 @subheading Cross-Compiler-Specific Options
index a069cd79511557461386cb3e1333264225452cfd..da4d1adad91cd5b8737202711de6dd200cc248d6 100644 (file)
@@ -1,3 +1,21 @@
+2017-11-17  Igor Tsimbalist  <igor.v.tsimbalist@intel.com>
+
+       * Makefile.in (configure_deps): Add $(srcdir)/../config/cet.m4.
+       (CET_FLAGS): New.
+       * config/i386/morestack.S: Include <cet.h>.
+       (__morestack_large_model): Add _CET_ENDBR at function entrance.
+       * config/i386/resms64.h: Include <cet.h>.
+       * config/i386/resms64f.h: Likewise.
+       * config/i386/resms64fx.h: Likewise.
+       * config/i386/resms64x.h: Likewise.
+       * config/i386/savms64.h: Likewise.
+       * config/i386/savms64f.h: Likewise.
+       * config/i386/t-linux (HOST_LIBGCC2_CFLAGS): Add $(CET_FLAGS).
+       (CRTSTUFF_T_CFLAGS): Likewise.
+       * configure.ac: Include ../config/cet.m4.
+       Set and substitute CET_FLAGS.
+       * configure: Regenerated.
+
 2017-11-14  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
        * config.host (*-*-solaris2*): Adapt comment for Solaris 12
index a1a392de88d0e5c6b40cb73e59ca4f4698affa6e..eaa68b5c646a369c0280c2d38b75b87f3b205646 100644 (file)
@@ -171,7 +171,8 @@ configure_deps = \
        $(srcdir)/../config/dfp.m4 \
        $(srcdir)/../config/unwind_ipinfo.m4 \
        $(srcdir)/../config/gthr.m4 \
-       $(srcdir)/../config/sjlj.m4
+       $(srcdir)/../config/sjlj.m4 \
+       $(srcdir)/../config/cet.m4
 
 $(srcdir)/configure: @MAINT@ $(srcdir)/configure.ac $(configure_deps)
        cd $(srcdir) && $(AUTOCONF)
@@ -254,6 +255,8 @@ HOST_LIBGCC2_CFLAGS =
 
 PICFLAG = @PICFLAG@
 
+CET_FLAGS = @CET_FLAGS@
+
 # Defined in libgcc2.c, included only in the static library.
 LIB2FUNCS_ST = _eprintf __gcc_bcmp
 
index 9d185c111ea9d2dbcbcb66efa45342aa2b36d85a..79d5db949e909afa787d36e05158871ca2a0a0b5 100644 (file)
@@ -91,6 +91,8 @@
 # __morestack to call __morestack_non_split instead.  We just bump the
 # requested stack space by 16K.
 
+#include <cet.h>
+
        .global __morestack_non_split
        .hidden __morestack_non_split
 
@@ -701,6 +703,7 @@ DW.ref.__gcc_personality_v0:
 __morestack_large_model:
 
        .cfi_startproc
+       _CET_ENDBR
 
        movq    %r10, %r11
        andl    $0xffffffff, %r10d
index f01b41897bcd2de17f0208ec7b4376bb5702a872..45a42da158fb9265146eb03624c8403d06b59ec8 100644 (file)
@@ -23,6 +23,8 @@ a copy of the GCC Runtime Library Exception along with this program;
 see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 <http://www.gnu.org/licenses/>.  */
 
+#include <cet.h>
+
 #ifdef __x86_64__
 #include "i386-asm.h"
 
index 743ec514cef410b5bc9f068a338041512040e8ac..00805b33a1eab11879a708953752bd5dbaf7c07a 100644 (file)
@@ -23,6 +23,8 @@ a copy of the GCC Runtime Library Exception along with this program;
 see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 <http://www.gnu.org/licenses/>.  */
 
+#include <cet.h>
+
 #ifdef __x86_64__
 #include "i386-asm.h"
 
index 965807a129909d903fe8cb2f353d3d8ca396b13f..85083cd1b0766bef570ee920118dea26466e911b 100644 (file)
@@ -23,6 +23,8 @@ a copy of the GCC Runtime Library Exception along with this program;
 see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 <http://www.gnu.org/licenses/>.  */
 
+#include <cet.h>
+
 #ifdef __x86_64__
 #include "i386-asm.h"
 
index 689a1dec20bd84ec9f6d3d674097d624f232d2de..fcf885e23111fecc4f39e7ac3d8b0e83ed89ebc4 100644 (file)
@@ -23,6 +23,8 @@ a copy of the GCC Runtime Library Exception along with this program;
 see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 <http://www.gnu.org/licenses/>.  */
 
+#include <cet.h>
+
 #ifdef __x86_64__
 #include "i386-asm.h"
 
index 28d5e3548ab5dc801e17fc05cdaa4b70bc9eff6c..570902daf9d9baaffb59b6029705e02d86f8c760 100644 (file)
@@ -23,6 +23,8 @@ a copy of the GCC Runtime Library Exception along with this program;
 see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 <http://www.gnu.org/licenses/>.  */
 
+#include <cet.h>
+
 #ifdef __x86_64__
 #include "i386-asm.h"
 
index 723e1080f5c2ad2b23a00b45d7cc4821c2f85949..51c9d9704ae59adde414a352260c446f314cf32e 100644 (file)
@@ -23,6 +23,8 @@ a copy of the GCC Runtime Library Exception along with this program;
 see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 <http://www.gnu.org/licenses/>.  */
 
+#include <cet.h>
+
 #ifdef __x86_64__
 #include "i386-asm.h"
 
index 11bb46e0ee4f8e5555c69c6cd6b31b51ce7345f2..8506a6357908bf5ea0414145edac23929dcc390c 100644 (file)
@@ -3,4 +3,5 @@
 # t-slibgcc-elf-ver and t-linux
 SHLIB_MAPFILES = libgcc-std.ver $(srcdir)/config/i386/libgcc-glibc.ver
 
-HOST_LIBGCC2_CFLAGS += -mlong-double-80 -DUSE_ELF_SYMVER
+HOST_LIBGCC2_CFLAGS += -mlong-double-80 -DUSE_ELF_SYMVER $(CET_FLAGS)
+CRTSTUFF_T_CFLAGS += $(CET_FLAGS)
index 20169b18fe9376e8432bceff2573b70c169aa3d7..38a28c2a48fd81ca4f9baf8ec370b4c56682af1c 100644 (file)
@@ -573,6 +573,7 @@ vis_hide
 real_host_noncanonical
 accel_dir_suffix
 force_explicit_eh_registry
+CET_FLAGS
 fixed_point
 enable_decimal_float
 decimal_float
@@ -675,6 +676,7 @@ with_build_libsubdir
 enable_largefile
 enable_decimal_float
 with_system_libunwind
+enable_cet
 enable_explicit_exception_frame_registration
 with_glibc_version
 enable_tls
@@ -1314,6 +1316,8 @@ Optional Features:
                        enable decimal float extension to C.  Selecting 'bid'
                        or 'dpd' choses which decimal floating point format
                        to use
+  --enable-cet            enable Intel CET in target libraries
+                          [default=default]
   --enable-explicit-exception-frame-registration
                           register exception tables explicitly at module
                           start, for use e.g. for compatibility with
@@ -4773,6 +4777,74 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sjlj_exceptions" >&5
 $as_echo "$ac_cv_sjlj_exceptions" >&6; }
 
+ # 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
+
+
+
 # Check whether --enable-explicit-exception-frame-registration was given.
 if test "${enable_explicit_exception_frame_registration+set}" = set; then :
   enableval=$enable_explicit_exception_frame_registration;
index 53e77757aa8a5732c367d43bad56105e78b2f9ea..6e76a68bc0ce82b147e86bc3598b1d3e7ca7c17b 100644 (file)
@@ -11,6 +11,7 @@ sinclude(../config/dfp.m4)
 sinclude(../config/unwind_ipinfo.m4)
 sinclude(../config/gthr.m4)
 sinclude(../config/sjlj.m4)
+sinclude(../config/cet.m4)
 
 AC_PREREQ(2.64)
 AC_INIT([GNU C Runtime Library], 1.0,,[libgcc])
@@ -236,6 +237,9 @@ GCC_CHECK_UNWIND_GETIPINFO
 # Check if the compiler is configured for setjmp/longjmp exceptions.
 GCC_CHECK_SJLJ_EXCEPTIONS
 
+GCC_CET_FLAGS(CET_FLAGS)
+AC_SUBST(CET_FLAGS)
+
 AC_ARG_ENABLE([explicit-exception-frame-registration],
   [AC_HELP_STRING([--enable-explicit-exception-frame-registration],
      [register exception tables explicitly at module start, for use