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]

some arm optimisations


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]