Merge "x86 syscall system call implementation"
This commit is contained in:
commit
ede2e75f49
2 changed files with 53 additions and 0 deletions
|
@ -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 \
|
||||
|
|
52
libc/arch-x86/bionic/syscall.S
Normal file
52
libc/arch-x86/bionic/syscall.S
Normal 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
|
Loading…
Reference in a new issue