bionic: modify syscall to use 6 registers to pass parameter.

Kernel allows to use 6 registers(exclude eax) to pass parameter.
But in syscall's implementation, it only uses five registers.
It will lead to error when 6 parameters passed.

Change-Id: I92d663194e6334c3847f0c0c257ca3b9dee0edef
Author: Jin Wei <wei.a.jin@intel.com>
Signed-off-by: Xiaokang Qin <xiaokang.qin@intel.com>
Signed-off-by: Beare, Bruce J <bruce.j.beare@intel.com>
Signed-off-by: Jack Ren <jack.ren@intel.com>
Author-tracking-BZ: 30838
This commit is contained in:
Jin Wei 2012-04-12 16:50:42 +08:00 committed by Elliott Hughes
parent 1510795fec
commit c164f2a969

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