From 574b892ef1054ea999a136b3cb2321a65e3f1a17 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Wed, 15 Jan 2003 01:23:02 +0000 Subject: Update. 2003-01-14 Guido Guenther * sysdeps/unix/sysv/linux/mips/sysdep.h (INTERNAL_SYSCALL, INTERNAL_SYSCALL_DECL, INTERNAL_SYSCALL_ERRNO, INTERNAL_SYSCALL_ERROR_P, INLINE_SYSCALL): Define. 2003-01-14 Steven Munroe * sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h (INTERNAL_SYSCALL): Make use of ERR parameter. (INTERNAL_SYSCALL_DECL, INTERNAL_SYSCALL_ERRNO, INTERNAL_SYSCALL_ERROR_P): Adjust accordingly. (INLINE_SYSCALL): Make use of INTERNAL_SYSCALL. * sysdeps/unix/sysv/linux/powerpc/powerpc64/vfork.S: New file. Patch by Denis Zaitsev . that %eax is modified. Reported by Denis Zaitsev . --- linuxthreads/sysdeps/unix/sysv/linux/alpha/vfork.S | 14 +++++ linuxthreads/sysdeps/unix/sysv/linux/arm/vfork.S | 2 +- .../unix/sysv/linux/powerpc/powerpc32/vfork.S | 15 ++++++ .../unix/sysv/linux/powerpc/powerpc64/vfork.S | 59 ++++++++++++++++++++++ .../sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S | 9 ++++ .../sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S | 10 ++++ 6 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 linuxthreads/sysdeps/unix/sysv/linux/powerpc/powerpc64/vfork.S (limited to 'linuxthreads/sysdeps/unix') diff --git a/linuxthreads/sysdeps/unix/sysv/linux/alpha/vfork.S b/linuxthreads/sysdeps/unix/sysv/linux/alpha/vfork.S index c057bd2bfa..2481de9a12 100644 --- a/linuxthreads/sysdeps/unix/sysv/linux/alpha/vfork.S +++ b/linuxthreads/sysdeps/unix/sysv/linux/alpha/vfork.S @@ -27,11 +27,25 @@ __LABEL(__vfork) .prologue 1 PSEUDO_PROF SINGLE_THREAD_P(t0) +#ifdef SHARED bne t0, HIDDEN_JUMPTARGET (__fork) !samegp +#else + bne t0, $hidden_fork +#endif lda v0, SYS_ify(vfork) call_pal PAL_callsys +#ifdef SHARED bne a3, __syscall_error !samegp +#else + bne a3, $syscall_error +#endif ret +#ifndef SHARED +$hidden_fork: + jmp zero, HIDDEN_JUMPTARGET (__fork) +$syscall_error: + jmp zero, __syscall_error +#endif PSEUDO_END(__vfork) libc_hidden_def (__vfork) diff --git a/linuxthreads/sysdeps/unix/sysv/linux/arm/vfork.S b/linuxthreads/sysdeps/unix/sysv/linux/arm/vfork.S index 6092bd9fd4..8d3338afd0 100644 --- a/linuxthreads/sysdeps/unix/sysv/linux/arm/vfork.S +++ b/linuxthreads/sysdeps/unix/sysv/linux/arm/vfork.S @@ -32,9 +32,9 @@ rocess, ENTRY (__vfork) -#ifdef __NR_vfork SINGLE_THREAD_P bne HIDDEN_JUMPTARGET (__fork) +#ifdef __NR_vfork swi __NR_vfork cmn a1, #4096 RETINSTR(movcc, pc, lr) diff --git a/linuxthreads/sysdeps/unix/sysv/linux/powerpc/powerpc32/vfork.S b/linuxthreads/sysdeps/unix/sysv/linux/powerpc/powerpc32/vfork.S index f62d3f44c3..17590059b6 100644 --- a/linuxthreads/sysdeps/unix/sysv/linux/powerpc/powerpc32/vfork.S +++ b/linuxthreads/sysdeps/unix/sysv/linux/powerpc/powerpc32/vfork.S @@ -31,7 +31,11 @@ ENTRY (__vfork) #ifdef __NR_vfork SINGLE_THREAD_P +# ifdef SHARED bne- HIDDEN_JUMPTARGET(__fork) +# else + bne- .Lhidden_fork +# endif DO_CALL (SYS_ify (vfork)); @@ -41,7 +45,11 @@ ENTRY (__vfork) bnslr+ /* Check if vfork syscall is known at all. */ cmpwi r3,ENOSYS +# ifdef SHARED bne JUMPTARGET(__syscall_error) +# else + bne .Lsyscall_error +# endif # endif #endif @@ -53,6 +61,13 @@ ENTRY (__vfork) PSEUDO_RET #endif +# ifndef SHARED +.Lhidden_fork: + b HIDDEN_JUMPTARGET(__fork) +.Lsyscall_error: + b JUMPTARGET(__syscall_error) +# endif + PSEUDO_END (__vfork) libc_hidden_def (__vfork) diff --git a/linuxthreads/sysdeps/unix/sysv/linux/powerpc/powerpc64/vfork.S b/linuxthreads/sysdeps/unix/sysv/linux/powerpc/powerpc64/vfork.S new file mode 100644 index 0000000000..8b2f806f93 --- /dev/null +++ b/linuxthreads/sysdeps/unix/sysv/linux/powerpc/powerpc64/vfork.S @@ -0,0 +1,59 @@ +/* Copyright (C) 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 + 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 +#define _ERRNO_H 1 +#include +#include + +/* 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 + bne- HIDDEN_JUMPTARGET(__fork) + + DO_CALL (SYS_ify (vfork)); + +# ifdef __ASSUME_VFORK_SYSCALL + PSEUDO_RET +# else + bnslr+ + /* Check if vfork syscall is known at all. */ + cmpdi r3,ENOSYS + bne JUMPTARGET(__syscall_error) + +# endif +#endif + +#ifndef __ASSUME_VFORK_SYSCALL + /* If we don't have vfork, fork is close enough. */ + + DO_CALL (SYS_ify (fork)); + PSEUDO_RET +#endif + +PSEUDO_END (__vfork) +libc_hidden_def (__vfork) + +weak_alias (__vfork, vfork) diff --git a/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S b/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S index adf7b220be..9378bd8522 100644 --- a/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S +++ b/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S @@ -23,7 +23,11 @@ ENTRY(__vfork) ld [%g6 + MULTIPLE_THREADS_OFFSET], %o0 cmp %o0, 0 +#ifdef SHARED bne HIDDEN_JUMPTARGET(__fork) +#else + bne 1f +#endif mov __NR_vfork, %g1 ta 0x10; bcs __syscall_error_handler @@ -31,6 +35,11 @@ ENTRY(__vfork) sub %o1, 1, %o1 retl and %o0, %o1, %o0 +#ifndef SHARED +1: mov %o7, %g1 + call HIDDEN_JUMPTARGET(__fork) + mov %g1, %o7 +#endif SYSCALL_ERROR_HANDLER PSEUDO_END (__vfork) libc_hidden_def (__vfork) diff --git a/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S b/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S index e4ea9180cf..bcfcedfc2d 100644 --- a/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S +++ b/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S @@ -22,7 +22,12 @@ .text ENTRY(__vfork) ld [%g6 + MULTIPLE_THREADS_OFFSET], %o0 +#ifdef SHARED + cmp %o0, 0 bne HIDDEN_JUMPTARGET (__fork) +#else + brnz,pn %o0, 1f +#endif mov __NR_vfork, %g1 ta 0x6d bcs,pn %xcc, __syscall_error_handler @@ -30,6 +35,11 @@ ENTRY(__vfork) sub %o1, 1, %o1 retl and %o0, %o1, %o0 +#ifndef SHARED +1: mov %o7, %g1 + call HIDDEN_JUMPTARGET(__fork) + mov %g1, %o7 +#endif SYSCALL_ERROR_HANDLER PSEUDO_END (__vfork) libc_hidden_def (__vfork) -- cgit 1.4.1