finish unifying thread register handling in preparation for porting
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
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;
|
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 *);
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -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
|
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user