summaryrefslogtreecommitdiff
path: root/sysdeps/unix/sysv/linux/ia64/clone2.S
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix/sysv/linux/ia64/clone2.S')
-rw-r--r--sysdeps/unix/sysv/linux/ia64/clone2.S11
1 files changed, 7 insertions, 4 deletions
diff --git a/sysdeps/unix/sysv/linux/ia64/clone2.S b/sysdeps/unix/sysv/linux/ia64/clone2.S
index 136bb5591a..69c9e05044 100644
--- a/sysdeps/unix/sysv/linux/ia64/clone2.S
+++ b/sysdeps/unix/sysv/linux/ia64/clone2.S
@@ -30,7 +30,7 @@
ENTRY(__clone2)
.prologue
- alloc r2=ar.pfs,8,0,6,0
+ alloc r2=ar.pfs,8,1,6,0
cmp.eq p6,p0=0,in0
mov r8=EINVAL
mov out0=in3 /* Flags are first syscall argument. */
@@ -63,8 +63,7 @@ ENTRY(__clone2)
cmp.eq CHILD,PARENT=0,r8 /* Are we the child? */
(p6) br.cond.spnt.many __syscall_error
;;
-(CHILD) ld8 out1=[in0],8 /* Retrieve code pointer. */
-(CHILD) mov out0=in4 /* Pass proper argument to fn */
+(CHILD) mov loc0=gp
(PARENT) ret
;;
#ifdef RESET_PID
@@ -83,11 +82,15 @@ ENTRY(__clone2)
st4 [r10]=r8
;;
#endif
-1: ld8 gp=[in0] /* Load function gp. */
+1: ld8 out1=[in0],8 /* Retrieve code pointer. */
+ mov out0=in4 /* Pass proper argument to fn */
+ ;;
+ ld8 gp=[in0] /* Load function gp. */
mov b6=out1
br.call.dptk.many rp=b6 /* Call fn(arg) in the child */
;;
mov out0=r8 /* Argument to _exit */
+ mov gp=loc0
.globl HIDDEN_JUMPTARGET(_exit)
br.call.dpnt.many rp=HIDDEN_JUMPTARGET(_exit)
/* call _exit with result from fn. */