summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile2
-rw-r--r--arch/i386/pthread_arch.h6
-rw-r--r--src/internal/pthread_impl.h10
-rw-r--r--src/thread/__set_thread_area.c9
-rw-r--r--src/thread/clone.c26
-rw-r--r--src/thread/i386/__set_thread_area.s22
-rw-r--r--src/thread/pthread_self.c12
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;