SH: Consolidate NPTL/non versions of vfork

This commit is contained in:
Roland McGrath 2014-06-02 14:29:19 -07:00
parent 9fa76613d0
commit d936d379eb
5 changed files with 43 additions and 164 deletions

View File

@ -1,3 +1,13 @@
2014-06-02 Roland McGrath <roland@hack.frob.com>
* nptl/sysdeps/unix/sysv/linux/sh/vfork.S: Moved ...
* sysdeps/unix/sysv/linux/sh/vfork.S: ... here.
Label the code __libc_vfork rather than __vfork.
[!NOT_IN_libc] (vfork): Define as weak alias.
[!NOT_IN_libc] (__vfork): Define as strong alias, and libc_hidden_def.
* sysdeps/unix/sysv/linux/sh/pt-vfork.S: New file.
* nptl/sysdeps/unix/sysv/linux/sh/pt-vfork.S: File removed.
2014-06-02 Siddhesh Poyarekar <siddhesh@redhat.com> 2014-06-02 Siddhesh Poyarekar <siddhesh@redhat.com>
* malloc/malloc.c (malloc_info): Fix format specifier for * malloc/malloc.c (malloc_info): Fix format specifier for

View File

@ -1,65 +0,0 @@
/* Copyright (C) 2003-2014 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, see
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
#define _ERRNO_H 1
#include <bits/errno.h>
#include <tcb-offsets.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)
/* Save the PID value. */
stc gbr, r2
mov.w .L2, r0
mov.l @(r0,r2), r4
neg r4, r1
mov.l r1, @(r0,r2)
mov.w .L1, r3
trapa #0x10
mov r0, r1
/* Restore the old PID value in the parent. */
tst r0, r0
bt/s 2f
stc gbr, r2
mov.w .L2, r0
mov.l r4, @(r0,r2)
mov r1, r0
2:
mov #-12, r2
shad r2, r1
not r1, r1 // r1=0 means r0 = -1 to -4095
tst r1, r1 // i.e. error in linux
bf .Lpseudo_end
SYSCALL_ERROR_HANDLER
.Lpseudo_end:
rts
nop
.L1:
.word __NR_vfork
.L2:
.word PID - TLS_PRE_TCB_SIZE
PSEUDO_END (__vfork)
libc_hidden_def (__vfork)
weak_alias (__vfork, vfork)

View File

@ -1,70 +0,0 @@
/* Copyright (C) 2004-2014 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, see
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
#define _ERRNO_H 1
#include <bits/errno.h>
#include <tcb-offsets.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)
/* Save the PID value. */
stc gbr, r2
mov.w .L2, r0
mov.l @(r0,r2), r4
neg r4, r1
tst r1, r1
bf 1f
mov #1, r1
rotr r1
1:
mov.l r1, @(r0,r2)
mov.w .L1, r3
trapa #0x10
mov r0, r1
/* Restore the old PID value in the parent. */
tst r0, r0
bt.s 2f
stc gbr, r2
mov.w .L2, r0
mov.l r4, @(r0,r2)
mov r1, r0
2:
mov #-12, r2
shad r2, r1
not r1, r1 // r1=0 means r0 = -1 to -4095
tst r1, r1 // i.e. error in linux
bf .Lpseudo_end
SYSCALL_ERROR_HANDLER
.Lpseudo_end:
rts
nop
.L1:
.word __NR_vfork
.L2:
.word PID - TLS_PRE_TCB_SIZE
.align 2
PSEUDO_END (__vfork)
libc_hidden_def (__vfork)
weak_alias (__vfork, vfork)

View File

@ -0,0 +1 @@
#include <sysdeps/unix/sysv/linux/alpha/pt-vfork.S>

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1999-2014 Free Software Foundation, Inc. /* Copyright (C) 2004-2014 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -18,53 +18,56 @@
#include <sysdep.h> #include <sysdep.h>
#define _ERRNO_H 1 #define _ERRNO_H 1
#include <bits/errno.h> #include <bits/errno.h>
#include <tcb-offsets.h>
/* Clone the calling process, but without copying the whole address space. /* Clone the calling process, but without copying the whole address space.
The calling process is suspended until the new process exits or is 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, 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. */ and the process ID of the new process to the old process. */
ENTRY (__vfork) ENTRY (__libc_vfork)
/* Save the PID value. */
#ifdef __NR_vfork stc gbr, r2
mov.w .L3, r3 mov.w .L2, r0
trapa #0x10 mov.l @(r0,r2), r4
mov r0, r1 neg r4, r1
mov #-12, r2 tst r1, r1
shad r2, r1
not r1, r1 // r1=0 means r0 = -1 to -4095
tst r1, r1 // i.e. error in linux
bf 1f bf 1f
mov.w .L1, r1 mov #1, r1
cmp/eq r1, r0 rotr r1
bt 2f
bra .Lsyscall_error
nop
.L1:
.word -ENOSYS
.L3: .word __NR_vfork
1: 1:
rts mov.l r1, @(r0,r2)
nop
2:
#endif
/* If we don't have vfork, fork is close enough. */ mov.w .L1, r3
mov #+__NR_fork, r3
trapa #0x10 trapa #0x10
mov r0, r1 mov r0, r1
/* Restore the old PID value in the parent. */
tst r0, r0
bt.s 2f
stc gbr, r2
mov.w .L2, r0
mov.l r4, @(r0,r2)
mov r1, r0
2:
mov #-12, r2 mov #-12, r2
shad r2, r1 shad r2, r1
not r1, r1 // r1=0 means r0 = -1 to -4095 not r1, r1 // r1=0 means r0 = -1 to -4095
tst r1, r1 // i.e. error in linux tst r1, r1 // i.e. error in linux
bf .Lpseudo_end bf .Lpseudo_end
.Lsyscall_error:
SYSCALL_ERROR_HANDLER SYSCALL_ERROR_HANDLER
.Lpseudo_end: .Lpseudo_end:
rts rts
nop nop
.L1:
.word __NR_vfork
.L2:
.word PID - TLS_PRE_TCB_SIZE
.align 2
PSEUDO_END (__libc_vfork)
PSEUDO_END (__vfork) #if !NOT_IN_libc
weak_alias (__libc_vfork, vfork)
strong_alias (__libc_vfork, __vfork)
libc_hidden_def (__vfork) libc_hidden_def (__vfork)
#endif
weak_alias (__vfork, vfork)