aboutsummaryrefslogtreecommitdiff
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.S31
1 files changed, 25 insertions, 6 deletions
diff --git a/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S b/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S
index 3b0b66d436..b10903bcd7 100644
--- a/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S
+++ b/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S
@@ -24,8 +24,24 @@
#define SYS_gettimeofday __NR_gettimeofday
#define SYS_futex 240
-#define FUTEX_WAIT 0
-#define FUTEX_WAKE 1
+#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
.globl __lll_mutex_lock_wait
@@ -40,7 +56,7 @@ __lll_mutex_lock_wait:
mov r4, r6
mov r5, r8
mov #0, r7 /* No timeout. */
- mov #FUTEX_WAIT, r5
+ LOAD_FUTEX_WAIT (r5, r0)
mov #2, r4
cmp/eq r4, r6
@@ -133,7 +149,7 @@ __lll_mutex_timedlock_wait:
bt 8f
mov r8, r4
- mov #FUTEX_WAIT, r5
+ LOAD_FUTEX_WAIT (r5, r0)
mov r10, r6
mov r15, r7
mov #SYS_futex, r3
@@ -192,7 +208,7 @@ __lll_mutex_timedlock_wait:
.align 5
cfi_startproc
__lll_mutex_unlock_wake:
- mov #FUTEX_WAKE, r5
+ LOAD_FUTEX_WAKE (r5, r0)
mov #1, r6 /* Wake one thread. */
mov #0, r7
mov.l r7, @r4 /* Stores 0. */
@@ -261,7 +277,10 @@ __lll_timedwait_tid:
bt 4f
mov r8, r4
- mov #FUTEX_WAIT, r5
+ /* XXX The kernel so far uses global futex for the wakeup at
+ all times. */
+ mov #0, r5
+ extu.b r5, r5
mov r2, r6
mov r15, r7
mov #SYS_futex, r3