summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLiubov Dmitrieva <liubov.dmitrieva@intel.com>2013-01-25 18:40:50 +0400
committerLiubov Dmitrieva <ldmitrie@sourceware.org>2013-10-23 19:07:37 +0400
commit7838e39881b61895ae13a15cf86ad041c75593de (patch)
tree973756a8835f2f7840a7b8378ea80f4af6cb10ff
parent36aee6bb45b54f2d242e256b5e596838c18c0b85 (diff)
downloadglibc-7838e39881b61895ae13a15cf86ad041c75593de.tar.gz
Intel MPX support for x86_64 and x86_32 pthread routines.
Always use INIT bounds in __tls_get_addr. Set bounds manually in _Unwind_Resume.
-rw-r--r--elf/dl-tls.c3
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S82
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S63
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/pthread_once.S9
-rw-r--r--nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S49
-rw-r--r--nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S37
-rw-r--r--sysdeps/gnu/unwind-resume.c3
7 files changed, 238 insertions, 8 deletions
diff --git a/elf/dl-tls.c b/elf/dl-tls.c
index 576d9a1465..ee84fa6dab 100644
--- a/elf/dl-tls.c
+++ b/elf/dl-tls.c
@@ -767,6 +767,9 @@ update_get_addr (GET_ADDR_ARGS)
void *
__tls_get_addr (GET_ADDR_ARGS)
{
+#ifdef __CHKP__
+ GET_ADDR_PARAM = __bnd_init_ptr_bounds(GET_ADDR_PARAM);
+#endif
dtv_t *dtv = THREAD_DTV ();
if (__builtin_expect (dtv[0].counter != GL(dl_tls_generation), 0))
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S
index a6d6bc460a..c0b107aa12 100644
--- a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S
+++ b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S
@@ -94,6 +94,13 @@ __pthread_cond_timedwait:
je .Lreltmo
#endif
+#if defined __CHKP__ || defined __CHKWR__
+ bndldx (%esp,%ebx,1), %bnd0
+ bndldx 28(%esp,%ebp,1), %bnd2
+ bndmov %bnd0, 48(%esp)
+ bndmov %bnd2, 80(%esp)
+#endif
+
/* Get internal lock. */
movl $1, %edx
xorl %eax, %eax
@@ -109,12 +116,24 @@ __pthread_cond_timedwait:
different value in there this is a bad user bug. */
2: cmpl $-1, dep_mutex(%ebx)
movl 24(%esp), %eax
+#if defined __CHKP__ || defined __CHKWR__
+ bndldx 4(%esp,%eax,1), %bnd1
+ bndmov %bnd1, 64(%esp)
+#endif
je 17f
movl %eax, dep_mutex(%ebx)
/* Unlock the mutex. */
17: xorl %edx, %edx
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov %bnd1, %bnd0
+#endif
call __pthread_mutex_unlock_usercnt
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov 48(%esp), %bnd0
+ bndmov 64(%esp), %bnd1
+ bndmov 80(%esp), %bnd2
+#endif
testl %eax, %eax
jne 16f
@@ -296,9 +315,25 @@ __pthread_cond_timedwait:
should always succeed or else the kernel did not lock the mutex
correctly. */
movl dep_mutex(%ebx), %eax
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov %bnd1, %bnd0
+#endif
call __pthread_mutex_cond_lock_adjust
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov 48(%esp), %bnd0
+ bndmov 64(%esp), %bnd1
+ bndmov 80(%esp), %bnd2
+#endif
xorl %edx, %edx
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov %bnd1, %bnd0
+#endif
call __pthread_mutex_unlock_usercnt
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov 48(%esp), %bnd0
+ bndmov 64(%esp), %bnd1
+ bndmov 80(%esp), %bnd2
+#endif
jmp 8b
28: addl $1, wakeup_seq(%ebx)
@@ -356,8 +391,15 @@ __pthread_cond_timedwait:
movl 16(%esp), %ecx
testl %ecx, %ecx
jnz 27f
-
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov %bnd1, %bnd0
+#endif
call __pthread_mutex_cond_lock
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov 48(%esp), %bnd0
+ bndmov 64(%esp), %bnd1
+ bndmov 80(%esp), %bnd2
+#endif
26: addl $FRAME_SIZE, %esp
cfi_adjust_cfa_offset(-FRAME_SIZE)
@@ -388,7 +430,16 @@ __pthread_cond_timedwait:
cfi_restore_state
-27: call __pthread_mutex_cond_lock_adjust
+27:
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov %bnd1, %bnd0
+#endif
+ call __pthread_mutex_cond_lock_adjust
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov 48(%esp), %bnd0
+ bndmov 64(%esp), %bnd1
+ bndmov 80(%esp), %bnd2
+#endif
xorl %eax, %eax
jmp 26b
@@ -529,7 +580,15 @@ __pthread_cond_timedwait:
/* Unlock the mutex. */
117: xorl %edx, %edx
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov %bnd1, %bnd0
+#endif
call __pthread_mutex_unlock_usercnt
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov 48(%esp), %bnd0
+ bndmov 64(%esp), %bnd1
+ bndmov 80(%esp), %bnd2
+#endif
testl %eax, %eax
jne 16b
@@ -899,10 +958,27 @@ __condvar_tw_cleanup:
cmpl %ebx, %gs:TID
jne 8f
/* We managed to get the lock. Fix it up before returning. */
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov %bnd1, %bnd0
+#endif
call __pthread_mutex_cond_lock_adjust
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov 48(%esp), %bnd0
+ bndmov 64(%esp), %bnd1
+ bndmov 80(%esp), %bnd2
+#endif
jmp 9f
-8: call __pthread_mutex_cond_lock
+8:
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov %bnd1, %bnd0
+#endif
+ call __pthread_mutex_cond_lock
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov 48(%esp), %bnd0
+ bndmov 64(%esp), %bnd1
+ bndmov 80(%esp), %bnd2
+#endif
9: movl %esi, (%esp)
.LcallUR:
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S
index 9695dcb0ae..0a9125a14a 100644
--- a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S
+++ b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S
@@ -60,6 +60,10 @@ __pthread_cond_wait:
xorl %esi, %esi
movl 20(%esp), %ebx
+#if defined __CHKP__ || defined __CHKWR__
+ bndldx (%esp,%ebx,1), %bnd0
+ bndmov %bnd0, 32(%esp)
+#endif
LIBC_PROBE (cond_wait, 2, 24(%esp), %ebx)
@@ -78,12 +82,23 @@ __pthread_cond_wait:
different value in there this is a bad user bug. */
2: cmpl $-1, dep_mutex(%ebx)
movl 24(%esp), %eax
+#if defined __CHKP__ || defined __CHKWR__
+ bndldx 4(%esp,%eax,1), %bnd1
+ bndmov %bnd1, 48(%esp)
+#endif
je 15f
movl %eax, dep_mutex(%ebx)
/* Unlock the mutex. */
15: xorl %edx, %edx
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov %bnd1, %bnd0
+#endif
call __pthread_mutex_unlock_usercnt
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov 32(%esp), %bnd0
+ bndmov 48(%esp), %bnd1
+#endif
testl %eax, %eax
jne 12f
@@ -270,7 +285,14 @@ __pthread_cond_wait:
testl %ecx, %ecx
jnz 21f
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov %bnd1, %bnd0
+#endif
call __pthread_mutex_cond_lock
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov 32(%esp), %bnd0
+ bndmov 48(%esp), %bnd1
+#endif
20: addl $FRAME_SIZE, %esp
cfi_adjust_cfa_offset(-FRAME_SIZE);
@@ -292,7 +314,15 @@ __pthread_cond_wait:
cfi_restore_state
-21: call __pthread_mutex_cond_lock_adjust
+21:
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov %bnd1, %bnd0
+#endif
+ call __pthread_mutex_cond_lock_adjust
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov 32(%esp), %bnd0
+ bndmov 48(%esp), %bnd1
+#endif
xorl %eax, %eax
jmp 20b
@@ -308,9 +338,23 @@ __pthread_cond_wait:
should always succeed or else the kernel did not lock the mutex
correctly. */
movl dep_mutex(%ebx), %eax
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov %bnd1, %bnd0
+#endif
call __pthread_mutex_cond_lock_adjust
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov 32(%esp), %bnd0
+ bndmov 48(%esp), %bnd1
+#endif
xorl %edx, %edx
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov %bnd1, %bnd0
+#endif
call __pthread_mutex_unlock_usercnt
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov 32(%esp), %bnd0
+ bndmov 48(%esp), %bnd1
+#endif
jmp 8b
/* Initial locking failed. */
@@ -581,10 +625,25 @@ __condvar_w_cleanup:
cmpl %ebx, %gs:TID
jne 8f
/* We managed to get the lock. Fix it up before returning. */
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov %bnd1, %bnd0
+#endif
call __pthread_mutex_cond_lock_adjust
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov 32(%esp), %bnd0
+ bndmov 48(%esp), %bnd1
+#endif
jmp 9f
-8: call __pthread_mutex_cond_lock
+8:
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov %bnd1, %bnd0
+#endif
+ call __pthread_mutex_cond_lock
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov 32(%esp), %bnd0
+ bndmov 48(%esp), %bnd1
+#endif
9: movl %esi, (%esp)
.LcallUR:
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/pthread_once.S b/nptl/sysdeps/unix/sysv/linux/i386/pthread_once.S
index b405b9e21e..9e67f270c0 100644
--- a/nptl/sysdeps/unix/sysv/linux/i386/pthread_once.S
+++ b/nptl/sysdeps/unix/sysv/linux/i386/pthread_once.S
@@ -114,6 +114,9 @@ __pthread_once:
jne 7f
leal 8(%esp), %eax
+#if defined __CHKP__ || defined __CHKWR__
+ bndldx 8(%esp,%eax,1), %bnd0
+#endif
call HIDDEN_JUMPTARGET(__pthread_register_cancel)
/* Call the user-provided initialization function. */
@@ -121,6 +124,9 @@ __pthread_once:
/* Pop the cleanup handler. */
leal 8(%esp), %eax
+#if defined __CHKP__ || defined __CHKWR__
+ bndldx 8(%esp,%eax,1), %bnd0
+#endif
call HIDDEN_JUMPTARGET(__pthread_unregister_cancel)
addl $UNWINDBUFSIZE+8, %esp
cfi_adjust_cfa_offset (-UNWINDBUFSIZE-8)
@@ -168,6 +174,9 @@ __pthread_once:
ENTER_KERNEL
leal 8(%esp), %eax
+#if defined __CHKP__ || defined __CHKWR__
+ bndldx 8(%esp,%eax,1), %bnd0
+#endif
call HIDDEN_JUMPTARGET (__pthread_unwind_next)
/* NOTREACHED */
hlt
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S
index 6c1a75fd47..e30845dfce 100644
--- a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S
+++ b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S
@@ -99,6 +99,12 @@ __pthread_cond_timedwait:
movq %rsi, 16(%rsp)
movq %rdx, %r13
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov %bnd0, 72(%rsp)
+ bndmov %bnd1, 88(%rsp)
+ bndmov %bnd2, 104(%rsp)
+#endif
+
je 22f
mov %RSI_LP, dep_mutex(%rdi)
@@ -128,7 +134,15 @@ __pthread_cond_timedwait:
/* Unlock the mutex. */
32: movq 16(%rsp), %rdi
xorl %esi, %esi
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov %bnd1, %bnd0
+#endif
callq __pthread_mutex_unlock_usercnt
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov 72(%rsp), %bnd0
+ bndmov 88(%rsp), %bnd1
+ bndmov 104(%rsp), %bnd2
+#endif
testl %eax, %eax
jne 46f
@@ -338,7 +352,15 @@ __pthread_cond_timedwait:
testb %r15b, %r15b
jnz 64f
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov %bnd1, %bnd0
+#endif
callq __pthread_mutex_cond_lock
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov 72(%rsp), %bnd0
+ bndmov 88(%rsp), %bnd1
+ bndmov 104(%rsp), %bnd2
+#endif
63: testq %rax, %rax
cmoveq %r14, %rax
@@ -362,7 +384,16 @@ __pthread_cond_timedwait:
cfi_restore_state
-64: callq __pthread_mutex_cond_lock_adjust
+64:
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov %bnd1, %bnd0
+#endif
+ callq __pthread_mutex_cond_lock_adjust
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov 72(%rsp), %bnd0
+ bndmov 88(%rsp), %bnd1
+ bndmov 104(%rsp), %bnd2
+#endif
movq %r14, %rax
jmp 48b
@@ -457,7 +488,15 @@ __pthread_cond_timedwait:
/* Unlock the mutex. */
2: movq 16(%rsp), %rdi
xorl %esi, %esi
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov %bnd1, %bnd0
+#endif
callq __pthread_mutex_unlock_usercnt
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov 72(%rsp), %bnd0
+ bndmov 88(%rsp), %bnd1
+ bndmov 104(%rsp), %bnd2
+#endif
testl %eax, %eax
jne 46b
@@ -786,7 +825,15 @@ __condvar_cleanup2:
cmpl %eax, %fs:TID
jne 7f
/* We managed to get the lock. Fix it up before returning. */
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov %bnd1, %bnd0
+#endif
callq __pthread_mutex_cond_lock_adjust
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov 72(%rsp), %bnd0
+ bndmov 88(%rsp), %bnd1
+ bndmov 104(%rsp), %bnd2
+#endif
jmp 8f
7: callq __pthread_mutex_cond_lock
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S
index f0f6683b7f..3338497cd7 100644
--- a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S
+++ b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S
@@ -74,6 +74,11 @@ __pthread_cond_wait:
movq %rdi, 8(%rsp)
movq %rsi, 16(%rsp)
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov %bnd0, 32(%rsp)
+ bndmov %bnd1, 48(%rsp)
+#endif
+
je 15f
mov %RSI_LP, dep_mutex(%rdi)
@@ -91,7 +96,14 @@ __pthread_cond_wait:
/* Unlock the mutex. */
2: movq 16(%rsp), %rdi
xorl %esi, %esi
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov %bnd1, %bnd0
+#endif
callq __pthread_mutex_unlock_usercnt
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov 32(%rsp), %bnd0
+ bndmov 48(%rsp), %bnd1
+#endif
testl %eax, %eax
jne 12f
@@ -256,7 +268,14 @@ __pthread_cond_wait:
testb %r8b, %r8b
jnz 18f
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov %bnd1, %bnd0
+#endif
callq __pthread_mutex_cond_lock
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov 32(%rsp), %bnd0
+ bndmov 48(%rsp), %bnd1
+#endif
14: leaq FRAME_SIZE(%rsp), %rsp
cfi_adjust_cfa_offset(-FRAME_SIZE)
@@ -266,7 +285,15 @@ __pthread_cond_wait:
cfi_adjust_cfa_offset(FRAME_SIZE)
-18: callq __pthread_mutex_cond_lock_adjust
+18:
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov %bnd1, %bnd0
+#endif
+ callq __pthread_mutex_cond_lock_adjust
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov 32(%rsp), %bnd0
+ bndmov 48(%rsp), %bnd1
+#endif
xorl %eax, %eax
jmp 14b
@@ -510,10 +537,16 @@ __condvar_cleanup1:
cmpl %eax, %fs:TID
jne 7f
/* We managed to get the lock. Fix it up before returning. */
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov %bnd1, %bnd0
+#endif
callq __pthread_mutex_cond_lock_adjust
+#if defined __CHKP__ || defined __CHKWR__
+ bndmov 32(%rsp), %bnd0
+ bndmov 48(%rsp), %bnd1
+#endif
jmp 8f
-
7: callq __pthread_mutex_cond_lock
8: movq 24(%rsp), %rdi
diff --git a/sysdeps/gnu/unwind-resume.c b/sysdeps/gnu/unwind-resume.c
index df845cd45b..19e06b20d2 100644
--- a/sysdeps/gnu/unwind-resume.c
+++ b/sysdeps/gnu/unwind-resume.c
@@ -46,6 +46,9 @@ init (void)
void
_Unwind_Resume (struct _Unwind_Exception *exc)
{
+#ifdef __CHKP__
+ exc = (struct _Unwind_Exception *) __bnd_set_ptr_bounds (exc, sizeof (struct _Unwind_Exception));
+#endif
if (__builtin_expect (libgcc_s_resume == NULL, 0))
init ();
libgcc_s_resume (exc);