blob: b7814e8f655d8dd0444a70e78928ba0715590864 [file] [log] [blame]
/*
* arch/i386/syscall.S
*
* Common tail-handling code for system calls.
*
* The arguments are on the stack; the system call number in %eax.
*/
#define ARG(n) (4*(n)+24)(%esp)
#define SYSNO ARG(-2)
.text
.align 4
.globl __syscall_common
.type __syscall_common,@function
__syscall_common:
pushl %ebx
pushl %esi
pushl %edi
pushl %ebp
#ifdef _REGPARM
xchgl %ecx,%edx
movl %eax,%ebx
movl SYSNO,%eax
movl ARG(0),%esi
movl ARG(1),%edi
movl ARG(2),%ebp
#else
movl SYSNO,%eax
movl ARG(0),%ebx # Syscall arguments
movl ARG(1),%ecx
movl ARG(2),%edx
movl ARG(3),%esi
movl ARG(4),%edi
movl ARG(5),%ebp
#endif
.globl __syscall_common_tail
__syscall_common_tail:
call *__syscall_entry
cmpl $-4095,%eax
popl %ebp
popl %edi
popl %esi
popl %ebx
popl %edx # Drop system call number
jb 1f
# Error return, must set errno
negl %eax
movl %eax,errno
orl $-1,%eax # Return -1
1:
ret
.size __syscall_common,.-__syscall_common
#ifndef _REGPARM
.globl __syscall_varadic
.type __syscall_varadic,@function
__syscall_varadic = __syscall_common
#endif
.align 4
__syscall_int80:
int $0x80
ret
.type __syscall_int80,@function
.size __syscall_int80,.-__syscall_int80
.data
.align 4
.globl __syscall_entry
__syscall_entry:
.long __syscall_int80
.size __syscall_entry,.-__syscall_entry