diff options
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | arch/i386/pthread_arch.h | 6 | ||||
-rw-r--r-- | src/internal/pthread_impl.h | 10 | ||||
-rw-r--r-- | src/thread/__set_thread_area.c | 9 | ||||
-rw-r--r-- | src/thread/clone.c | 26 | ||||
-rw-r--r-- | src/thread/i386/__set_thread_area.s | 22 | ||||
-rw-r--r-- | src/thread/pthread_self.c | 12 |
7 files changed, 34 insertions, 53 deletions
diff --git a/Makefile b/Makefile index d0f16dfc..13a24e3c 100644 --- a/Makefile +++ b/Makefile @@ -22,7 +22,7 @@ GENH = include/bits/alltypes.h CFLAGS = -Os -nostdinc -ffreestanding -std=c99 -D_XOPEN_SOURCE=700 -pipe LDFLAGS = -nostdlib -shared -Wl,-Bsymbolic -INC = -I./include -I./src/internal +INC = -I./include -I./src/internal -I./arch/$(ARCH) PIC = -fPIC AR = $(CROSS_COMPILE)ar RANLIB = $(CROSS_COMPILE)ranlib diff --git a/arch/i386/pthread_arch.h b/arch/i386/pthread_arch.h new file mode 100644 index 00000000..155b4847 --- /dev/null +++ b/arch/i386/pthread_arch.h @@ -0,0 +1,6 @@ +static inline struct pthread *__pthread_self() +{ + struct pthread *self; + __asm__ ("movl %%gs:0,%0" : "=r" (self) ); + return self; +} diff --git a/src/internal/pthread_impl.h b/src/internal/pthread_impl.h index d751f197..e481ab5a 100644 --- a/src/internal/pthread_impl.h +++ b/src/internal/pthread_impl.h @@ -38,19 +38,13 @@ struct pthread { pthread_attr_t attr; }; -static inline struct pthread *__pthread_self() -{ - struct pthread *self; - __asm__ ("movl %%gs:0,%0" : "=r" (self) ); - return self; -} +#include "pthread_arch.h" #define SIGCANCEL 32 #define SIGSYSCALL 33 #define SIGTIMER 32 /* ?? */ -int __set_thread_area(unsigned long *); -int __set_pthread_self(void *); +int __set_thread_area(void *); int __libc_sigaction(int, const struct sigaction *, struct sigaction *); int __libc_sigprocmask(int, const sigset_t *, sigset_t *); void __lock(volatile int *); diff --git a/src/thread/__set_thread_area.c b/src/thread/__set_thread_area.c index 576d8b40..e69de29b 100644 --- a/src/thread/__set_thread_area.c +++ b/src/thread/__set_thread_area.c @@ -1,9 +0,0 @@ -#include "syscall.h" - -int __set_thread_area(unsigned long *desc) -{ - if (syscall1(__NR_set_thread_area, (long)desc) < 0) - return -1; - __asm__ __volatile__ ( "movw %w0,%%gs" : : "r"(desc[0]*8+3) ); - return 0; -} diff --git a/src/thread/clone.c b/src/thread/clone.c index 971bfeed..e69de29b 100644 --- a/src/thread/clone.c +++ b/src/thread/clone.c @@ -1,26 +0,0 @@ -#if 0 - -int clone(int (*start)(void *), void *stack, int flags, void *arg, - pid_t *ptid, struct user_desc *tls, pid_t *ctid) -{ - int ret; - __asm__( - "andl $-16,%%ecx \n\t" - "xchgl %%ebx,%2 \n\t" - "movl %%ebx,(%%ecx) \n\t" - "int $0x80 \n\t" - "testl %%eax,%%eax \n\t" - "jnz 1f \n\t" - "xorl %%ebp,%%ebp \n\t" - "call *%%ebx \n\t" - "\n1: \n\t" - "xchgl %%ebx,%2 \n\t" - : "=a" (ret) - : "a" (__NR_clone), "m" (flags), "c"(stack), "d"(ptid), - "S" (tls), "D" (ctid) - : "memory" - ); - return __syscall_ret(ret); -} - -#endif diff --git a/src/thread/i386/__set_thread_area.s b/src/thread/i386/__set_thread_area.s new file mode 100644 index 00000000..9bf698b5 --- /dev/null +++ b/src/thread/i386/__set_thread_area.s @@ -0,0 +1,22 @@ +.text +.global __set_thread_area +.type __set_thread_area,%function +__set_thread_area: + pushl %ebx + movl 8(%esp),%ecx + movl $-1,4(%ecx) + movl %ecx,8(%ecx) + movl $0xfffff,12(%ecx) + movl $0x51,16(%ecx) + leal 4(%ecx),%ebx + movl $243,%eax + int $128 + popl %ebx + testl %eax,%eax + jnz 1f + movl 4(%ecx),%ecx + leal 3(,%ecx,8),%ecx + movw %cx,%gs +1: + ret +.size __set_thread_area,.-__set_thread_area diff --git a/src/thread/pthread_self.c b/src/thread/pthread_self.c index 686d73d5..3a4d4c58 100644 --- a/src/thread/pthread_self.c +++ b/src/thread/pthread_self.c @@ -5,27 +5,21 @@ static struct pthread main_thread; #undef errno static int *errno_location() { - return pthread_self()->errno_ptr; + return __pthread_self()->errno_ptr; } static int init_main_thread() { - main_thread.tlsdesc[0] = -1; - main_thread.tlsdesc[1] = (long)&main_thread; - main_thread.tlsdesc[2] = SIZE_MAX/PAGE_SIZE; - main_thread.tlsdesc[3] = 0x51; main_thread.self = &main_thread; - main_thread.errno_ptr = __errno_location(); - if (__set_thread_area(main_thread.tlsdesc) < 0) + if (__set_thread_area(&main_thread) < 0) return -1; syscall1(__NR_set_tid_address, (long)&main_thread.tid); + main_thread.errno_ptr = __errno_location(); libc.errno_location = errno_location; main_thread.tid = main_thread.pid = getpid(); return 0; } -#undef pthread_self - pthread_t pthread_self() { static int init, failed; |