be91052932
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>
73 lines
1.7 KiB
ArmAsm
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)
|