about summary refs log tree commit diff
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)
downloadglibc-097eca29e8f769673b5ed1b335542719280a556e.tar.gz
glibc-097eca29e8f769673b5ed1b335542719280a556e.tar.xz
glibc-097eca29e8f769673b5ed1b335542719280a556e.zip
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 */