android_bionic/libc/arch-x86/bionic/syscall.S

53 lines
1.1 KiB
ArmAsm
Raw Normal View History

2010-03-04 18:29:38 +00:00
/*
* 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
2010-03-04 18:29:38 +00:00
*/
#include <asm/unistd.h>
#include <machine/asm.h>
2010-03-04 18:29:38 +00:00
ENTRY(syscall)
# Push the callee save registers.
2010-03-04 18:29:38 +00:00
push %ebx
push %esi
push %edi
push %ebp
2010-03-04 18:29:38 +00:00
# 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
# Make the system call.
2010-03-04 18:29:38 +00:00
int $0x80
# Error?
cmpl $-4095, %eax
2010-03-04 18:29:38 +00:00
jb 1f
# Yes, so set errno.
2010-03-04 18:29:38 +00:00
negl %eax
pushl %eax
call __set_errno
addl $4, %esp
orl $-1, %eax
1:
# Restore the callee save registers.
pop %ebp
2010-03-04 18:29:38 +00:00
pop %edi
pop %esi
pop %ebx
ret
END(syscall)