summaryrefslogtreecommitdiff
path: root/nptl/sysdeps/unix/sysv/linux/i386/lowlevelsem.h
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2002-12-20 07:12:24 +0000
committerUlrich Drepper <drepper@redhat.com>2002-12-20 07:12:24 +0000
commit097eca29e8f769673b5ed1b335542719280a556e (patch)
treeaa70ad74f87ac91b5686399c41c2ff9ffbbe877e /nptl/sysdeps/unix/sysv/linux/i386/lowlevelsem.h
parent5f5843e30dda46ffc443c492959e206530837c98 (diff)
Update.
* sysdeps/unix/sysv/linux/i386/pthread_once.S: Use ENTER_KERNEL instead of int $0x80. * sysdeps/unix/sysv/linux/i386/i486/libc-lowlevellock.S: Likewise. * sysdeps/unix/sysv/linux/i386/i486/libc-lowlevelmutex.S: Likewise. * sysdeps/unix/sysv/linux/i386/i486/lowlevelcond.S: Likewise. * sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S: Likewise. * sysdeps/unix/sysv/linux/i386/i486/lowlevelmutex.S: Likewise. * sysdeps/unix/sysv/linux/i386/i486/lowlevelrwlock.S: Likewise. * sysdeps/unix/sysv/linux/i386/i486/lowlevelsem.S: Likewise. * sysdeps/unix/sysv/linux/i386/i486/pthread_barrier_wait.S: Likewise. * sysdeps/unix/sysv/linux/i386/lowlevellock.h: Add support for using sysenter. * sysdeps/unix/sysv/linux/i386/lowlevelsem.h: Likewise. * sysdeps/i386/tls.h: Unconditionally include <dl-sysdep.h>.
Diffstat (limited to 'nptl/sysdeps/unix/sysv/linux/i386/lowlevelsem.h')
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/lowlevelsem.h23
1 files changed, 19 insertions, 4 deletions
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/lowlevelsem.h b/nptl/sysdeps/unix/sysv/linux/i386/lowlevelsem.h
index bd5f96402b..59c1602ddb 100644
--- a/nptl/sysdeps/unix/sysv/linux/i386/lowlevelsem.h
+++ b/nptl/sysdeps/unix/sysv/linux/i386/lowlevelsem.h
@@ -20,6 +20,9 @@
#ifndef _LOWLEVELSEM_H
#define _LOWLEVELSEM_H 1
+#include <dl-sysdep.h>
+#include <tls.h>
+
#ifndef LOCK
# ifdef UP
# define LOCK /* nothing */
@@ -31,6 +34,16 @@
#define SYS_futex 240
+#ifdef I386_USE_SYSENTER
+# ifdef SHARED
+# define LLL_SEM_ENTER_KERNEL(arg) "call *%%gs:%P" #arg "\n\t"
+# else
+# define LLL_SEM_ENTER_KERNEL(arg) "call *_dl_sysinfo\n\t"
+# endif
+#else
+# define LLL_SEM_ENTER_KERNEL(arg) "int $0x80\n\t"
+#endif
+
#define lll_sem_wait(sem) \
({ int result, ignore1, ignore2; \
__asm __volatile ("1:\tincl 8(%4)\n\t" \
@@ -46,7 +59,7 @@
"movl %%esi, %%edx\n\t" \
"leal 4(%4), %%ebx\n\t" \
"movl %5, %%eax\n\t" \
- "int $0x80\n\t" \
+ LLL_SEM_ENTER_KERNEL (9) \
"movl %%eax, %%edx\n\t" \
"popl %%ebx\n\t" \
"orl $-1, %%eax\n\t" \
@@ -68,7 +81,8 @@
: "=a" (result), "=c" (ignore1), "=d" (ignore2), \
"=m" (*sem) \
: "D" (sem), "i" (SYS_futex), "S" (0), \
- "i" (-EINTR), "i" (EINTR)); \
+ "i" (-EINTR), "i" (EINTR), \
+ "i" (offsetof (tcbhead_t, sysinfo))); \
result; })
@@ -91,11 +105,12 @@ extern int __lll_sem_timedwait (struct sem *sem, const struct timespec *ts)
"movl %5, %%eax\n\t" \
/* movl $FUTEX_WAKE, %ecx */ \
"movl $1, %%ecx\n\t" \
- "int $0x80\n\t" \
+ LLL_SEM_ENTER_KERNEL (6) \
"popl %%ebx\n\t" \
"popl %%esi" \
: "=&a" (ignore1), "=c" (ignore2), \
"=m" (*sem), "=d" (ignore3) \
- : "r" (sem), "i" (SYS_futex)); })
+ : "r" (sem), "i" (SYS_futex), \
+ "i" (offsetof (tcbhead_t, sysinfo))); })
#endif /* lowlevelsem.h */