summaryrefslogtreecommitdiff
path: root/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S
diff options
context:
space:
mode:
Diffstat (limited to 'nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S')
-rw-r--r--nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S61
1 files changed, 35 insertions, 26 deletions
diff --git a/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S b/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S
index b10903bcd7..ac3169889f 100644
--- a/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S
+++ b/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 2003, 2004, 2005, 2007 Free Software Foundation, Inc.
+/* Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -24,24 +24,8 @@
#define SYS_gettimeofday __NR_gettimeofday
#define SYS_futex 240
-#ifndef FUTEX_WAIT
-# define FUTEX_WAIT 0
-# define FUTEX_WAKE 1
-#endif
-
-#ifndef LOAD_FUTEX_WAIT
-# if FUTEX_WAIT == 0
-# define LOAD_FUTEX_WAIT(reg,tmp) \
- xor reg, reg
-# else
-# define LOAD_FUTEX_WAIT(reg,tmp) \
- mov #FUTEX_WAIT, reg; \
- extu.b reg, reg
-# endif
-# define LOAD_FUTEX_WAKE(reg,tmp) \
- mov #FUTEX_WAKE, reg; \
- extu.b reg, reg
-#endif
+#define FUTEX_WAIT 0
+#define FUTEX_WAKE 1
.globl __lll_mutex_lock_wait
@@ -56,7 +40,7 @@ __lll_mutex_lock_wait:
mov r4, r6
mov r5, r8
mov #0, r7 /* No timeout. */
- LOAD_FUTEX_WAIT (r5, r0)
+ mov #FUTEX_WAIT, r5
mov #2, r4
cmp/eq r4, r6
@@ -149,7 +133,7 @@ __lll_mutex_timedlock_wait:
bt 8f
mov r8, r4
- LOAD_FUTEX_WAIT (r5, r0)
+ mov #FUTEX_WAIT, r5
mov r10, r6
mov r15, r7
mov #SYS_futex, r3
@@ -202,13 +186,41 @@ __lll_mutex_timedlock_wait:
#endif
+#ifdef NOT_IN_libc
+ .globl lll_unlock_wake_cb
+ .type lll_unlock_wake_cb,@function
+ .hidden lll_unlock_wake_cb
+ .align 5
+ cfi_startproc
+lll_unlock_wake_cb:
+ DEC (@r4, r2)
+ tst r2, r2
+ bt 1f
+
+ mov #FUTEX_WAKE, r5
+ mov #1, r6 /* Wake one thread. */
+ mov #0, r7
+ mov.l r7, @r4 /* Stores 0. */
+ mov #SYS_futex, r3
+ extu.b r3, r3
+ trapa #0x14
+ SYSCALL_INST_PAD
+
+1:
+ rts
+ nop
+ cfi_endproc
+ .size lll_unlock_wake_cb,.-lll_unlock_wake_cb
+#endif
+
+
.globl __lll_mutex_unlock_wake
.type __lll_mutex_unlock_wake,@function
.hidden __lll_mutex_unlock_wake
.align 5
cfi_startproc
__lll_mutex_unlock_wake:
- LOAD_FUTEX_WAKE (r5, r0)
+ mov #FUTEX_WAKE, r5
mov #1, r6 /* Wake one thread. */
mov #0, r7
mov.l r7, @r4 /* Stores 0. */
@@ -277,10 +289,7 @@ __lll_timedwait_tid:
bt 4f
mov r8, r4
- /* XXX The kernel so far uses global futex for the wakeup at
- all times. */
- mov #0, r5
- extu.b r5, r5
+ mov #FUTEX_WAIT, r5
mov r2, r6
mov r15, r7
mov #SYS_futex, r3