summaryrefslogtreecommitdiffstats
path: root/libc/arch-arm/bionic/atomics_arm.S
diff options
context:
space:
mode:
Diffstat (limited to 'libc/arch-arm/bionic/atomics_arm.S')
-rw-r--r--libc/arch-arm/bionic/atomics_arm.S48
1 files changed, 48 insertions, 0 deletions
diff --git a/libc/arch-arm/bionic/atomics_arm.S b/libc/arch-arm/bionic/atomics_arm.S
index 55c642f..5076fe3 100644
--- a/libc/arch-arm/bionic/atomics_arm.S
+++ b/libc/arch-arm/bionic/atomics_arm.S
@@ -43,6 +43,19 @@
#define FUTEX_WAIT 0
#define FUTEX_WAKE 1
+/* Private futexes belong to a single address space and cannot be
+ * shared among processes. They are however significantly faster to
+ * operate than standard futexes.
+ */
+.global __futex_wait_private
+.type __futex_wait_private, %function
+.global __futex_wake_private
+.type __futex_wake_private, %function
+
+#define FUTEX_PRIVATE_FLAG 128
+#define FUTEX_WAIT_PRIVATE (FUTEX_WAIT|FUTEX_PRIVATE_FLAG)
+#define FUTEX_WAKE_PRIVATE (FUTEX_WAKE|FUTEX_PRIVATE_FLAG)
+
#if 1
.equ kernel_cmpxchg, 0xFFFF0FC0
.equ kernel_atomic_base, 0xFFFF0FFF
@@ -185,6 +198,28 @@ __futex_wake:
ldmia sp!, {r4, r7}
bx lr
+__futex_wait_private:
+ .fnstart
+ stmdb sp!, {r4, r7}
+ .save {r4, r7}
+ mov r3, r2
+ mov r2, r1
+ mov r1, #FUTEX_WAIT_PRIVATE
+ ldr r7, =__NR_futex
+ swi #0
+ ldmia sp!, {r4, r7}
+ bx lr
+ .fnend
+
+__futex_wake_private:
+ stmdb sp!, {r4, r7}
+ mov r2, r1
+ mov r1, #FUTEX_WAKE_PRIVATE
+ ldr r7, =__NR_futex
+ swi #0
+ ldmia sp!, {r4, r7}
+ bx lr
+
#else
__futex_wait:
@@ -200,4 +235,17 @@ __futex_wake:
swi #__NR_futex
bx lr
+__futex_wait_private:
+ mov r3, r2
+ mov r2, r1
+ mov r1, #FUTEX_WAIT_PRIVATE
+ swi #__NR_futex
+ bx lr
+
+__futex_wake_private:
+ mov r2, r1
+ mov r1, #FUTEX_WAKE_PRIVATE
+ swi #__NR_futex
+ bx lr
+
#endif