diff options
Diffstat (limited to 'sysdeps/unix/sysv')
-rw-r--r-- | sysdeps/unix/sysv/linux/arm/mmap64.S | 9 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/arm/sigaction.c | 21 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/arm/vfork.S | 9 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/kernel-features.h | 4 |
4 files changed, 35 insertions, 8 deletions
diff --git a/sysdeps/unix/sysv/linux/arm/mmap64.S b/sysdeps/unix/sysv/linux/arm/mmap64.S index 1f19bf02e1..3936e25d26 100644 --- a/sysdeps/unix/sysv/linux/arm/mmap64.S +++ b/sysdeps/unix/sysv/linux/arm/mmap64.S @@ -1,4 +1,4 @@ -/* Copyright (C) 2000 Free Software Foundation, Inc. +/* Copyright (C) 2000, 2003 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 @@ -21,6 +21,8 @@ #define EINVAL 22 #define ENOSYS 38 +#include "kernel-features.h" + /* The mmap2 system call takes six arguments, all in registers. */ .text ENTRY (__mmap64) @@ -39,6 +41,10 @@ ENTRY (__mmap64) swi SYS_ify (mmap2) cmn r0, $4096 LOADREGS(ccfd, sp!, {r4, r5, pc}) +# ifdef __ASSUME_MMAP2_SYSCALL + ldmfd sp!, {r4, r5, lr} + b PLTJMP(syscall_error) +# else cmn r0, $ENOSYS ldmnefd sp!, {r4, r5, lr} bne PLTJMP(syscall_error) @@ -49,6 +55,7 @@ ENTRY (__mmap64) teq r5, $0 ldmeqfd sp!, {r4, r5, lr} beq PLTJMP(__mmap) +# endif .Linval: mov r0, $-EINVAL ldmfd sp!, {r4, r5, lr} diff --git a/sysdeps/unix/sysv/linux/arm/sigaction.c b/sysdeps/unix/sysv/linux/arm/sigaction.c index 46ff2b1599..82e22b679a 100644 --- a/sysdeps/unix/sysv/linux/arm/sigaction.c +++ b/sysdeps/unix/sysv/linux/arm/sigaction.c @@ -22,6 +22,7 @@ #include <sysdep.h> #include <sys/syscall.h> +#include <kernel-features.h> /* The difference here is that the sigaction structure used in the kernel is not the same as we use in the libc. Therefore we must @@ -60,15 +61,21 @@ __libc_sigaction (sig, act, oact) const struct sigaction *act; struct sigaction *oact; { +#ifndef __ASSUME_REALTIME_SIGNALS struct old_kernel_sigaction k_sigact, k_osigact; +#endif int result; #ifdef __NR_rt_sigaction /* First try the RT signals. */ +# ifndef __ASSUME_REALTIME_SIGNALS if (!__libc_missing_rt_sigs) +# endif { struct kernel_sigaction kact, koact; +# ifndef __ASSUME_REALTIME_SIGNALS int saved_errno = errno; +# endif if (act) { @@ -99,7 +106,9 @@ __libc_sigaction (sig, act, oact) act ? __ptrvalue (&kact) : NULL, oact ? __ptrvalue (&koact) : NULL, _NSIG / 8); +# ifndef __ASSUME_REALTIME_SIGNALS if (result >= 0 || errno != ENOSYS) +# endif { if (oact && result >= 0) { @@ -113,17 +122,20 @@ __libc_sigaction (sig, act, oact) return result; } +# ifndef __ASSUME_REALTIME_SIGNALS __set_errno (saved_errno); __libc_missing_rt_sigs = 1; +# endif } #endif +#ifndef __ASSUME_REALTIME_SIGNALS if (act) { k_sigact.k_sa_handler = act->sa_handler; k_sigact.sa_mask = act->sa_mask.__val[0]; k_sigact.sa_flags = act->sa_flags; -#ifdef HAVE_SA_RESTORER +# ifdef HAVE_SA_RESTORER /* See the comments above for why we test SA_ONSTACK. */ if (k_sigact.sa_flags & (SA_RESTORER | SA_ONSTACK)) k_sigact.sa_restorer = act->sa_restorer; @@ -132,7 +144,7 @@ __libc_sigaction (sig, act, oact) k_sigact.sa_restorer = choose_restorer (k_sigact.sa_flags); k_sigact.sa_flags |= SA_RESTORER; } -#endif +# endif } result = INLINE_SYSCALL (sigaction, 3, sig, act ? __ptrvalue (&k_sigact) : NULL, @@ -142,11 +154,12 @@ __libc_sigaction (sig, act, oact) oact->sa_handler = k_osigact.k_sa_handler; oact->sa_mask.__val[0] = k_osigact.sa_mask; oact->sa_flags = k_osigact.sa_flags; -#ifdef HAVE_SA_RESTORER +# ifdef HAVE_SA_RESTORER oact->sa_restorer = k_osigact.sa_restorer; -#endif +# endif } return result; +#endif } libc_hidden_def (__libc_sigaction) diff --git a/sysdeps/unix/sysv/linux/arm/vfork.S b/sysdeps/unix/sysv/linux/arm/vfork.S index a2c6bf3407..0630c7ff06 100644 --- a/sysdeps/unix/sysv/linux/arm/vfork.S +++ b/sysdeps/unix/sysv/linux/arm/vfork.S @@ -1,4 +1,4 @@ -/* Copyright (C) 1999, 2002 Free Software Foundation, Inc. +/* Copyright (C) 1999, 2002, 2003 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Philip Blundell <philb@gnu.org>. @@ -20,6 +20,7 @@ #include <sysdep.h> #define _ERRNO_H 1 #include <bits/errno.h> +#include <kernel-features.h> /* Clone the calling process, but without copying the whole address space. The calling process is suspended until the new process exits or is @@ -33,17 +34,23 @@ ENTRY (__vfork) cmn a1, #4096 RETINSTR(movcc, pc, lr) +# ifdef __ASSUME_VFORK_SYSCALL + b PLTJMP(C_SYMBOL_NAME(__syscall_error)) +# else /* Check if vfork syscall is known at all. */ ldr a2, =-ENOSYS teq a1, a2 bne PLTJMP(C_SYMBOL_NAME(__syscall_error)) +# endif #endif +#ifndef __ASSUME_VFORK_SYSCALL /* If we don't have vfork, fork is close enough. */ swi __NR_fork cmn a1, #4096 RETINSTR(movcc, pc, lr) b PLTJMP(C_SYMBOL_NAME(__syscall_error)) +#endif PSEUDO_END (__vfork) libc_hidden_def (__vfork) diff --git a/sysdeps/unix/sysv/linux/kernel-features.h b/sysdeps/unix/sysv/linux/kernel-features.h index 06cc7f32bb..9909b75393 100644 --- a/sysdeps/unix/sysv/linux/kernel-features.h +++ b/sysdeps/unix/sysv/linux/kernel-features.h @@ -229,8 +229,8 @@ # define __ASSUME_SET_THREAD_AREA_SYSCALL 1 #endif -/* The vfork syscall on x86 was definitely available in 2.4. */ -#if __LINUX_KERNEL_VERSION >= 132097 && defined __i386__ +/* The vfork syscall on x86 and arm was definitely available in 2.4. */ +#if __LINUX_KERNEL_VERSION >= 132097 && (defined __i386__ || defined __arm__) # define __ASSUME_VFORK_SYSCALL 1 #endif |