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
--- /dev/null
+static inline struct pthread *__pthread_self()
+{
+ struct pthread *self;
+ __asm__ ("movl %%gs:0,%0" : "=r" (self) );
+ return self;
+}
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
--- /dev/null
+.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
#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;