mirror of
git://sourceware.org/git/glibc.git
synced 2025-01-30 12:31:53 +08:00
IA64: Consolidate NPTL/non versions of vfork
This commit is contained in:
parent
e641054cd8
commit
9c925ff964
@ -1,3 +1,12 @@
|
||||
2014-08-04 Roland McGrath <roland@hack.frob.com>
|
||||
|
||||
* sysdeps/unix/sysv/linux/ia64/nptl/vfork.S: Moved ...
|
||||
* sysdeps/unix/sysv/linux/ia64/vfork.S: ... here.
|
||||
(__libc_vfork): Define function under this name.
|
||||
(__vfork): Define as an alias.
|
||||
* sysdeps/unix/sysv/linux/ia64/pt-vfork.S: New file.
|
||||
* sysdeps/unix/sysv/linux/ia64/nptl/pt-vfork.S: File removed.
|
||||
|
||||
2014-08-04 Roland McGrath <roland@hack.frob.com>
|
||||
|
||||
* sysdeps/unix/sysv/linux/ia64/clone2.S: Deconditionalize the code
|
||||
|
@ -1,59 +0,0 @@
|
||||
/* Copyright (C) 2000-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 _SIGNAL_H
|
||||
#include <bits/signum.h>
|
||||
#include <tcb-offsets.h>
|
||||
|
||||
/* The following are defined in linux/sched.h, which unfortunately */
|
||||
/* is not safe for inclusion in an assembly file. */
|
||||
#define CLONE_VM 0x00000100 /* set if VM shared between processes */
|
||||
#define CLONE_VFORK 0x00004000 /* set if the parent wants the child to wake it up on mm_release */
|
||||
|
||||
/* pid_t vfork(void); */
|
||||
/* Implemented as __clone_syscall(CLONE_VFORK | CLONE_VM | SIGCHLD, 0) */
|
||||
|
||||
ENTRY(__vfork)
|
||||
.prologue // work around a GAS bug which triggers if
|
||||
.body // first .prologue is not at the beginning of proc.
|
||||
alloc r2=ar.pfs,0,0,2,0
|
||||
adds r14=PID,r13
|
||||
;;
|
||||
ld4 r16=[r14]
|
||||
;;
|
||||
sub r15=0,r16
|
||||
mov out0=CLONE_VM+CLONE_VFORK+SIGCHLD
|
||||
mov out1=0 /* Standard sp value. */
|
||||
;;
|
||||
st4 [r14]=r15
|
||||
DO_CALL (SYS_ify (clone))
|
||||
cmp.eq p0,p7=0,r8
|
||||
adds r14=PID,r13
|
||||
;;
|
||||
(p7) ld4 r16=[r14]
|
||||
cmp.eq p6,p0=-1,r10
|
||||
;;
|
||||
(p7) sub r15=0,r16
|
||||
;;
|
||||
(p7) st4 [r14]=r15
|
||||
(p6) br.cond.spnt.few __syscall_error
|
||||
ret
|
||||
PSEUDO_END(__vfork)
|
||||
|
||||
weak_alias (__vfork, vfork)
|
@ -1,68 +0,0 @@
|
||||
/* Copyright (C) 2000-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 _SIGNAL_H
|
||||
#include <bits/signum.h>
|
||||
#include <tcb-offsets.h>
|
||||
|
||||
/* The following are defined in linux/sched.h, which unfortunately */
|
||||
/* is not safe for inclusion in an assembly file. */
|
||||
#define CLONE_VM 0x00000100 /* set if VM shared between processes */
|
||||
#define CLONE_VFORK 0x00004000 /* set if the parent wants the child to wake it up on mm_release */
|
||||
|
||||
/* pid_t vfork(void); */
|
||||
/* Implemented as __clone_syscall(CLONE_VFORK | CLONE_VM | SIGCHLD, 0) */
|
||||
|
||||
ENTRY(__vfork)
|
||||
.prologue // work around a GAS bug which triggers if
|
||||
.body // first .prologue is not at the beginning of proc.
|
||||
alloc r2=ar.pfs,0,0,2,0
|
||||
adds r14=PID,r13
|
||||
;;
|
||||
ld4 r16=[r14]
|
||||
;;
|
||||
sub r15=0,r16
|
||||
cmp.eq p6,p0=0,r16
|
||||
;;
|
||||
(p6) movl r15=0x80000000
|
||||
mov out0=CLONE_VM+CLONE_VFORK+SIGCHLD
|
||||
mov out1=0 /* Standard sp value. */
|
||||
;;
|
||||
st4 [r14]=r15
|
||||
DO_CALL (SYS_ify (clone))
|
||||
cmp.eq p6,p0=0,r8
|
||||
adds r14=PID,r13
|
||||
(p6) br.cond.dptk 1f
|
||||
;;
|
||||
ld4 r15=[r14]
|
||||
;;
|
||||
extr.u r16=r15,0,31
|
||||
;;
|
||||
cmp.eq p0,p6=0,r16
|
||||
;;
|
||||
(p6) sub r16=0,r15
|
||||
;;
|
||||
st4 [r14]=r16
|
||||
1:
|
||||
cmp.eq p6,p0=-1,r10
|
||||
(p6) br.cond.spnt.few __syscall_error
|
||||
ret
|
||||
PSEUDO_END(__vfork)
|
||||
libc_hidden_def (__vfork)
|
||||
weak_alias (__vfork, vfork)
|
48
sysdeps/unix/sysv/linux/ia64/pt-vfork.S
Normal file
48
sysdeps/unix/sysv/linux/ia64/pt-vfork.S
Normal file
@ -0,0 +1,48 @@
|
||||
/* vfork ABI-compatibility entry points for libpthread. IA64 version.
|
||||
Copyright (C) 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>
|
||||
#include <shlib-compat.h>
|
||||
|
||||
/* libpthread used to have its own vfork implementation that differed
|
||||
from libc's only in having a pointless micro-optimization. There
|
||||
is no longer any use to having a separate copy in libpthread, but
|
||||
the historical ABI requires it. For static linking, there is no
|
||||
need to provide anything here--the libc version will be linked in.
|
||||
For shared library ABI compatibility, there must be __vfork and
|
||||
vfork symbols in libpthread.so. */
|
||||
|
||||
#if (SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_20) \
|
||||
|| SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_20))
|
||||
|
||||
LOCAL_LEAF (vfork_compat)
|
||||
br __libc_vfork
|
||||
;;
|
||||
END (vfork_compat)
|
||||
|
||||
#endif
|
||||
|
||||
#if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_20)
|
||||
weak_alias (vfork_compat, vfork)
|
||||
compat_symbol (libpthread, vfork_compat, vfork, GLIBC_2_0);
|
||||
#endif
|
||||
|
||||
#if SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_20)
|
||||
strong_alias (vfork_compat, __vfork_compat)
|
||||
compat_symbol (libpthread, __vfork_compat, __vfork, GLIBC_2_1_2);
|
||||
#endif
|
@ -19,6 +19,7 @@
|
||||
#include <sysdep.h>
|
||||
#define _SIGNAL_H
|
||||
#include <bits/signum.h>
|
||||
#include <tcb-offsets.h>
|
||||
|
||||
/* The following are defined in linux/sched.h, which unfortunately */
|
||||
/* is not safe for inclusion in an assembly file. */
|
||||
@ -28,16 +29,42 @@
|
||||
/* pid_t vfork(void); */
|
||||
/* Implemented as __clone_syscall(CLONE_VFORK | CLONE_VM | SIGCHLD, 0) */
|
||||
|
||||
ENTRY(__vfork)
|
||||
ENTRY (__libc_vfork)
|
||||
.prologue // work around a GAS bug which triggers if
|
||||
.body // first .prologue is not at the beginning of proc.
|
||||
alloc r2=ar.pfs,0,0,2,0
|
||||
adds r14=PID,r13
|
||||
;;
|
||||
ld4 r16=[r14]
|
||||
;;
|
||||
sub r15=0,r16
|
||||
cmp.eq p6,p0=0,r16
|
||||
;;
|
||||
(p6) movl r15=0x80000000
|
||||
mov out0=CLONE_VM+CLONE_VFORK+SIGCHLD
|
||||
mov out1=0 /* Standard sp value. */
|
||||
;;
|
||||
DO_CALL_VIA_BREAK (SYS_ify (clone))
|
||||
st4 [r14]=r15
|
||||
DO_CALL (SYS_ify (clone))
|
||||
cmp.eq p6,p0=0,r8
|
||||
adds r14=PID,r13
|
||||
(p6) br.cond.dptk 1f
|
||||
;;
|
||||
ld4 r15=[r14]
|
||||
;;
|
||||
extr.u r16=r15,0,31
|
||||
;;
|
||||
cmp.eq p0,p6=0,r16
|
||||
;;
|
||||
(p6) sub r16=0,r15
|
||||
;;
|
||||
st4 [r14]=r16
|
||||
1:
|
||||
cmp.eq p6,p0=-1,r10
|
||||
(p6) br.cond.spnt.few __syscall_error
|
||||
ret
|
||||
PSEUDO_END(__vfork)
|
||||
libc_hidden_def (__vfork)
|
||||
PSEUDO_END (__libc_vfork)
|
||||
|
||||
strong_alias (__libc_vfork, __vfork)
|
||||
libc_hidden_def (__vfork)
|
||||
weak_alias (__vfork, vfork)
|
||||
|
Loading…
Reference in New Issue
Block a user