summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-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);