diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/env/__init_tls.c | 2 | ||||
-rw-r--r-- | src/env/__libc_start_main.c | 2 | ||||
-rw-r--r-- | src/internal/defsysinfo.c | 3 | ||||
-rw-r--r-- | src/internal/i386/defsysinfo.s | 9 | ||||
-rw-r--r-- | src/internal/i386/syscall.s | 81 | ||||
-rw-r--r-- | src/internal/libc.c | 1 | ||||
-rw-r--r-- | src/thread/pthread_create.c | 1 |
7 files changed, 28 insertions, 71 deletions
diff --git a/src/env/__init_tls.c b/src/env/__init_tls.c index f1874f2a..5f12500c 100644 --- a/src/env/__init_tls.c +++ b/src/env/__init_tls.c @@ -1,3 +1,4 @@ +#define SYSCALL_NO_TLS 1 #include <elf.h> #include <limits.h> #include <sys/mman.h> @@ -21,6 +22,7 @@ int __init_tp(void *p) td->tid = __syscall(SYS_set_tid_address, &__thread_list_lock); td->locale = &libc.global_locale; td->robust_list.head = &td->robust_list.head; + td->sysinfo = __sysinfo; td->next = td->prev = td; return 0; } diff --git a/src/env/__libc_start_main.c b/src/env/__libc_start_main.c index 7c95f822..8fbe5262 100644 --- a/src/env/__libc_start_main.c +++ b/src/env/__libc_start_main.c @@ -28,7 +28,7 @@ void __init_libc(char **envp, char *pn) libc.auxv = auxv = (void *)(envp+i+1); for (i=0; auxv[i]; i+=2) if (auxv[i]<AUX_CNT) aux[auxv[i]] = auxv[i+1]; __hwcap = aux[AT_HWCAP]; - __sysinfo = aux[AT_SYSINFO]; + if (aux[AT_SYSINFO]) __sysinfo = aux[AT_SYSINFO]; libc.page_size = aux[AT_PAGESZ]; if (!pn) pn = (void*)aux[AT_EXECFN]; diff --git a/src/internal/defsysinfo.c b/src/internal/defsysinfo.c new file mode 100644 index 00000000..6d4117db --- /dev/null +++ b/src/internal/defsysinfo.c @@ -0,0 +1,3 @@ +#include "libc.h" + +size_t __sysinfo; diff --git a/src/internal/i386/defsysinfo.s b/src/internal/i386/defsysinfo.s new file mode 100644 index 00000000..f1b5b0f2 --- /dev/null +++ b/src/internal/i386/defsysinfo.s @@ -0,0 +1,9 @@ +1: int $128 + ret + +.data +.align 4 +.hidden __sysinfo +.global __sysinfo +__sysinfo: + .long 1b diff --git a/src/internal/i386/syscall.s b/src/internal/i386/syscall.s index 0ebf2218..004ddfef 100644 --- a/src/internal/i386/syscall.s +++ b/src/internal/i386/syscall.s @@ -1,78 +1,21 @@ -.hidden __sysinfo - -# The calling convention for __vsyscall has the syscall number -# and 5 args arriving as: eax, edx, ecx, edi, esi, 4(%esp). -# This ensures that the inline asm in the C code never has to touch -# ebx or ebp (which are unavailable in PIC and frame-pointer-using -# code, respectively), and optimizes for size/simplicity in the caller. - -.global __vsyscall -.hidden __vsyscall -.type __vsyscall,@function -__vsyscall: - push %edi - push %ebx - mov %edx,%ebx - mov %edi,%edx - mov 12(%esp),%edi - push %eax - call 1f -2: mov %ebx,%edx - pop %ebx - pop %ebx - pop %edi - ret - -1: mov (%esp),%eax - add $[__sysinfo-2b],%eax - mov (%eax),%eax - test %eax,%eax - jz 1f - push %eax - mov 8(%esp),%eax - ret # tail call to kernel vsyscall entry -1: mov 4(%esp),%eax - int $128 - ret - -# The __vsyscall6 entry point is used only for 6-argument syscalls. -# Instead of passing the 5th argument on the stack, a pointer to the -# 5th and 6th arguments is passed. This is ugly, but there are no -# register constraints the inline asm could use that would make it -# possible to pass two arguments on the stack. - -.global __vsyscall6 -.hidden __vsyscall6 -.type __vsyscall6,@function -__vsyscall6: - push %ebp - push %eax - mov 12(%esp), %ebp - mov (%ebp), %eax - mov 4(%ebp), %ebp - push %eax - mov 4(%esp),%eax - call __vsyscall - pop %ebp - pop %ebp - pop %ebp - ret - .global __syscall .hidden __syscall .type __syscall,@function __syscall: - lea 24(%esp),%eax + push %ebx push %esi push %edi - push %eax - mov 16(%esp),%eax - mov 20(%esp),%edx - mov 24(%esp),%ecx - mov 28(%esp),%edi - mov 32(%esp),%esi - call __vsyscall6 - pop %edi + push %ebp + mov 20(%esp),%eax + mov 24(%esp),%ebx + mov 28(%esp),%ecx + mov 32(%esp),%edx + mov 36(%esp),%esi + mov 40(%esp),%edi + mov 44(%esp),%ebp + call *%gs:16 + pop %ebp pop %edi pop %esi + pop %ebx ret diff --git a/src/internal/libc.c b/src/internal/libc.c index 2e10942d..cb051810 100644 --- a/src/internal/libc.c +++ b/src/internal/libc.c @@ -3,7 +3,6 @@ struct __libc __libc; size_t __hwcap; -size_t __sysinfo; char *__progname=0, *__progname_full=0; weak_alias(__progname, program_invocation_short_name); diff --git a/src/thread/pthread_create.c b/src/thread/pthread_create.c index 7d4dc2ed..ebf61ded 100644 --- a/src/thread/pthread_create.c +++ b/src/thread/pthread_create.c @@ -315,6 +315,7 @@ int __pthread_create(pthread_t *restrict res, const pthread_attr_t *restrict att } new->robust_list.head = &new->robust_list.head; new->CANARY = self->CANARY; + new->sysinfo = self->sysinfo; /* Setup argument structure for the new thread on its stack. * It's safe to access from the caller only until the thread |