This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH][s390] Replace lll_futex_* assembly code with INTERNAL_SYSCALL


Hi,

The patch below replaces the assembly implementation of the
lll_futex_* macros in s390 lowlevellock.h with calls to the
INTERNAL_SYSCALL macro.  The aim is to reduce assembly language usage
where possible so that in future we have the opportunity (and I think
we do, based on my reading of the lowlevellock.h implementations in
various archs) to consolidate this code across architectures whenever
possible.

I've verified that this does not cause any regressions on s390x.

OK to commit once the freeze is lifted?


Siddhesh

nptl/ChangeLog:

	* sysdeps/unix/sysv/linux/s390/lowlevellock.h (SYS_futex):
	Remove definition.
	(lll_futex_timed_wait): Replace assembly code with
	INTERNAL_SYSCALL.
	(lll_futex_timed_wait_bitset): Likewise.
	(lll_futex_wake): Likewise.
	(lll_futex_requeue): Likewise.
	(lll_futex_wake_unlock): Likewise.

diff --git a/nptl/sysdeps/unix/sysv/linux/s390/lowlevellock.h b/nptl/sysdeps/unix/sysv/linux/s390/lowlevellock.h
index 0b7110f..e72d47e 100644
--- a/nptl/sysdeps/unix/sysv/linux/s390/lowlevellock.h
+++ b/nptl/sysdeps/unix/sysv/linux/s390/lowlevellock.h
@@ -25,7 +25,6 @@
 #include <atomic.h>
 #include <kernel-features.h>
 
-#define SYS_futex		238
 #define FUTEX_WAIT		0
 #define FUTEX_WAKE		1
 #define FUTEX_REQUEUE		3
@@ -76,60 +75,35 @@
 #define lll_futex_wait(futex, val, private) \
   lll_futex_timed_wait (futex, val, NULL, private)
 
-#define lll_futex_timed_wait(futex, val, timespec, private) \
+#define lll_futex_timed_wait(futexp, val, timespec, private) \
   ({									      \
-    register unsigned long int __r2 asm ("2") = (unsigned long int) (futex);  \
-    register unsigned long int __r3 asm ("3")				      \
-      = __lll_private_flag (FUTEX_WAIT, private);			      \
-    register unsigned long int __r4 asm ("4") = (unsigned long int) (val);    \
-    register unsigned long int __r5 asm ("5") = (unsigned long int)(timespec);\
-    register unsigned long int __result asm ("2");			      \
+    INTERNAL_SYSCALL_DECL (__err);					      \
 									      \
-    __asm __volatile ("svc %b1"						      \
-		      : "=d" (__result)					      \
-		      : "i" (SYS_futex), "0" (__r2), "d" (__r3),	      \
-			"d" (__r4), "d" (__r5)				      \
-		      : "cc", "memory" );				      \
-    __result;								      \
+    INTERNAL_SYSCALL (futex, __err, 4, (futexp),			      \
+		      __lll_private_flag (FUTEX_WAIT, private),		      \
+		      (val), (timespec));				      \
   })
 
 #define lll_futex_timed_wait_bitset(futexp, val, timespec, clockbit, private) \
   ({									      \
-    register unsigned long int __r2 asm ("2") = (unsigned long int) (futexp); \
-    register unsigned long int __r3 asm ("3")				      \
-      = __lll_private_flag ((FUTEX_WAIT_BITSET | clockbit), private);	      \
-    register unsigned long int __r4 asm ("4") = (long int) (val);	      \
-    register unsigned long int __r5 asm ("5") = (long int) (timespec);	      \
-    register unsigned long int __r6 asm ("6") = (unsigned long int) (NULL);   \
-    register unsigned long int __r7 asm ("7")				      \
-      = (unsigned int) (FUTEX_BITSET_MATCH_ANY);			      \
-    register unsigned long __result asm ("2");				      \
+    INTERNAL_SYSCALL_DECL (__err);					      \
+    int __op = FUTEX_WAIT_BITSET | clockbit;				      \
 									      \
-    __asm __volatile ("svc %b1"						      \
-		      : "=d" (__result)					      \
-		      : "i" (SYS_futex), "0" (__r2), "d" (__r3),	      \
-			"d" (__r4), "d" (__r5), "d" (__r6), "d" (__r7)	      \
-		      : "cc", "memory" );				      \
-    __result;								      \
+    INTERNAL_SYSCALL (futex, __err, 6, (futexp),			      \
+		      __lll_private_flag (__op, private),		      \
+		      (val), (timespec), NULL /* Unused.  */, 		      \
+		      FUTEX_BITSET_MATCH_ANY);				      \
   })
 
-
-#define lll_futex_wake(futex, nr, private) \
+#define lll_futex_wake(futexp, nr, private) \
   ({									      \
-    register unsigned long int __r2 asm ("2") = (unsigned long int) (futex);  \
-    register unsigned long int __r3 asm ("3")				      \
-      = __lll_private_flag (FUTEX_WAKE, private);			      \
-    register unsigned long int __r4 asm ("4") = (unsigned long int) (nr);     \
-    register unsigned long int __result asm ("2");			      \
+    INTERNAL_SYSCALL_DECL (__err);					      \
 									      \
-    __asm __volatile ("svc %b1"						      \
-		      : "=d" (__result)					      \
-		      : "i" (SYS_futex), "0" (__r2), "d" (__r3), "d" (__r4)   \
-		      : "cc", "memory" );				      \
-    __result;								      \
+    INTERNAL_SYSCALL (futex, __err, 4, (futexp),			      \
+		      __lll_private_flag (FUTEX_WAKE, private),		      \
+		      (nr), 0);						      \
   })
 
-
 #define lll_robust_dead(futexv, private) \
   do									      \
     {									      \
@@ -142,48 +116,30 @@
 
 
 /* Returns non-zero if error happened, zero if success.  */
-#define lll_futex_requeue(futex, nr_wake, nr_move, mutex, val, private) \
+#define lll_futex_requeue(futexp, nr_wake, nr_move, mutex, val, private) \
   ({									      \
-    register unsigned long int __r2 asm ("2") = (unsigned long int) (futex);  \
-    register unsigned long int __r3 asm ("3")				      \
-      = __lll_private_flag (FUTEX_CMP_REQUEUE, private);		      \
-    register unsigned long int __r4 asm ("4") = (long int) (nr_wake);	      \
-    register unsigned long int __r5 asm ("5") = (long int) (nr_move);	      \
-    register unsigned long int __r6 asm ("6") = (unsigned long int) (mutex);  \
-    register unsigned long int __r7 asm ("7") = (int) (val);		      \
-    register unsigned long __result asm ("2");				      \
+    INTERNAL_SYSCALL_DECL (__err);					      \
+    long int __ret;							      \
 									      \
-    __asm __volatile ("svc %b1"						      \
-		      : "=d" (__result)					      \
-		      : "i" (SYS_futex), "0" (__r2), "d" (__r3),	      \
-			"d" (__r4), "d" (__r5), "d" (__r6), "d" (__r7)	      \
-		      : "cc", "memory" );				      \
-    __result > -4096UL;							      \
+    __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp),		      \
+			      __lll_private_flag (FUTEX_CMP_REQUEUE, private),\
+			      (nr_wake), (nr_move), (mutex), (val));	      \
+    INTERNAL_SYSCALL_ERROR_P (__ret, __err);				      \
   })
 
-
 /* Returns non-zero if error happened, zero if success.  */
-#define lll_futex_wake_unlock(futex, nr_wake, nr_wake2, futex2, private) \
+#define lll_futex_wake_unlock(futexp, nr_wake, nr_wake2, futexp2, private) \
   ({									      \
-    register unsigned long int __r2 asm ("2") = (unsigned long int) (futex);  \
-    register unsigned long int __r3 asm ("3")				      \
-      = __lll_private_flag (FUTEX_WAKE_OP, private);			      \
-    register unsigned long int __r4 asm ("4") = (long int) (nr_wake);	      \
-    register unsigned long int __r5 asm ("5") = (long int) (nr_wake2);	      \
-    register unsigned long int __r6 asm ("6") = (unsigned long int) (futex2); \
-    register unsigned long int __r7 asm ("7")				      \
-      = (int) FUTEX_OP_CLEAR_WAKE_IF_GT_ONE;				      \
-    register unsigned long __result asm ("2");				      \
+    INTERNAL_SYSCALL_DECL (__err);					      \
+    long int __ret;							      \
 									      \
-    __asm __volatile ("svc %b1"						      \
-		      : "=d" (__result)					      \
-		      : "i" (SYS_futex), "0" (__r2), "d" (__r3),	      \
-			"d" (__r4), "d" (__r5), "d" (__r6), "d" (__r7)	      \
-		      : "cc", "memory" );				      \
-    __result > -4096UL;							      \
+    __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp),		      \
+			      __lll_private_flag (FUTEX_WAKE_OP, private),    \
+			      (nr_wake), (nr_wake2), (futexp2),		      \
+			      FUTEX_OP_CLEAR_WAKE_IF_GT_ONE);		      \
+    INTERNAL_SYSCALL_ERROR_P (__ret, __err);				      \
   })
 
-
 #define lll_compare_and_swap(futex, oldval, newval, operation) \
   do {									      \
     __typeof (futex) __futex = (futex);					      \
-- 
1.7.11.7


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]