about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--sysdeps/unix/sysv/linux/i386/clone.S21
1 files changed, 13 insertions, 8 deletions
diff --git a/sysdeps/unix/sysv/linux/i386/clone.S b/sysdeps/unix/sysv/linux/i386/clone.S
index 8f655a7305..c0d5c03568 100644
--- a/sysdeps/unix/sysv/linux/i386/clone.S
+++ b/sysdeps/unix/sysv/linux/i386/clone.S
@@ -35,8 +35,9 @@
 #define STACK	FUNC+4
 #define FLAGS	STACK+PTR_SIZE
 #define ARG	FLAGS+4
-#define TID	ARG+PTR_SIZE
-#define TLS	TID+PTR_SIZE
+#define PTID	ARG+PTR_SIZE
+#define TLS	PTID+PTR_SIZE
+#define CTID	TLS+PTR_SIZE
 
 #define __NR_clone 120
 #define SYS_clone 120
@@ -61,25 +62,29 @@ ENTRY (BP_SYM (__clone))
 #endif
 
 	/* Insert the argument onto the new stack.  */
-	subl	$12,%ecx
+	subl	$16,%ecx
 	movl	ARG(%esp),%eax		/* no negative argument counts */
-	movl	%eax,8(%ecx)
+	movl	%eax,12(%ecx)
 
 	/* Save the function pointer as the zeroth argument.
 	   It will be popped off in the child in the ebx frobbing below.  */
 	movl	FUNC(%esp),%eax
-	movl	%eax,4(%ecx)
+	movl	%eax,8(%ecx)
 	/* Don't leak any information.  */
+	movl	$0,4(%ecx)
 	movl	$0,(%ecx)
 
 	/* Do the system call */
 	pushl	%ebx
 	pushl	%esi
-	movl	TLS+8(%esp),%esi
-	movl	TID+8(%esp),%edx
-	movl	FLAGS+8(%esp),%ebx
+	pushl	%edi
+	movl	TLS+12(%esp),%esi
+	movl	PTID+12(%esp),%edx
+	movl	FLAGS+12(%esp),%ebx
+	movl	CTID+12(%esp),%edi
 	movl	$SYS_ify(clone),%eax
 	int	$0x80
+	popl	%edi
 	popl	%esi
 	popl	%ebx