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