mirror of
https://sourceware.org/git/glibc.git
synced 2025-01-08 18:30:18 +00:00
Save/restore bound registers for _dl_runtime_profile
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.
This commit is contained in:
parent
3c799e9131
commit
ea8ba7cd14
14
ChangeLog
14
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
|
||||
|
@ -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
|
||||
|
@ -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):
|
||||
|
@ -63,6 +63,20 @@
|
||||
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. */
|
||||
@ -222,6 +236,16 @@
|
||||
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)
|
||||
|
||||
@ -252,6 +276,16 @@
|
||||
VMOV LRV_VECTOR1_OFFSET(%rsp), %VEC(1)
|
||||
|
||||
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)
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user