提交 7b2dd223 编写于 作者: R Rich Felker

finish unifying thread register handling in preparation for porting

上级 0b2006c8
...@@ -22,7 +22,7 @@ GENH = include/bits/alltypes.h ...@@ -22,7 +22,7 @@ GENH = include/bits/alltypes.h
CFLAGS = -Os -nostdinc -ffreestanding -std=c99 -D_XOPEN_SOURCE=700 -pipe CFLAGS = -Os -nostdinc -ffreestanding -std=c99 -D_XOPEN_SOURCE=700 -pipe
LDFLAGS = -nostdlib -shared -Wl,-Bsymbolic LDFLAGS = -nostdlib -shared -Wl,-Bsymbolic
INC = -I./include -I./src/internal INC = -I./include -I./src/internal -I./arch/$(ARCH)
PIC = -fPIC PIC = -fPIC
AR = $(CROSS_COMPILE)ar AR = $(CROSS_COMPILE)ar
RANLIB = $(CROSS_COMPILE)ranlib RANLIB = $(CROSS_COMPILE)ranlib
......
static inline struct pthread *__pthread_self()
{
struct pthread *self;
__asm__ ("movl %%gs:0,%0" : "=r" (self) );
return self;
}
...@@ -38,19 +38,13 @@ struct pthread { ...@@ -38,19 +38,13 @@ struct pthread {
pthread_attr_t attr; pthread_attr_t attr;
}; };
static inline struct pthread *__pthread_self() #include "pthread_arch.h"
{
struct pthread *self;
__asm__ ("movl %%gs:0,%0" : "=r" (self) );
return self;
}
#define SIGCANCEL 32 #define SIGCANCEL 32
#define SIGSYSCALL 33 #define SIGSYSCALL 33
#define SIGTIMER 32 /* ?? */ #define SIGTIMER 32 /* ?? */
int __set_thread_area(unsigned long *); int __set_thread_area(void *);
int __set_pthread_self(void *);
int __libc_sigaction(int, const struct sigaction *, struct sigaction *); int __libc_sigaction(int, const struct sigaction *, struct sigaction *);
int __libc_sigprocmask(int, const sigset_t *, sigset_t *); int __libc_sigprocmask(int, const sigset_t *, sigset_t *);
void __lock(volatile int *); void __lock(volatile int *);
......
#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;
}
#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
.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
...@@ -5,27 +5,21 @@ static struct pthread main_thread; ...@@ -5,27 +5,21 @@ static struct pthread main_thread;
#undef errno #undef errno
static int *errno_location() static int *errno_location()
{ {
return pthread_self()->errno_ptr; return __pthread_self()->errno_ptr;
} }
static int init_main_thread() 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.self = &main_thread;
main_thread.errno_ptr = __errno_location(); if (__set_thread_area(&main_thread) < 0)
if (__set_thread_area(main_thread.tlsdesc) < 0)
return -1; return -1;
syscall1(__NR_set_tid_address, (long)&main_thread.tid); syscall1(__NR_set_tid_address, (long)&main_thread.tid);
main_thread.errno_ptr = __errno_location();
libc.errno_location = errno_location; libc.errno_location = errno_location;
main_thread.tid = main_thread.pid = getpid(); main_thread.tid = main_thread.pid = getpid();
return 0; return 0;
} }
#undef pthread_self
pthread_t pthread_self() pthread_t pthread_self()
{ {
static int init, failed; static int init, failed;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册