This is the mail archive of the libc-hacker@sources.redhat.com mailing list for the glibc project.
Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
2003-02-22 Philip Blundell <philb at gnu dot org> * sysdeps/unix/sysv/linux/kernel-features.h (__ASSUME_VFORK_SYSCALL): Define for kernel 2.4 on arm. * sysdeps/unix/sysv/linux/arm/vfork.S: Elide compatibility code when __ASSUME_VFORK_SYSCALL is defined. * sysdeps/unix/sysv/linux/arm/mmap64.S: Likewise for __ASSUME_MMAP2_SYSCALL. * sysdeps/unix/sysv/linux/arm/sigaction.c: Likewise for __ASSUME_REALTIME_SIGNALS. Index: sysdeps/unix/sysv/linux//kernel-features.h =================================================================== RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/kernel-features.h,v retrieving revision 1.46 diff -u -r1.46 kernel-features.h --- sysdeps/unix/sysv/linux//kernel-features.h 15 Mar 2003 23:43:51 -0000 1.46 +++ sysdeps/unix/sysv/linux//kernel-features.h 27 Mar 2003 00:22:11 -0000 @@ -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 Index: sysdeps/unix/sysv/linux//arm/vfork.S =================================================================== RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/arm/vfork.S,v retrieving revision 1.6 diff -u -r1.6 vfork.S --- sysdeps/unix/sysv/linux//arm/vfork.S 31 Dec 2002 20:37:29 -0000 1.6 +++ sysdeps/unix/sysv/linux//arm/vfork.S 27 Mar 2003 00:22:13 -0000 @@ -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 at gnu dot 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 @@ 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) Index: sysdeps/unix/sysv/linux//arm/mmap64.S =================================================================== RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/arm/mmap64.S,v retrieving revision 1.4 diff -u -r1.4 mmap64.S --- sysdeps/unix/sysv/linux//arm/mmap64.S 6 Jul 2001 04:56:13 -0000 1.4 +++ sysdeps/unix/sysv/linux//arm/mmap64.S 27 Mar 2003 00:22:12 -0000 @@ -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 @@ 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 @@ teq r5, $0 ldmeqfd sp!, {r4, r5, lr} beq PLTJMP(__mmap) +# endif .Linval: mov r0, $-EINVAL ldmfd sp!, {r4, r5, lr} Index: sysdeps/unix/sysv/linux//arm/sigaction.c =================================================================== RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/arm/sigaction.c,v retrieving revision 1.10 diff -u -r1.10 sigaction.c --- sysdeps/unix/sysv/linux//arm/sigaction.c 3 Jan 2003 00:42:09 -0000 1.10 +++ sysdeps/unix/sysv/linux//arm/sigaction.c 27 Mar 2003 00:22:13 -0000 @@ -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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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)
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |