From c164f2a9694fa8c373ec72d237ee16b412aa5c53 Mon Sep 17 00:00:00 2001 From: Jin Wei Date: Thu, 12 Apr 2012 16:50:42 +0800 Subject: [PATCH] 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 Signed-off-by: Xiaokang Qin Signed-off-by: Beare, Bruce J Signed-off-by: Jack Ren Author-tracking-BZ: 30838 --- libc/arch-x86/bionic/syscall.S | 41 +++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/libc/arch-x86/bionic/syscall.S b/libc/arch-x86/bionic/syscall.S index 8370f0be0..49d6f8de8 100644 --- a/libc/arch-x86/bionic/syscall.S +++ b/libc/arch-x86/bionic/syscall.S @@ -1,15 +1,13 @@ /* * 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. + * 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 */ #include @@ -20,26 +18,37 @@ .align 4 syscall: + # Push the callee save registers. push %ebx push %esi push %edi - mov 16(%esp),%eax - mov 20(%esp),%ebx - mov 24(%esp),%ecx - mov 28(%esp),%edx - mov 32(%esp),%esi - mov 36(%esp),%edi + push %ebp + # 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 + # Error? cmpl $-4095, %eax jb 1f + # Yes, so set errno. negl %eax pushl %eax call __set_errno addl $4, %esp orl $-1, %eax 1: + # Restore the callee save registers. + pop %ebp pop %edi pop %esi pop %ebx