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

finish unifying thread register handling in preparation for porting

上级 0b2006c8
......@@ -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
......
static inline struct pthread *__pthread_self()
{
struct pthread *self;
__asm__ ("movl %%gs:0,%0" : "=r" (self) );
return self;
}
......@@ -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 *);
......
#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;
#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;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册