am f5385754: am aea5f00d: Merge "bionic: modify syscall to use 6 registers to pass parameter."

* commit 'f5385754e29dcb093cb9445c40b69e45bd71d685':
  bionic: modify syscall to use 6 registers to pass parameter.
This commit is contained in:
Elliott Hughes 2012-08-03 14:29:45 -07:00 committed by Android Git Automerger
commit c9dbebe344

View File

@ -1,15 +1,13 @@
/* /*
* Generic syscall call. * Generic syscall call.
* Upon entry * Upon entry:
* %eax: system call number * %eax: system call number - caller save
* %ebx: arg0 to system call * %ebx: arg0 to system call - callee save
* %ecx: arg.. * %ecx: arg1 - caller save
* %edx: arg.. * %edx: arg2 - caller save
* %esi: arg.. * %esi: arg3 - callee save
* %edi: arg.. * %edi: arg4 - callee save
* We push these (to save them) load them up with the * %ebp: arg5 - callee save
* values from the calling frame (not all will actually be valid)
* and make the syscall.
*/ */
#include <sys/linux-syscalls.h> #include <sys/linux-syscalls.h>
@ -20,26 +18,37 @@
.align 4 .align 4
syscall: syscall:
# Push the callee save registers.
push %ebx push %ebx
push %esi push %esi
push %edi push %edi
mov 16(%esp),%eax push %ebp
mov 20(%esp),%ebx
mov 24(%esp),%ecx
mov 28(%esp),%edx
mov 32(%esp),%esi
mov 36(%esp),%edi
# 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.
int $0x80 int $0x80
# Error?
cmpl $-4095, %eax cmpl $-4095, %eax
jb 1f jb 1f
# Yes, so set errno.
negl %eax negl %eax
pushl %eax pushl %eax
call __set_errno call __set_errno
addl $4, %esp addl $4, %esp
orl $-1, %eax orl $-1, %eax
1: 1:
# Restore the callee save registers.
pop %ebp
pop %edi pop %edi
pop %esi pop %esi
pop %ebx pop %ebx