Merge "x86 syscall system call implementation"

This commit is contained in:
David Turner 2010-03-17 14:07:27 -07:00 committed by Android Code Review
commit ede2e75f49
2 changed files with 53 additions and 0 deletions

View file

@ -329,6 +329,7 @@ libc_common_src_files += \
arch-x86/bionic/setjmp.S \
arch-x86/bionic/_setjmp.S \
arch-x86/bionic/vfork.S \
arch-x86/bionic/syscall.S \
arch-x86/string/bzero.S \
arch-x86/string/memset.S \
arch-x86/string/memcmp.S \

View file

@ -0,0 +1,52 @@
/*
* Generic syscall call.
* Upon entry
* %eax: system call number
* %ebx: arg0 to system call
* %ecx: arg..
* %edx: arg..
* %esi: arg..
* %edi: arg..
* We push these (to save them) load them up with the
* values from the calling frame (not all will actually be valid)
* and make the syscall.
*/
#include <sys/linux-syscalls.h>
.text
.type syscall, @function
.globl syscall
.align 4
syscall:
push %eax
push %ebx
push %ecx
push %edx
push %esi
push %edi
mov 28(%esp),%eax
mov 32(%esp),%ebx
mov 36(%esp),%ecx
mov 40(%esp),%edx
mov 44(%esp),%esi
mov 48(%esp),%edi
int $0x80
cmpl $-129, %eax
jb 1f
negl %eax
pushl %eax
call __set_errno
addl $4, %esp
orl $-1, %eax
1:
pop %edi
pop %esi
pop %edx
pop %ecx
pop %ebx
pop %eax
ret