diff options
-rw-r--r-- | sysdeps/unix/sysv/linux/i386/clone.S | 21 |
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 |