aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog12
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/m68k/vfork.S79
-rw-r--r--sysdeps/m68k/sysdep.h65
-rw-r--r--sysdeps/unix/sysv/linux/kernel-features.h9
4 files changed, 133 insertions, 32 deletions
diff --git a/ChangeLog b/ChangeLog
index 134ab27..75de7c7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2003-01-10 Andreas Schwab <schwab@suse.de>
+
+ * sysdeps/unix/sysv/linux/m68k/vfork.S: Optimize for kernels which
+ are known to have the vfork syscall.
+
+ * sysdeps/m68k/sysdep.h (JUMPTARGET): Undefine before defining it.
+
+ * sysdeps/unix/sysv/linux/kernel-features.h
+ (__ASSUME_MMAP2_SYSCALL, __ASSUME_TRUNCATE64_SYSCALL)
+ (__ASSUME_STAT64_SYSCALL, __ASSUME_FCNTL64)
+ (__ASSUME_VFORK_SYSCALL): Define for m68k kernels >= 2.4.12.
+
2003-01-09 Jakub Jelinek <jakub@redhat.com>
* posix/test-vfork.c (noop): Add __attribute_noinline__.
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/m68k/vfork.S b/linuxthreads/sysdeps/unix/sysv/linux/m68k/vfork.S
new file mode 100644
index 0000000..ba25cb1
--- /dev/null
+++ b/linuxthreads/sysdeps/unix/sysv/linux/m68k/vfork.S
@@ -0,0 +1,79 @@
+/* Copyright (C) 1999, 2002, 2003 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Andreas Schwab <schwab@gnu.org>.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <sysdep-cancel.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
+ replaced by a call to `execve'. Return -1 for errors, 0 to the new process,
+ and the process ID of the new process to the old process. */
+
+ENTRY (__vfork)
+
+#ifdef __NR_vfork
+
+ SINGLE_THREAD_P
+ jbne HIDDEN_JUMPTARGET (__fork)
+
+ /* Pop the return PC value into A0. */
+ movel %sp@+, %a0
+
+ /* Stuff the syscall number in D0 and trap into the kernel. */
+ movel #SYS_ify (vfork), %d0
+ trap #0
+ tstl %d0
+ jmi .Lerror /* Branch forward if it failed. */
+
+ /* Jump to the return PC. */
+ jmp %a0@
+
+.Lerror:
+ /* Push back the return PC. */
+ movel %a0,%sp@-
+
+# ifdef __ASSUME_VFORK_SYSCALL
+# ifndef PIC
+ jbra SYSCALL_ERROR_LABEL
+# endif
+# else
+ /* Check if vfork syscall is known at all. */
+ movel #-ENOSYS,%d1
+ cmpl %d0,%d1
+ jne SYSCALL_ERROR_LABEL
+
+# endif
+#endif
+
+#ifndef __ASSUME_VFORK_SYSCALL
+ /* If we don't have vfork, fork is close enough. */
+
+ movel #SYS_ify (fork), %d0
+ trap #0
+ tstl %d0
+ jmi SYSCALL_ERROR_LABEL
+ rts
+#endif
+
+PSEUDO_END (__vfork)
+libc_hidden_def (__vfork)
+
+weak_alias (__vfork, vfork)
diff --git a/sysdeps/m68k/sysdep.h b/sysdeps/m68k/sysdep.h
index 554b92d..f492ff6 100644
--- a/sysdeps/m68k/sysdep.h
+++ b/sysdeps/m68k/sysdep.h
@@ -1,5 +1,5 @@
/* Assembler macros for m68k.
- Copyright (C) 1998 Free Software Foundation, Inc.
+ Copyright (C) 1998, 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
@@ -23,25 +23,25 @@
/* Syntactic details of assembler. */
-#ifdef HAVE_ELF
+# ifdef HAVE_ELF
/* ELF uses byte-counts for .align, most others use log2 of count of bytes. */
-#define ALIGNARG(log2) 1<<log2
+# define ALIGNARG(log2) 1<<log2
/* For ELF we need the `.type' directive to make shared libs work right. */
-#define ASM_TYPE_DIRECTIVE(name,typearg) .type name,typearg
-#define ASM_SIZE_DIRECTIVE(name) .size name,.-name
+# define ASM_TYPE_DIRECTIVE(name,typearg) .type name,typearg
+# define ASM_SIZE_DIRECTIVE(name) .size name,.-name
/* In ELF C symbols are asm symbols. */
-#undef NO_UNDERSCORES
-#define NO_UNDERSCORES
+# undef NO_UNDERSCORES
+# define NO_UNDERSCORES
-#else
+# else
-#define ALIGNARG(log2) log2
-#define ASM_TYPE_DIRECTIVE(name,type) /* Nothing is specified. */
-#define ASM_SIZE_DIRECTIVE(name) /* Nothing is specified. */
+# define ALIGNARG(log2) log2
+# define ASM_TYPE_DIRECTIVE(name,type) /* Nothing is specified. */
+# define ASM_SIZE_DIRECTIVE(name) /* Nothing is specified. */
-#endif
+# endif
/* Define an entry point visible from C.
@@ -49,51 +49,52 @@
There is currently a bug in gdb which prevents us from specifying
incomplete stabs information. Fake some entries here which specify
the current source file. */
-#define ENTRY(name) \
+# define ENTRY(name) \
.globl C_SYMBOL_NAME(name); \
ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function); \
.align ALIGNARG(2); \
C_LABEL(name) \
CALL_MCOUNT
-#undef END
-#define END(name) ASM_SIZE_DIRECTIVE(name)
+# undef END
+# define END(name) ASM_SIZE_DIRECTIVE(name)
/* If compiled for profiling, call `_mcount' at the start of each function. */
-#ifdef PROF
+# ifdef PROF
/* The mcount code relies on a normal frame pointer being on the stack
to locate our caller, so push one just for its benefit. */
-#define CALL_MCOUNT \
+# define CALL_MCOUNT \
move.l %fp, -(%sp); move.l %sp, %fp; \
jbsr JUMPTARGET (mcount); \
move.l (%sp)+, %fp;
-#else
-#define CALL_MCOUNT /* Do nothing. */
-#endif
+# else
+# define CALL_MCOUNT /* Do nothing. */
+# endif
-#ifdef NO_UNDERSCORES
+# ifdef NO_UNDERSCORES
/* Since C identifiers are not normally prefixed with an underscore
on this system, the asm identifier `syscall_error' intrudes on the
C name space. Make sure we use an innocuous name. */
-#define syscall_error __syscall_error
-#define mcount _mcount
-#endif
+# define syscall_error __syscall_error
+# define mcount _mcount
+# endif
-#define PSEUDO(name, syscall_name, args) \
+# define PSEUDO(name, syscall_name, args) \
.globl syscall_error; \
ENTRY (name) \
DO_CALL (syscall_name, args); \
jcc JUMPTARGET(syscall_error)
-#undef PSEUDO_END
-#define PSEUDO_END(name) \
+# undef PSEUDO_END
+# define PSEUDO_END(name) \
END (name)
-#ifdef PIC
-#define JUMPTARGET(name) name##@PLTPC
-#else
-#define JUMPTARGET(name) name
-#endif
+# undef JUMPTARGET
+# ifdef PIC
+# define JUMPTARGET(name) name##@PLTPC
+# else
+# define JUMPTARGET(name) name
+# endif
#endif /* __ASSEMBLER__ */
diff --git a/sysdeps/unix/sysv/linux/kernel-features.h b/sysdeps/unix/sysv/linux/kernel-features.h
index c93ab35..6b1bdf2 100644
--- a/sysdeps/unix/sysv/linux/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/kernel-features.h
@@ -240,3 +240,12 @@
#if __LINUX_KERNEL_VERSION >= 132402 && defined __i386__
# define __ASSUME_CLONE_THREAD_FLAGS 1
#endif
+
+/* These features were surely available with 2.4.12. */
+#if __LINUX_KERNEL_VERSION >= 132108 && defined __mc68000__
+# define __ASSUME_MMAP2_SYSCALL 1
+# define __ASSUME_TRUNCATE64_SYSCALL 1
+# define __ASSUME_STAT64_SYSCALL 1
+# define __ASSUME_FCNTL64 1
+# define __ASSUME_VFORK_SYSCALL 1
+#endif