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); |