diff options
Diffstat (limited to 'libc')
-rw-r--r-- | libc/arch-arm/bionic/futex_arm.S | 35 | ||||
-rw-r--r-- | libc/arch-arm64/bionic/futex_arm64.S | 53 | ||||
-rw-r--r-- | libc/arch-mips/bionic/futex_mips.S | 68 | ||||
-rw-r--r-- | libc/arch-mips64/bionic/futex_mips.S | 82 | ||||
-rw-r--r-- | libc/arch-x86/bionic/futex_x86.S | 44 | ||||
-rw-r--r-- | libc/arch-x86_64/bionic/futex_x86_64.S | 31 | ||||
-rw-r--r-- | libc/bionic/pthread_internals.cpp | 8 | ||||
-rw-r--r-- | libc/bionic/system_properties.cpp | 3 | ||||
-rw-r--r-- | libc/bionic/system_properties_compat.c | 9 | ||||
-rw-r--r-- | libc/include/sys/atomics.h | 4 | ||||
-rw-r--r-- | libc/private/bionic_futex.h | 28 |
11 files changed, 32 insertions, 333 deletions
diff --git a/libc/arch-arm/bionic/futex_arm.S b/libc/arch-arm/bionic/futex_arm.S index 0aba278..89a1e96 100644 --- a/libc/arch-arm/bionic/futex_arm.S +++ b/libc/arch-arm/bionic/futex_arm.S @@ -28,42 +28,11 @@ #include <private/bionic_asm.h> -#define FUTEX_WAIT 0 -#define FUTEX_WAKE 1 - -// int __futex_syscall3(volatile void* ftx, int op, int count) -ENTRY(__futex_syscall3) - mov ip, r7 - ldr r7, =__NR_futex - swi #0 - mov r7, ip - bx lr -END(__futex_syscall3) - // int __futex_syscall4(volatile void* ftx, int op, int val, const struct timespec* timeout) -ENTRY(__futex_syscall4) - b __futex_syscall3 -END(__futex_syscall4) - -// int __futex_wait(volatile void* ftx, int val, const struct timespec* timeout) -ENTRY(__futex_wait) - mov ip, r7 - mov r3, r2 - mov r2, r1 - mov r1, #FUTEX_WAIT - ldr r7, =__NR_futex - swi #0 - mov r7, ip - bx lr -END(__futex_wait) - -// int __futex_wake(volatile void* ftx, int count) -ENTRY(__futex_wake) +ENTRY_PRIVATE(__futex_syscall4) mov ip, r7 - mov r2, r1 - mov r1, #FUTEX_WAKE ldr r7, =__NR_futex swi #0 mov r7, ip bx lr -END(__futex_wake) +END(__futex_syscall4) diff --git a/libc/arch-arm64/bionic/futex_arm64.S b/libc/arch-arm64/bionic/futex_arm64.S index 00d24a4..9d7465a 100644 --- a/libc/arch-arm64/bionic/futex_arm64.S +++ b/libc/arch-arm64/bionic/futex_arm64.S @@ -28,11 +28,8 @@ #include <private/bionic_asm.h> -#define FUTEX_WAIT 0 -#define FUTEX_WAKE 1 - // int __futex_syscall4(volatile void* ftx, int op, int val, const struct timespec* timeout) -ENTRY(__futex_syscall4) +ENTRY_PRIVATE(__futex_syscall4) stp x29, x30, [sp, #-16]! .cfi_def_cfa_offset 16 .cfi_rel_offset x29, 0 @@ -48,51 +45,3 @@ ENTRY(__futex_syscall4) .cfi_restore x30 ret END(__futex_syscall4) - -// int __futex_syscall3(volatile void* ftx, int op, int count) -ENTRY(__futex_syscall3) - b __futex_syscall4 -END(__futex_syscall3) - -// int __futex_wait(volatile void* ftx, int val, const struct timespec* timeout) -ENTRY_PRIVATE(__futex_wait) - stp x29, x30, [sp, #-16]! - .cfi_def_cfa_offset 16 - .cfi_rel_offset x29, 0 - .cfi_rel_offset x30, 8 - mov x29, sp - - mov x3, x2 - mov x2, x1 - mov x1, #FUTEX_WAIT - - mov x8, __NR_futex - svc #0 - - ldp x29, x30, [sp], #16 - .cfi_def_cfa_offset 0 - .cfi_restore x29 - .cfi_restore x30 - ret -END(__futex_wait) - -// int __futex_wake(volatile void* ftx, int count) -ENTRY_PRIVATE(__futex_wake) - stp x29, x30, [sp, #-16]! - .cfi_def_cfa_offset 16 - .cfi_rel_offset x29, 0 - .cfi_rel_offset x30, 8 - mov x29, sp - - mov x2, x1 - mov x1, #FUTEX_WAKE - - mov x8, __NR_futex - svc #0 - - ldp x29, x30, [sp], #16 - .cfi_def_cfa_offset 0 - .cfi_restore x29 - .cfi_restore x30 - ret -END(__futex_wake) diff --git a/libc/arch-mips/bionic/futex_mips.S b/libc/arch-mips/bionic/futex_mips.S index 7626a7c..5a09f32 100644 --- a/libc/arch-mips/bionic/futex_mips.S +++ b/libc/arch-mips/bionic/futex_mips.S @@ -28,74 +28,8 @@ #include <private/bionic_asm.h> -#define FUTEX_WAIT 0 -#define FUTEX_WAKE 1 - -// int __futex_wait(volatile void* ftx, int val, const struct timespec* timeout) -ENTRY(__futex_wait) - subu sp,4*6 - sw $0,20(sp) /* val3 */ - sw $0,16(sp) /* addr2 */ - move a3,a2 /* timespec */ - move a2,a1 /* val */ - li a1,FUTEX_WAIT /* op */ -# move a0,a0 /* ftx */ - li v0,__NR_futex - syscall - .set noreorder - bnez a3, 1f /* Check for error */ - neg v0 /* Negate error number if it's valid */ - move v0,$0 /* Otherwise return 0 */ -1: - .set reorder - addu sp,4*6 - j ra -END(__futex_wait) - -// int __futex_wake(volatile void* ftx, int count) -ENTRY(__futex_wake) - subu sp,4*6 - sw $0,20(sp) /* val3 */ - sw $0,16(sp) /* addr2 */ - move a3,$0 /* timespec */ - move a2,a1 /* val */ - li a1,FUTEX_WAKE /* op */ -# move a0,a0 /* ftx */ - li v0,__NR_futex - syscall - .set noreorder - bnez a3, 1f /* Check for error */ - neg v0 /* Negate error number if it's valid */ - move v0,$0 /* Otherwise return 0 */ -1: - .set reorder - addu sp,4*6 - j ra -END(__futex_wake) - -// int __futex_syscall3(volatile void* ftx, int op, int count) -ENTRY(__futex_syscall3) - subu sp,4*6 - sw $0,20(sp) /* val3 */ - sw $0,16(sp) /* addr2 */ - move a3,$0 /* timespec */ -# move a2,a2 /* val */ -# li a1,a1 /* op */ -# move a0,a0 /* ftx */ - li v0,__NR_futex - syscall - .set noreorder - bnez a3, 1f /* Check for error */ - neg v0 /* Negate error number if it's valid */ - move v0,$0 /* Otherwise return 0 */ -1: - .set reorder - addu sp,4*6 - j ra -END(__futex_syscall3) - // int __futex_syscall4(volatile void* ftx, int op, int val, const struct timespec* timeout) -ENTRY(__futex_syscall4) +ENTRY_PRIVATE(__futex_syscall4) subu sp,4*6 sw $0,20(sp) /* val3 */ sw $0,16(sp) /* addr2 */ diff --git a/libc/arch-mips64/bionic/futex_mips.S b/libc/arch-mips64/bionic/futex_mips.S index 81f2f22..60c218c 100644 --- a/libc/arch-mips64/bionic/futex_mips.S +++ b/libc/arch-mips64/bionic/futex_mips.S @@ -28,9 +28,6 @@ #include <private/bionic_asm.h> -#define FUTEX_WAIT 0 -#define FUTEX_WAKE 1 - #if (_MIPS_SIM == _ABIO32) || (_MIPS_SIM == _ABI32) FRAMESZ = MKFSIZ(NARGSAVE+2,0) FRAME_A4 = 4*REGSZ @@ -39,84 +36,6 @@ FRAME_A5 = 5*REGSZ FRAMESZ = 0 #endif -// int __futex_wait(volatile void* ftx, int val, const struct timespec* timeout) -LEAF(__futex_wait, FRAMESZ) -#if (_MIPS_SIM == _ABIO32) || (_MIPS_SIM == _ABI32) - PTR_SUBU sp, FRAMESZ - REG_S $0,FRAME_A5(sp) /* val3 */ - REG_S $0,FRAME_A4(sp) /* addr2 */ -#else - move a5,$0 /* val3 */ - move a4,$0 /* addr2 */ -#endif - move a3,a2 /* timespec */ - move a2,a1 /* val */ - LI a1,FUTEX_WAIT /* op */ -# move a0,a0 /* ftx */ - LI v0,__NR_futex - syscall - neg v0 /* Negate errno */ - bnez a3,1f /* Check for error */ - move v0,$0 /* Return 0 if no error */ -1: -#if (_MIPS_SIM == _ABIO32) || (_MIPS_SIM == _ABI32) - PTR_ADDU sp,FRAMESZ -#endif - j ra - END(__futex_wait) - -// int __futex_wake(volatile void* ftx, int count) -LEAF(__futex_wake,FRAMESZ) -#if (_MIPS_SIM == _ABIO32) || (_MIPS_SIM == _ABI32) - PTR_SUBU sp, FRAMESZ - REG_S $0,FRAME_A5(sp) /* val3 */ - REG_S $0,FRAME_A4(sp) /* addr2 */ -#else - move a5,$0 /* val3 */ - move a4,$0 /* addr2 */ -#endif - move a3,$0 /* timespec */ - move a2,a1 /* val */ - LI a1,FUTEX_WAKE /* op */ -# move a0,a0 /* ftx */ - LI v0,__NR_futex - syscall - neg v0 /* Negate errno */ - bnez a3,1f /* Check for error */ - move v0,$0 /* Return 0 if no error */ -1: -#if (_MIPS_SIM == _ABIO32) || (_MIPS_SIM == _ABI32) - PTR_ADDU sp,FRAMESZ -#endif - j ra - END(__futex_wake) - -// int __futex_syscall3(volatile void* ftx, int op, int count) -LEAF(__futex_syscall3,FRAMESZ) -#if (_MIPS_SIM == _ABIO32) || (_MIPS_SIM == _ABI32) - PTR_SUBU sp, FRAMESZ - REG_S $0,FRAME_A5(sp) /* val3 */ - REG_S $0,FRAME_A4(sp) /* addr2 */ -#else - move a5,$0 /* val3 */ - move a4,$0 /* addr2 */ -#endif - move a3,$0 /* timespec */ -# move a2,a2 /* val */ -# move a1,a1 /* op */ -# move a0,a0 /* ftx */ - LI v0,__NR_futex - syscall - neg v0 /* Negate errno */ - bnez a3,1f /* Check for error */ - move v0,$0 /* Return 0 if no error */ -1: -#if (_MIPS_SIM == _ABIO32) || (_MIPS_SIM == _ABI32) - PTR_ADDU sp,FRAMESZ -#endif - j ra - END(__futex_syscall3) - // int __futex_syscall4(volatile void* ftx, int op, int val, const struct timespec* timeout) LEAF(__futex_syscall4,FRAMESZ) #if (_MIPS_SIM == _ABIO32) || (_MIPS_SIM == _ABI32) @@ -142,3 +61,4 @@ LEAF(__futex_syscall4,FRAMESZ) #endif j ra END(__futex_syscall4) +.hidden __futex_syscall4 diff --git a/libc/arch-x86/bionic/futex_x86.S b/libc/arch-x86/bionic/futex_x86.S index 8dd2ad0..94647ca 100644 --- a/libc/arch-x86/bionic/futex_x86.S +++ b/libc/arch-x86/bionic/futex_x86.S @@ -1,49 +1,7 @@ #include <private/bionic_asm.h> -#define FUTEX_WAIT 0 -#define FUTEX_WAKE 1 - -// int __futex_wait(volatile void* ftx, int val, const struct timespec* timeout) -ENTRY(__futex_wait) - pushl %ebx - pushl %esi - mov 12(%esp), %ebx /* ftx */ - movl $FUTEX_WAIT, %ecx - mov 16(%esp), %edx /* val */ - mov 20(%esp), %esi /* timeout */ - movl $__NR_futex, %eax - int $0x80 - popl %esi - popl %ebx - ret -END(__futex_wait) - -// int __futex_wake(volatile void* ftx, int count) -ENTRY(__futex_wake) - pushl %ebx - mov 8(%esp), %ebx /* ftx */ - movl $FUTEX_WAKE, %ecx - mov 12(%esp), %edx /* count */ - movl $__NR_futex, %eax - int $0x80 - popl %ebx - ret -END(__futex_wake) - -// int __futex_syscall3(volatile void* ftx, int op, int count) -ENTRY(__futex_syscall3) - pushl %ebx - movl 8(%esp), %ebx /* ftx */ - movl 12(%esp), %ecx /* op */ - movl 16(%esp), %edx /* value */ - movl $__NR_futex, %eax - int $0x80 - popl %ebx - ret -END(__futex_syscall3) - // int __futex_syscall4(volatile void* ftx, int op, int val, const struct timespec* timeout) -ENTRY(__futex_syscall4) +ENTRY_PRIVATE(__futex_syscall4) pushl %ebx pushl %esi movl 12(%esp), %ebx /* ftx */ diff --git a/libc/arch-x86_64/bionic/futex_x86_64.S b/libc/arch-x86_64/bionic/futex_x86_64.S index 25cdf1b..c248439 100644 --- a/libc/arch-x86_64/bionic/futex_x86_64.S +++ b/libc/arch-x86_64/bionic/futex_x86_64.S @@ -28,37 +28,8 @@ #include <private/bionic_asm.h> -#define FUTEX_WAIT 0 -#define FUTEX_WAKE 1 - -// int __futex_wait(volatile void* ftx, int val, const struct timespec* timeout) -ENTRY_PRIVATE(__futex_wait) - mov %rdx, %r10 /* timeout */ - mov %esi, %edx /* val */ - mov $FUTEX_WAIT, %esi /* op */ - mov $__NR_futex, %eax - syscall - ret -END(__futex_wait) - -// int __futex_wake(volatile void* ftx, int count) -ENTRY_PRIVATE(__futex_wake) - mov %esi, %edx - mov $FUTEX_WAKE, %esi - mov $__NR_futex, %eax - syscall - ret -END(__futex_wake) - -// int __futex_syscall3(volatile void* ftx, int op, int count) -ENTRY(__futex_syscall3) - mov $__NR_futex, %eax - syscall - ret -END(__futex_syscall3) - // int __futex_syscall4(volatile void* ftx, int op, int val, const struct timespec* timeout) -ENTRY(__futex_syscall4) +ENTRY_PRIVATE(__futex_syscall4) mov %rcx, %r10 /* timeout */ mov $__NR_futex, %eax syscall diff --git a/libc/bionic/pthread_internals.cpp b/libc/bionic/pthread_internals.cpp index baa95d9..8c5d9c7 100644 --- a/libc/bionic/pthread_internals.cpp +++ b/libc/bionic/pthread_internals.cpp @@ -88,11 +88,3 @@ int __timespec_from_absolute(timespec* ts, const timespec* abstime, clockid_t cl } return 0; } - -int __futex_wake_ex(volatile void* ftx, int pshared, int val) { - return __futex_syscall3(ftx, pshared ? FUTEX_WAKE : FUTEX_WAKE_PRIVATE, val); -} - -int __futex_wait_ex(volatile void* ftx, int pshared, int val, const timespec* timeout) { - return __futex_syscall4(ftx, pshared ? FUTEX_WAIT : FUTEX_WAIT_PRIVATE, val, timeout); -} diff --git a/libc/bionic/system_properties.cpp b/libc/bionic/system_properties.cpp index 97e1a03..7618586 100644 --- a/libc/bionic/system_properties.cpp +++ b/libc/bionic/system_properties.cpp @@ -51,9 +51,8 @@ #include <sys/_system_properties.h> #include <sys/system_properties.h> -#include <sys/atomics.h> - #include "private/bionic_atomic_inline.h" +#include "private/bionic_futex.h" #include "private/bionic_macros.h" #define ALIGN(x, a) (((x) + (a - 1)) & ~(a - 1)) diff --git a/libc/bionic/system_properties_compat.c b/libc/bionic/system_properties_compat.c index b4c2494..6aeaa0c 100644 --- a/libc/bionic/system_properties_compat.c +++ b/libc/bionic/system_properties_compat.c @@ -35,7 +35,8 @@ */ #include <string.h> -#include <sys/atomics.h> + +#include "private/bionic_futex.h" #define _REALLY_INCLUDE_SYS__SYSTEM_PROPERTIES_H_ #include <sys/_system_properties.h> @@ -67,7 +68,7 @@ typedef struct prop_info_compat prop_info_compat; extern prop_area *__system_property_area__; -const prop_info *__system_property_find_compat(const char *name) +__LIBC_HIDDEN__ const prop_info *__system_property_find_compat(const char *name) { prop_area_compat *pa = (prop_area_compat *)__system_property_area__; unsigned count = pa->count; @@ -93,7 +94,7 @@ const prop_info *__system_property_find_compat(const char *name) return 0; } -int __system_property_read_compat(const prop_info *_pi, char *name, char *value) +__LIBC_HIDDEN__ int __system_property_read_compat(const prop_info *_pi, char *name, char *value) { unsigned serial, len; const prop_info_compat *pi = (const prop_info_compat *)_pi; @@ -115,7 +116,7 @@ int __system_property_read_compat(const prop_info *_pi, char *name, char *value) } } -int __system_property_foreach_compat( +__LIBC_HIDDEN__ int __system_property_foreach_compat( void (*propfn)(const prop_info *pi, void *cookie), void *cookie) { diff --git a/libc/include/sys/atomics.h b/libc/include/sys/atomics.h index 143bc4b..dfb5d5e 100644 --- a/libc/include/sys/atomics.h +++ b/libc/include/sys/atomics.h @@ -75,10 +75,6 @@ __atomic_inc(volatile int *ptr) return __sync_fetch_and_add (ptr, 1); } - -int __futex_wait(volatile void *ftx, int val, const struct timespec *timeout); -int __futex_wake(volatile void *ftx, int count); - __END_DECLS #endif /* _SYS_ATOMICS_H */ diff --git a/libc/private/bionic_futex.h b/libc/private/bionic_futex.h index d01b859..11699ce 100644 --- a/libc/private/bionic_futex.h +++ b/libc/private/bionic_futex.h @@ -30,20 +30,30 @@ #include <linux/futex.h> #include <sys/cdefs.h> +#include <stdbool.h> +#include <stddef.h> __BEGIN_DECLS -extern int __futex_wait(volatile void *ftx, int val, const struct timespec *timeout); -extern int __futex_wake(volatile void *ftx, int count); +struct timespec; -extern int __futex_syscall3(volatile void *ftx, int op, int val); -extern int __futex_syscall4(volatile void *ftx, int op, int val, const struct timespec *timeout); +extern int __futex_syscall4(volatile void* ftx, int op, int value, const struct timespec* timeout); -/* Like __futex_wait/wake, but take an additional 'pshared' argument. - * when non-0, this will use normal futexes. Otherwise, private futexes. - */ -__LIBC_HIDDEN__ int __futex_wake_ex(volatile void* ftx, int pshared, int val); -__LIBC_HIDDEN__ int __futex_wait_ex(volatile void* ftx, int pshared, int val, const struct timespec* timeout); +static inline int __futex_wake(volatile void* ftx, int count) { + return __futex_syscall4(ftx, FUTEX_WAKE, count, NULL); +} + +static inline int __futex_wake_ex(volatile void* ftx, bool shared, int count) { + return __futex_syscall4(ftx, shared ? FUTEX_WAKE : FUTEX_WAKE_PRIVATE, count, NULL); +} + +static inline int __futex_wait(volatile void* ftx, int value, const struct timespec* timeout) { + return __futex_syscall4(ftx, FUTEX_WAIT, value, timeout); +} + +static inline int __futex_wait_ex(volatile void* ftx, bool shared, int value, const struct timespec* timeout) { + return __futex_syscall4(ftx, shared ? FUTEX_WAIT : FUTEX_WAIT_PRIVATE, value, timeout); +} __END_DECLS |