Preserve bound registers in _dl_runtime_resolve
authorH.J. Lu <hjl.tools@gmail.com>
Mon, 16 Mar 2015 21:58:43 +0000 (14:58 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Mon, 16 Mar 2015 21:59:14 +0000 (14:59 -0700)
We need to add a BND prefix before indirect branch at the end of
_dl_runtime_resolve to preserve bound registers.

[BZ #18134]
* sysdeps/x86_64/dl-trampoline.S (PRESERVE_BND_REGS_PREFIX): New.
(_dl_runtime_resolve): Add a BND prefix before indirect branch.

ChangeLog
sysdeps/x86_64/dl-trampoline.S

index c856f79..db321c4 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2015-03-16  H.J. Lu  <hongjiu.lu@intel.com>
+
+       [BZ #18134]
+       * sysdeps/x86_64/dl-trampoline.S (PRESERVE_BND_REGS_PREFIX): New.
+
 2015-03-15  Paul Eggert  <eggert@cs.ucla.edu>
 
        * stdlib/setenv.c (__add_to_environ): Revert previous change.
index 394441d..5f9b35d 100644 (file)
@@ -30,6 +30,7 @@
 /* X32 saves RCX, RDX, RSI, RDI, R8 and R9 plus RAX.  */
 # define REGISTER_SAVE_AREA    (8 * 7)
 # define REGISTER_SAVE_RAX     0
+# define PRESERVE_BND_REGS_PREFIX
 #else
 /* X86-64 saves RCX, RDX, RSI, RDI, R8 and R9 plus RAX as well as BND0,
    BND1, BND2, BND3.  */
 # define REGISTER_SAVE_BND2    (REGISTER_SAVE_BND1 + 16)
 # define REGISTER_SAVE_BND3    (REGISTER_SAVE_BND2 + 16)
 # define REGISTER_SAVE_RAX     (REGISTER_SAVE_BND3 + 16)
+# ifdef HAVE_MPX_SUPPORT
+#  define PRESERVE_BND_REGS_PREFIX bnd
+# else
+#  define PRESERVE_BND_REGS_PREFIX .byte 0xf2
+# endif
 #endif
 #define REGISTER_SAVE_RCX      (REGISTER_SAVE_RAX + 8)
 #define REGISTER_SAVE_RDX      (REGISTER_SAVE_RCX + 8)
@@ -112,6 +118,8 @@ _dl_runtime_resolve:
        # Adjust stack(PLT did 2 pushes)
        addq $(REGISTER_SAVE_AREA + 16), %rsp
        cfi_adjust_cfa_offset(-(REGISTER_SAVE_AREA + 16))
+       # Preserve bound registers.
+       PRESERVE_BND_REGS_PREFIX
        jmp *%r11               # Jump to function address.
        cfi_endproc
        .size _dl_runtime_resolve, .-_dl_runtime_resolve