2003-03-27 Philip Blundell <philb@gnu.org>
authorRoland McGrath <roland@gnu.org>
Thu, 27 Mar 2003 02:45:46 +0000 (02:45 +0000)
committerRoland McGrath <roland@gnu.org>
Thu, 27 Mar 2003 02:45:46 +0000 (02:45 +0000)
* 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.

sysdeps/unix/sysv/linux/arm/mmap64.S
sysdeps/unix/sysv/linux/arm/sigaction.c
sysdeps/unix/sysv/linux/arm/vfork.S

index 1f19bf0..3936e25 100644 (file)
@@ -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}
index 46ff2b1..82e22b6 100644 (file)
@@ -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)
 
index a2c6bf3..0630c7f 100644 (file)
@@ -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)