about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/internal/pthread_impl.h8
-rw-r--r--src/thread/i386/clone.s42
-rw-r--r--src/thread/pthread_create.c6
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);