diff options
Diffstat (limited to 'src/internal')
-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 |
4 files changed, 24 insertions, 70 deletions
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); |