finish unifying thread register handling in preparation for porting

This commit is contained in:
Rich Felker
2011-02-15 03:56:52 -05:00
parent 0b2006c8fe
commit 7b2dd2235d
7 changed files with 34 additions and 53 deletions
+2 -8
View File
@@ -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 *);
-9
View File
@@ -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;
}
-26
View File
@@ -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
+22
View File
@@ -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
+3 -9
View File
@@ -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;