summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2011-02-15 03:56:52 -0500
committerRich Felker <dalias@aerifal.cx>2011-02-15 03:56:52 -0500
commit7b2dd2235dd0db3a2f71e25d1c0925e0348e1996 (patch)
tree26cab4bb4f2bff3b4cf8ccb2c0e497cf9631c893 /src
parent0b2006c8fea021b7fa1fd267bf270cb8c279f230 (diff)
downloadmusl-7b2dd2235dd0db3a2f71e25d1c0925e0348e1996.tar.gz
finish unifying thread register handling in preparation for porting
Diffstat (limited to 'src')
-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
5 files changed, 27 insertions, 52 deletions
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;