diff options
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) |