diff options
Diffstat (limited to 'src')
| -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 | 
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; | 
