diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/internal/pthread_impl.h | 8 | ||||
| -rw-r--r-- | src/thread/i386/clone.s | 42 | ||||
| -rw-r--r-- | src/thread/pthread_create.c | 6 | 
3 files changed, 22 insertions, 34 deletions
| diff --git a/src/internal/pthread_impl.h b/src/internal/pthread_impl.h index b7892103..d751f197 100644 --- a/src/internal/pthread_impl.h +++ b/src/internal/pthread_impl.h @@ -20,9 +20,10 @@  #define pthread __pthread  struct pthread { -	struct pthread *self, *join; -	int errno_val; +	struct pthread *self; +	unsigned long tlsdesc[4];  	pid_t tid, pid; +	int tsd_used, errno_val, *errno_ptr;  	volatile int canceldisable, cancelasync, cancelpoint, cancel;  	unsigned char *map_base;  	size_t map_size; @@ -32,12 +33,9 @@ struct pthread {  	jmp_buf exit_jmp_buf;  	int detached;  	int exitlock; -	unsigned long tlsdesc[4];  	struct __ptcb *cancelbuf;  	void **tsd; -	int tsd_used;  	pthread_attr_t attr; -	int *errno_ptr;  };  static inline struct pthread *__pthread_self() diff --git a/src/thread/i386/clone.s b/src/thread/i386/clone.s index 4f33366c..53405cf1 100644 --- a/src/thread/i386/clone.s +++ b/src/thread/i386/clone.s @@ -1,35 +1,27 @@  .text -.global __clone -.type   __clone,%function -__clone: -	movl	8(%esp),%ecx -	andl	$0xfffffff0, %ecx -	subl	$28,%ecx -	movl	16(%esp),%eax -	movl	%eax,12(%ecx) -	movl	4(%esp),%eax -	movl	%eax,8(%ecx) +.global __uniclone +.type   __uniclone,%function +__uniclone: +	movl	4(%esp),%ecx +	subl	$24,%ecx +	movl	8(%esp),%eax +	movl	%eax,16(%ecx) +	movl	12(%esp),%eax +	movl	%eax,24(%ecx)  	pushl	%ebx  	pushl	%esi  	pushl	%edi +	pushl   %ebp +	movl    %eax,8(%eax) +	leal    20(%eax),%edx +	leal    4(%eax),%esi +	movl	%edx,%edi +	movl	$0x7d0f00,%ebx  	movl	$120,%eax -	movl	12+12(%esp),%ebx -	movl	20+12(%esp),%edx -	movl	24+12(%esp),%esi -	movl	28+12(%esp),%edi  	int	$128 +	popl    %ebp  	popl	%edi  	popl	%esi  	popl	%ebx -	test	%eax,%eax -	jnz	1f -	xorl	%ebp,%ebp -	call	*%ebx -	movl	%eax, %ebx -	movl	$1, %eax -	int	$128 -1:	 -	movl %eax, 4(%esp)  	ret - -.size __clone,.-__clone +.size __uniclone,.-__uniclone diff --git a/src/thread/pthread_create.c b/src/thread/pthread_create.c index d01be551..af6ccf07 100644 --- a/src/thread/pthread_create.c +++ b/src/thread/pthread_create.c @@ -152,8 +152,7 @@ static int start(void *p)  	return 0;  } -#define CLONE_MAGIC 0x7d0f00 -int __clone(int (*)(void *), void *, int, void *, pid_t *, void *, pid_t *); +int __uniclone(void *, int (*)(), void *);  #define ROUND(x) (((x)+PAGE_SIZE-1)&-PAGE_SIZE) @@ -203,8 +202,7 @@ int pthread_create(pthread_t *res, const pthread_attr_t *attr, void *(*entry)(vo  	while (rs.lock) __wait(&rs.lock, 0, 1, 1);  	a_inc(&libc.threads_minus_1); -	ret = __clone(start, stack, CLONE_MAGIC, new, -		&new->tid, &new->tlsdesc, &new->tid); +	ret = __uniclone(stack, start, new);  	a_dec(&rs.blocks);  	if (rs.lock) __wake(&rs.blocks, 1, 1); | 
