|  | @@ -20,32 +20,20 @@
 | 
	
		
			
				|  |  |  /* clone() is even more special than fork() as it mucks with stacks
 | 
	
		
			
				|  |  |     and invokes a function in the right context after its all over.  */
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -#include <asm/errno.h>
 | 
	
		
			
				|  |  | +#include <bits/errno.h>
 | 
	
		
			
				|  |  | +#include <sys/syscall.h>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -/* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg); */
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        .text
 | 
	
		
			
				|  |  | -.globl __clone;
 | 
	
		
			
				|  |  | -.type	 __clone,@function
 | 
	
		
			
				|  |  | -.align 4;                                                               \
 | 
	
		
			
				|  |  | +.text
 | 
	
		
			
				|  |  | +.align 4
 | 
	
		
			
				|  |  | +.type	__clone,@function
 | 
	
		
			
				|  |  | +.globl	__clone;
 | 
	
		
			
				|  |  |  __clone:
 | 
	
		
			
				|  |  |  	/* Sanity check arguments.  */
 | 
	
		
			
				|  |  | -	movl	$-EINVAL,%eax
 | 
	
		
			
				|  |  |  	movl	4(%esp),%ecx		/* no NULL function pointers */
 | 
	
		
			
				|  |  | -#ifdef PIC
 | 
	
		
			
				|  |  | -	jecxz	SYSCALL_ERROR_LABEL
 | 
	
		
			
				|  |  | -#else
 | 
	
		
			
				|  |  | -	testl	%ecx,%ecx
 | 
	
		
			
				|  |  | -	jz	SYSCALL_ERROR_LABEL
 | 
	
		
			
				|  |  | -#endif
 | 
	
		
			
				|  |  | +	jecxz	CLONE_ERROR_LABEL
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  	movl	8(%esp),%ecx		/* no NULL stack pointers */
 | 
	
		
			
				|  |  | -#ifdef PIC
 | 
	
		
			
				|  |  | -	jecxz	SYSCALL_ERROR_LABEL
 | 
	
		
			
				|  |  | -#else
 | 
	
		
			
				|  |  | -	testl	%ecx,%ecx
 | 
	
		
			
				|  |  | -	jz	SYSCALL_ERROR_LABEL
 | 
	
		
			
				|  |  | -#endif
 | 
	
		
			
				|  |  | +	jecxz	CLONE_ERROR_LABEL
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	/* Insert the argument onto the new stack.  */
 | 
	
		
			
				|  |  |  	subl	$8,%ecx
 | 
	
	
		
			
				|  | @@ -65,22 +53,35 @@ __clone:
 | 
	
		
			
				|  |  |  	popl	%ebx
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	test	%eax,%eax
 | 
	
		
			
				|  |  | -	jl	SYSCALL_ERROR_LABEL
 | 
	
		
			
				|  |  | -	jz	thread_start
 | 
	
		
			
				|  |  | +	jl	CLONE_ERROR_LABEL
 | 
	
		
			
				|  |  | +	jne	CLONE_RETURN_LABEL
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -L(pseudo_end):
 | 
	
		
			
				|  |  | -	ret
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -thread_start:
 | 
	
		
			
				|  |  | +	/* Start thread */
 | 
	
		
			
				|  |  |  	subl	%ebp,%ebp	/* terminate the stack frame */
 | 
	
		
			
				|  |  |  	call	*%ebx
 | 
	
		
			
				|  |  | +	pushl	%eax
 | 
	
		
			
				|  |  | +	call	_exit
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +CLONE_ERROR_LABEL:
 | 
	
		
			
				|  |  | +	negl    %eax
 | 
	
		
			
				|  |  | +	pushl   %eax
 | 
	
		
			
				|  |  |  #ifdef PIC
 | 
	
		
			
				|  |  |  	call	L(here)
 | 
	
		
			
				|  |  |  L(here):
 | 
	
		
			
				|  |  |  	popl	%ebx
 | 
	
		
			
				|  |  |  	addl	$_GLOBAL_OFFSET_TABLE_+[.-L(here)], %ebx
 | 
	
		
			
				|  |  | +	call    __errno_location@PLT
 | 
	
		
			
				|  |  | +#else
 | 
	
		
			
				|  |  | +	call	__errno_location
 | 
	
		
			
				|  |  |  #endif
 | 
	
		
			
				|  |  | -	pushl	%eax
 | 
	
		
			
				|  |  | -	call	_exit
 | 
	
		
			
				|  |  | +	popl	%ecx
 | 
	
		
			
				|  |  | +	movl	%ecx, (%eax)
 | 
	
		
			
				|  |  | +	xorl	%eax, %eax
 | 
	
		
			
				|  |  | +	decl	%eax
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +CLONE_RETURN_LABEL:
 | 
	
		
			
				|  |  | +	ret
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +.globl	clone;
 | 
	
		
			
				|  |  | +    clone = __clone
 | 
	
		
			
				|  |  |  
 |