diff options
author | Ulrich Drepper <drepper@redhat.com> | 2003-01-15 01:23:02 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2003-01-15 01:23:02 +0000 |
commit | 574b892ef1054ea999a136b3cb2321a65e3f1a17 (patch) | |
tree | 4457b51f3d0318c24de35da02ce2d90ac818beb8 /linuxthreads/sysdeps/unix | |
parent | 086311a933ff53f8c064d833e69fe228bc7e8886 (diff) | |
download | glibc-574b892ef1054ea999a136b3cb2321a65e3f1a17.tar.gz glibc-574b892ef1054ea999a136b3cb2321a65e3f1a17.tar.xz glibc-574b892ef1054ea999a136b3cb2321a65e3f1a17.zip |
Update.
2003-01-14 Guido Guenther <agx@sigxcpu.org> * 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 <sjmunroe@us.ibm.com> * 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 <zzz@cd-club.ru>. that %eax is modified. Reported by Denis Zaitsev <zzz@cd-club.ru>.
Diffstat (limited to 'linuxthreads/sysdeps/unix')
6 files changed, 108 insertions, 1 deletions
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 <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 + 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) |