diff options
author | Roland McGrath <roland@hack.frob.com> | 2014-07-03 22:09:33 -0700 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2014-08-04 09:50:41 -0400 |
commit | 9c925ff964bf221207dd6727d468ee964e2725fd (patch) | |
tree | 19bbbf928807cbfbb80cbbfd9ce647d487b29ad5 /sysdeps/unix/sysv/linux/ia64/vfork.S | |
parent | e641054cd8a362a904b6ca898ef00e64ce42df29 (diff) | |
download | glibc-9c925ff964bf221207dd6727d468ee964e2725fd.tar glibc-9c925ff964bf221207dd6727d468ee964e2725fd.tar.gz glibc-9c925ff964bf221207dd6727d468ee964e2725fd.tar.bz2 glibc-9c925ff964bf221207dd6727d468ee964e2725fd.zip |
IA64: Consolidate NPTL/non versions of vfork
Diffstat (limited to 'sysdeps/unix/sysv/linux/ia64/vfork.S')
-rw-r--r-- | sysdeps/unix/sysv/linux/ia64/vfork.S | 35 |
1 files changed, 31 insertions, 4 deletions
diff --git a/sysdeps/unix/sysv/linux/ia64/vfork.S b/sysdeps/unix/sysv/linux/ia64/vfork.S index 0422104b45..ff2d22b902 100644 --- a/sysdeps/unix/sysv/linux/ia64/vfork.S +++ b/sysdeps/unix/sysv/linux/ia64/vfork.S @@ -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) |