This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH][s390] Replace lll_futex_* assembly code withINTERNAL_SYSCALL
- From: Siddhesh Poyarekar <siddhesh at redhat dot com>
- To: libc-alpha at sourceware dot org
- Date: Thu, 20 Dec 2012 18:58:45 +0530
- Subject: Re: [PATCH][s390] Replace lll_futex_* assembly code withINTERNAL_SYSCALL
- References: <20121213122620.GA27869@spoyarek.pnq.redhat.com>
Ping!
Siddhesh
On Thu, Dec 13, 2012 at 05:56:21PM +0530, Siddhesh Poyarekar wrote:
> 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
>