about summary refs log tree commit diff
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2015-03-16 14:58:43 -0700
committerH.J. Lu <hjl.tools@gmail.com>2015-03-16 14:59:14 -0700
commitb97eb2bdb1ed72982a7821c3078be591051cef59 (patch)
tree0e4dff94f79c7c5abd178f7f66f0d777134afdb8
parentcb219290492995bb52fba8c21f9f20afe5604721 (diff)
downloadglibc-b97eb2bdb1ed72982a7821c3078be591051cef59.tar.gz
glibc-b97eb2bdb1ed72982a7821c3078be591051cef59.tar.xz
glibc-b97eb2bdb1ed72982a7821c3078be591051cef59.zip
Preserve bound registers in _dl_runtime_resolve
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.
-rw-r--r--ChangeLog5
-rw-r--r--sysdeps/x86_64/dl-trampoline.S8
2 files changed, 13 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index c856f796e0..db321c4f85 100644
--- 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.
diff --git a/sysdeps/x86_64/dl-trampoline.S b/sysdeps/x86_64/dl-trampoline.S
index 394441dd40..5f9b35dc3f 100644
--- a/sysdeps/x86_64/dl-trampoline.S
+++ b/sysdeps/x86_64/dl-trampoline.S
@@ -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.  */
@@ -40,6 +41,11 @@
 # 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