i386: Insert ENDBR to trampoline for -fcf-protection=branch -mibt
authorH.J. Lu <hongjiu.lu@intel.com>
Tue, 27 Mar 2018 17:18:51 +0000 (17:18 +0000)
committerH.J. Lu <hjl@gcc.gnu.org>
Tue, 27 Mar 2018 17:18:51 +0000 (10:18 -0700)
When -fcf-protection=branch -mibt are used, we need to insert ENDBR
to trampoline.  TRAMPOLINE_SIZE is creased by 4 bytes to accommodate
4-byte ENDBR instruction.

gcc/

PR target/85044
* config/i386/i386.c (ix86_trampoline_init): Insert ENDBR for
-fcf-protection=branch -mibt.
* config/i386/i386.h (TRAMPOLINE_SIZE): Increased by 4 bytes.

gcc/testsuite/

PR target/85044
* gcc.target/i386/pr85044.c: New test.

From-SVN: r258897

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/config/i386/i386.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr85044.c [new file with mode: 0644]

index ff3afb208c518ff334db547c11c2d1c5923b04f5..a07d2ff7838d9ed47d73fa1e5d76829b27d469e8 100644 (file)
@@ -1,3 +1,10 @@
+2018-03-27  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR target/85044
+       * config/i386/i386.c (ix86_trampoline_init): Insert ENDBR for
+       -fcf-protection=branch -mibt.
+       * config/i386/i386.h (TRAMPOLINE_SIZE): Increased by 4 bytes.
+
 2018-03-27  Ramana Radhakrishnan  <ramana.radhakrishnan@arm.com>
 
        PR target/81863
index 3b264318f503425f0741f68467371eade254f0ba..b4f6aec14346a4960bd254e1b52aa990388a1ba6 100644 (file)
@@ -30411,6 +30411,7 @@ ix86_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
   rtx mem, fnaddr;
   int opcode;
   int offset = 0;
+  bool need_endbr = (flag_cf_protection & CF_BRANCH) && TARGET_IBT;
 
   fnaddr = XEXP (DECL_RTL (fndecl), 0);
 
@@ -30418,6 +30419,14 @@ ix86_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
     {
       int size;
 
+      if (need_endbr)
+       {
+         /* Insert ENDBR64.  */
+         mem = adjust_address (m_tramp, SImode, offset);
+         emit_move_insn (mem, gen_int_mode (0xfa1e0ff3, SImode));
+         offset += 4;
+       }
+
       /* Load the function address to r11.  Try to load address using
         the shorter movl instead of movabs.  We may want to support
         movq for kernel mode, but kernel does not use trampolines at
@@ -30495,6 +30504,14 @@ ix86_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
       else
        opcode = 0x68;
 
+      if (need_endbr)
+       {
+         /* Insert ENDBR32.  */
+         mem = adjust_address (m_tramp, SImode, offset);
+         emit_move_insn (mem, gen_int_mode (0xfb1e0ff3, SImode));
+         offset += 4;
+       }
+
       mem = adjust_address (m_tramp, QImode, offset);
       emit_move_insn (mem, gen_int_mode (opcode, QImode));
 
index 7f4b04f421dbbc9184857b101d5d94fcd305ed24..c7f9b4551b31c08528015fc4524d22fe00dcb36a 100644 (file)
@@ -1716,7 +1716,7 @@ typedef struct ix86_args {
 
 /* Length in units of the trampoline for entering a nested function.  */
 
-#define TRAMPOLINE_SIZE (TARGET_64BIT ? 24 : 10)
+#define TRAMPOLINE_SIZE (TARGET_64BIT ? 28 : 14)
 \f
 /* Definitions for register eliminations.
 
index a87d8a1779cc7c52857c02b5650a87bdff3569ec..be9044d644eb18b00918defb95582dd42e970641 100644 (file)
@@ -1,3 +1,8 @@
+2018-03-27  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR target/85044
+       * gcc.target/i386/pr85044.c: New test.
+
 2018-03-27  Martin Sebor  <msebor@redhat.com>
 
        PR testsuite/83462
diff --git a/gcc/testsuite/gcc.target/i386/pr85044.c b/gcc/testsuite/gcc.target/i386/pr85044.c
new file mode 100644 (file)
index 0000000..332f582
--- /dev/null
@@ -0,0 +1,24 @@
+/* { dg-do run { target cet } } */
+/* { dg-options "-O2 -fcf-protection=branch -mibt" } */
+
+void callme (void (*callback) (void));
+
+int
+main (void)
+{
+  int ok = 0;
+  void callback (void) { ok = 1; }
+
+  callme (&callback);
+
+  if (!ok)
+   __builtin_abort ();
+  return 0;
+}
+
+__attribute__((noinline, noclone))
+void
+callme (void (*callback) (void))
+{
+  (*callback) ();
+}