libc: implement kernel vdso syscalls for i386
This patch uses __kernel_vsyscall instead of "int 0x80"
as the syscall entry point. AT_SYSINFO points to
an adapter to mask the arch specific difference and gives a
performance boost on i386 architecture.
Change-ID: Ib340c604d02c6c25714a95793737e3cfdc3fc5d7
Signed-off-by: Mingwei Shi <mingwei.shi@intel.com>
diff --git a/libc/arch-x86/bionic/syscall.S b/libc/arch-x86/bionic/syscall.S
index 2a15102..12402ac 100644
--- a/libc/arch-x86/bionic/syscall.S
+++ b/libc/arch-x86/bionic/syscall.S
@@ -27,18 +27,25 @@
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ebp, 0
+ # Get and save the system call entry address.
+ call __kernel_syscall
+ push %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
# Load all the arguments from the calling frame.
# (Not all will be valid, depending on the syscall.)
- 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
+ mov 24(%esp),%eax
+ mov 28(%esp),%ebx
+ mov 32(%esp),%ecx
+ mov 36(%esp),%edx
+ mov 40(%esp),%esi
+ mov 44(%esp),%edi
+ mov 48(%esp),%ebp
# Make the system call.
- int $0x80
+ call *(%esp)
+ addl $4, %esp
# Error?
cmpl $-MAX_ERRNO, %eax