Save/restore bound registers for _dl_runtime_profile
authorIgor Zamyatin <igor.zamyatin@intel.com>
Wed, 16 Apr 2014 21:43:16 +0000 (14:43 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Wed, 16 Apr 2014 21:46:49 +0000 (14:46 -0700)
This patch saves and restores bound registers in x86-64 PLT for
ld.so profile and LD_AUDIT:

* sysdeps/x86_64/bits/link.h (La_x86_64_regs): Add lr_bnd.
(La_x86_64_retval): Add lrv_bnd0 and lrv_bnd1.
* sysdeps/x86_64/dl-trampoline.S (_dl_runtime_profile): Save
Intel MPX bound registers before _dl_profile_fixup.
* sysdeps/x86_64/dl-trampoline.h: Restore Intel MPX bound
registers after _dl_profile_fixup.  Save and restore bound
registers bnd0/bnd1 when calling _dl_call_pltexit.
* sysdeps/x86_64/link-defines.sym (BND_SIZE): New.
(LR_BND_OFFSET): Likewise.
(LRV_BND0_OFFSET): Likewise.
(LRV_BND1_OFFSET): Likewise.

ChangeLog
sysdeps/x86/bits/link.h
sysdeps/x86_64/dl-trampoline.S
sysdeps/x86_64/dl-trampoline.h
sysdeps/x86_64/link-defines.sym

index 7227709..5efa3ca 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2014-04-16  Igor Zamyatin  <igor.zamyatin@intel.com>
+
+       * sysdeps/x86_64/bits/link.h (La_x86_64_regs): Add lr_bnd.
+       (La_x86_64_retval): Add lrv_bnd0 and lrv_bnd1.
+       * sysdeps/x86_64/dl-trampoline.S (_dl_runtime_profile): Save
+       Intel MPX bound registers before _dl_profile_fixup.
+       * sysdeps/x86_64/dl-trampoline.h: Restore Intel MPX bound
+       registers after _dl_profile_fixup.  Save and restore bound
+       registers bnd0/bnd1 when calling _dl_call_pltexit.
+       * sysdeps/x86_64/link-defines.sym (BND_SIZE): New.
+       (LR_BND_OFFSET): Likewise.
+       (LRV_BND0_OFFSET): Likewise.
+       (LRV_BND1_OFFSET): Likewise.
+
 2014-04-16  Samuel Thibault  <samuel.thibault@ens-lyon.org>
 
        * sysdeps/mach/hurd/tls.h (dtv, dtv_t, tcbhead_t): Move declarations
index 8673b21..82522e5 100644 (file)
@@ -93,6 +93,9 @@ typedef struct La_x86_64_regs
   uint64_t lr_rsp;
   La_x86_64_xmm lr_xmm[8];
   La_x86_64_vector lr_vector[8];
+#ifndef __ILP32__
+  __int128 lr_bnd[4];
+#endif
 } La_x86_64_regs;
 
 /* Return values for calls from PLT on x86-64.  */
@@ -106,6 +109,10 @@ typedef struct La_x86_64_retval
   long double lrv_st1;
   La_x86_64_vector lrv_vector0;
   La_x86_64_vector lrv_vector1;
+#ifndef __ILP32__
+  __int128 lrv_bnd0;
+  __int128 lrv_bnd1;
+#endif
 } La_x86_64_retval;
 
 #define La_x32_regs La_x86_64_regs
index 3c0f542..bf3cff7 100644 (file)
@@ -189,6 +189,20 @@ _dl_runtime_profile:
        movaps %xmm6, (LR_XMM_OFFSET + XMM_SIZE*6)(%rsp)
        movaps %xmm7, (LR_XMM_OFFSET + XMM_SIZE*7)(%rsp)
 
+# ifndef __ILP32__
+#  ifdef HAVE_MPX_SUPPORT
+       bndmov %bnd0,              (LR_BND_OFFSET)(%rsp)  # Preserve bound
+       bndmov %bnd1, (LR_BND_OFFSET +   BND_SIZE)(%rsp)  # registers. Nops if
+       bndmov %bnd2, (LR_BND_OFFSET + BND_SIZE*2)(%rsp)  # MPX not available
+       bndmov %bnd3, (LR_BND_OFFSET + BND_SIZE*3)(%rsp)  # or disabled.
+#  else
+       .byte 0x66,0x0f,0x1b,0x84,0x24;.long (LR_BND_OFFSET)
+       .byte 0x66,0x0f,0x1b,0x8c,0x24;.long (LR_BND_OFFSET + BND_SIZE)
+       .byte 0x66,0x0f,0x1b,0x84,0x24;.long (LR_BND_OFFSET + BND_SIZE*2)
+       .byte 0x66,0x0f,0x1b,0x8c,0x24;.long (LR_BND_OFFSET + BND_SIZE*3)
+#  endif
+# endif
+
 # if defined HAVE_AVX_SUPPORT || defined HAVE_AVX512_ASM_SUPPORT
        .data
 L(have_avx):
index 161af0f..416ed0e 100644 (file)
        movaps (LR_XMM_OFFSET + XMM_SIZE*6)(%rsp), %xmm6
        movaps (LR_XMM_OFFSET + XMM_SIZE*7)(%rsp), %xmm7
 
+#ifndef __ILP32__
+# ifdef HAVE_MPX_SUPPORT
+       bndmov              (LR_BND_OFFSET)(%rsp), %bnd0  # Restore bound
+       bndmov (LR_BND_OFFSET +   BND_SIZE)(%rsp), %bnd1  # registers.
+       bndmov (LR_BND_OFFSET + BND_SIZE*2)(%rsp), %bnd2
+       bndmov (LR_BND_OFFSET + BND_SIZE*3)(%rsp), %bnd3
+# else
+       .byte 0x66,0x0f,0x1a,0x84,0x24;.long (LR_BND_OFFSET)
+       .byte 0x66,0x0f,0x1a,0x8c,0x24;.long (LR_BND_OFFSET + BND_SIZE)
+       .byte 0x66,0x0f,0x1a,0x94,0x24;.long (LR_BND_OFFSET + BND_SIZE*2)
+       .byte 0x66,0x0f,0x1a,0x9c,0x24;.long (LR_BND_OFFSET + BND_SIZE*3)
+# endif
+#endif
+
 #ifdef RESTORE_AVX
        /* Check if any xmm0-xmm7 registers are changed by audit
           module.  */
        vmovdqa %xmm1, (LRV_SIZE + XMM_SIZE)(%rcx)
 #endif
 
+#ifndef __ILP32__
+# ifdef HAVE_MPX_SUPPORT
+       bndmov %bnd0, LRV_BND0_OFFSET(%rcx)  # Preserve returned bounds.
+       bndmov %bnd1, LRV_BND1_OFFSET(%rcx)
+# else
+       .byte  0x66,0x0f,0x1b,0x81;.long (LRV_BND0_OFFSET)
+       .byte  0x66,0x0f,0x1b,0x89;.long (LRV_BND1_OFFSET)
+# endif
+#endif
+
        fstpt LRV_ST0_OFFSET(%rcx)
        fstpt LRV_ST1_OFFSET(%rcx)
 
 1:
 #endif
 
+#ifndef __ILP32__
+# ifdef HAVE_MPX_SUPPORT
+       bndmov LRV_BND0_OFFSET(%rcx), %bnd0  # Restore bound registers.
+       bndmov LRV_BND1_OFFSET(%rcx), %bnd1
+# else
+       .byte  0x66,0x0f,0x1a,0x81;.long (LRV_BND0_OFFSET)
+       .byte  0x66,0x0f,0x1a,0x89;.long (LRV_BND1_OFFSET)
+# endif
+#endif
+
        fldt LRV_ST1_OFFSET(%rsp)
        fldt LRV_ST0_OFFSET(%rsp)
 
index 85d35ad..862fa22 100644 (file)
@@ -6,6 +6,7 @@ VECTOR_SIZE             sizeof (La_x86_64_vector)
 XMM_SIZE               sizeof (La_x86_64_xmm)
 YMM_SIZE               sizeof (La_x86_64_ymm)
 ZMM_SIZE               sizeof (La_x86_64_zmm)
+BND_SIZE               sizeof (__int128)
 
 LR_SIZE                        sizeof (struct La_x86_64_regs)
 LR_RDX_OFFSET          offsetof (struct La_x86_64_regs, lr_rdx)
@@ -18,6 +19,9 @@ LR_RBP_OFFSET         offsetof (struct La_x86_64_regs, lr_rbp)
 LR_RSP_OFFSET          offsetof (struct La_x86_64_regs, lr_rsp)
 LR_XMM_OFFSET          offsetof (struct La_x86_64_regs, lr_xmm)
 LR_VECTOR_OFFSET       offsetof (struct La_x86_64_regs, lr_vector)
+#ifndef __ILP32__
+LR_BND_OFFSET          offsetof (struct La_x86_64_regs, lr_bnd)
+#endif
 
 LRV_SIZE               sizeof (struct La_x86_64_retval)
 LRV_RAX_OFFSET         offsetof (struct La_x86_64_retval, lrv_rax)
@@ -28,3 +32,7 @@ LRV_ST0_OFFSET                offsetof (struct La_x86_64_retval, lrv_st0)
 LRV_ST1_OFFSET         offsetof (struct La_x86_64_retval, lrv_st1)
 LRV_VECTOR0_OFFSET     offsetof (struct La_x86_64_retval, lrv_vector0)
 LRV_VECTOR1_OFFSET     offsetof (struct La_x86_64_retval, lrv_vector1)
+#ifndef __ILP32__
+LRV_BND0_OFFSET                offsetof (struct La_x86_64_retval, lrv_bnd0)
+LRV_BND1_OFFSET                offsetof (struct La_x86_64_retval, lrv_bnd1)
+#endif