mirror of
git://sourceware.org/git/glibc.git
synced 2024-12-27 04:41:02 +08:00
713ddf8d12
lll_futex_wake not lll_private_futex_wake. * sysdeps/unix/sysv/linux/arm/bits/fcntl.h (O_CLOEXEC): Define. * sysdeps/unix/sysv/linux/arm/eabi/sysdep.h: Include <tls.h> * sysdeps/unix/sysv/linux/arm/nptl/lowlevellock.c (__lll_lock_wait_private, __lll_lock_wait): New. (__lll_timedlock_wait): Don't include in libc.so; Take private argument. Use atomic_compare_and_exchange_bool_acq. * sysdeps/unix/sysv/linux/arm/nptl/lowlevellock.h: Renamed all lll_mutex_* resp. lll_robust_mutex_* macros to lll_* resp. lll_robust_*. Renamed all LLL_MUTEX_LOCK_* macros to LLL_LOCK_*. Include <kernel-features.h>. (LLL_LOCK_INITIALIZER): Remove duplicate definition. (__lll_private_flag): Define. (lll_futex_timed_wait): Pass private flag to syscall. (lll_futex_wake): Likewise. (lll_private_futex_wait, lll_private_futex_timed_wait, lll_private_futex_wake): Remove. (lll_robust_dead, lll_futex_requeue): Take private arguments. (lll_futex_wake_unlock): Pass private flag to syscall. (__lll_robust_trylock): Convert to macro. (__lll_robust_lock_wait): Add private argument. (__lll_lock_wait_private, __lll_lock_wait): Declare. (__lll_lock): Convert to macro. Take private argument. (__lll_cond_lock): Likewise. (lll_lock, lll_cond_lock): Take private arguments. (__lll_robust_lock): Take private argument. (__lll_timedlock_wait, __lll_robust_timedlock_wait): Take private arguments. (__lll_timedlock, __lll_robust_timedlock): Convert to macros. Take private arguments. (lll_timedlock, lll_robust_timedlock): Take private arguments. (__lll_unlock, __lll_robust_unlock): Convert to macros. Take private arguments. (lll_unlock, lll_robust_unlock): Take private arguments. (__lll_mutex_unlock_force, lll_mutex_unlock_force, lll_lock_t, lll_trylock, lll_lock, lll_unlock, lll_islocked): Remove. (lll_wait_tid): Pass LLL_SHARED to lll_futex_wait. (__lll_cond_wait, __lll_cond_timedwait, __lll_cond_wake, __lll_cond_broadcast, lll_cond_wait, lll_cond_timedwait, lll_cond_wake, lll_cond_broadcast): Remove. * sysdeps/unix/sysv/linux/arm/nptl/pthread_once.c (clear_once_control, __pthread_once): Use lll_futex_wake not lll_private_futex_wake.
86 lines
3.0 KiB
C
86 lines
3.0 KiB
C
/* Copyright (C) 2005, 2006, 2007
|
|
Free Software Foundation, Inc.
|
|
|
|
This file is part of the GNU C Library.
|
|
|
|
Contributed by Daniel Jacobowitz <dan@codesourcery.com>, Oct 2005.
|
|
|
|
The GNU C Library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Lesser General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2.1 of the License, or (at your option) any later version.
|
|
|
|
The GNU C Library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Lesser General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with the GNU C Library; if not, write to the Free
|
|
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
|
02111-1307 USA. */
|
|
|
|
#ifndef _LINUX_ARM_EABI_SYSDEP_H
|
|
#define _LINUX_ARM_EABI_SYSDEP_H 1
|
|
|
|
#include <arm/sysdep.h>
|
|
|
|
#include <tls.h>
|
|
|
|
#if __NR_SYSCALL_BASE != 0
|
|
# error Kernel headers are too old
|
|
#endif
|
|
|
|
/* Don't use stime, even if the kernel headers define it. We have
|
|
settimeofday, and some EABI kernels have removed stime. Similarly
|
|
use setitimer to implement alarm. */
|
|
#undef __NR_stime
|
|
#undef __NR_alarm
|
|
|
|
/* The ARM EABI user interface passes the syscall number in r7, instead
|
|
of in the swi. This is more efficient, because the kernel does not need
|
|
to fetch the swi from memory to find out the number; which can be painful
|
|
with separate I-cache and D-cache. Make sure to use 0 for the SWI
|
|
argument; otherwise the (optional) compatibility code for APCS binaries
|
|
may be invoked. */
|
|
|
|
#undef INTERNAL_SYSCALL_RAW
|
|
#define INTERNAL_SYSCALL_RAW(name, err, nr, args...) \
|
|
({ \
|
|
register int _a1 asm ("r0"), _nr asm ("r7"); \
|
|
LOAD_ARGS_##nr (args) \
|
|
_nr = name; \
|
|
asm volatile ("swi 0x0 @ syscall " #name \
|
|
: "=r" (_a1) \
|
|
: "r" (_nr) ASM_ARGS_##nr \
|
|
: "memory"); \
|
|
_a1; })
|
|
|
|
/* For EABI, non-constant syscalls are actually pretty easy... */
|
|
#undef INTERNAL_SYSCALL_NCS
|
|
#define INTERNAL_SYSCALL_NCS(number, err, nr, args...) \
|
|
INTERNAL_SYSCALL_RAW (number, err, nr, args)
|
|
|
|
/* We must save and restore r7 (call-saved) for the syscall number.
|
|
We never make function calls from inside here (only potentially
|
|
signal handlers), so we do not bother with doubleword alignment.
|
|
|
|
Just like the APCS syscall convention, the EABI syscall convention uses
|
|
r0 through r6 for up to seven syscall arguments. None are ever passed to
|
|
the kernel on the stack, although incoming arguments are on the stack for
|
|
syscalls with five or more arguments.
|
|
|
|
The assembler will convert the literal pool load to a move for most
|
|
syscalls. */
|
|
|
|
#undef DO_CALL
|
|
#define DO_CALL(syscall_name, args) \
|
|
DOARGS_##args \
|
|
mov ip, r7; \
|
|
ldr r7, =SYS_ify (syscall_name); \
|
|
swi 0x0; \
|
|
mov r7, ip; \
|
|
UNDOARGS_##args
|
|
|
|
#endif /* _LINUX_ARM_EABI_SYSDEP_H */
|