platform_bionic/libc/arch-x86/bionic/syscall.S
Mingwei Shi be91052932 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>
2016-03-25 14:10:05 -07:00

73 lines
1.7 KiB
ArmAsm

/*
* Generic syscall call.
* Upon entry:
* %eax: system call number - caller save
* %ebx: arg0 to system call - callee save
* %ecx: arg1 - caller save
* %edx: arg2 - caller save
* %esi: arg3 - callee save
* %edi: arg4 - callee save
* %ebp: arg5 - callee save
*/
#include <private/bionic_asm.h>
ENTRY(syscall)
# Push the callee save registers.
push %ebx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ebx, 0
push %esi
.cfi_adjust_cfa_offset 4
.cfi_rel_offset esi, 0
push %edi
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edi, 0
push %ebp
.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 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.
call *(%esp)
addl $4, %esp
# Error?
cmpl $-MAX_ERRNO, %eax
jb 1f
# Yes, so set errno.
negl %eax
pushl %eax
call __set_errno_internal
addl $4, %esp
1:
# Restore the callee save registers.
pop %ebp
.cfi_adjust_cfa_offset -4
.cfi_restore ebp
pop %edi
.cfi_adjust_cfa_offset -4
.cfi_restore edi
pop %esi
.cfi_adjust_cfa_offset -4
.cfi_restore esi
pop %ebx
.cfi_adjust_cfa_offset -4
.cfi_restore ebx
ret
END(syscall)