* some arm optimisations
@ 2003-03-27 0:51 Philip Blundell
2003-03-27 10:34 ` Roland McGrath
0 siblings, 1 reply; 2+ messages in thread
From: Philip Blundell @ 2003-03-27 0:51 UTC (permalink / raw)
To: libc-hacker
2003-02-22 Philip Blundell <philb@gnu.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@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 @@
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)
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: some arm optimisations
2003-03-27 0:51 some arm optimisations Philip Blundell
@ 2003-03-27 10:34 ` Roland McGrath
0 siblings, 0 replies; 2+ messages in thread
From: Roland McGrath @ 2003-03-27 10:34 UTC (permalink / raw)
To: Philip Blundell; +Cc: libc-hacker
Thanks, I put these in.
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2003-03-27 2:46 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-03-27 0:51 some arm optimisations Philip Blundell
2003-03-27 10:34 ` Roland McGrath
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).