1/*
2 * Generic syscall call.
3 * Upon entry:
4 *	%eax: system call number  - caller save
5 *	%ebx: arg0 to system call -   callee save
6 *	%ecx: arg1                - caller save
7 *	%edx: arg2                - caller save
8 *	%esi: arg3                -   callee save
9 *	%edi: arg4                -   callee save
10 *	%ebp: arg5                -   callee save
11 */
12
13#include <sys/linux-syscalls.h>
14
15    .text
16    .type syscall, @function
17    .globl syscall
18    .align 4
19
20syscall:
21    # Push the callee save registers.
22    push    %ebx
23    push    %esi
24    push    %edi
25    push    %ebp
26
27    # Load all the arguments from the calling frame.
28    # (Not all will be valid, depending on the syscall.)
29    mov     20(%esp),%eax
30    mov     24(%esp),%ebx
31    mov     28(%esp),%ecx
32    mov     32(%esp),%edx
33    mov     36(%esp),%esi
34    mov     40(%esp),%edi
35    mov     44(%esp),%ebp
36
37    # Make the system call.
38    int     $0x80
39
40    # Error?
41    cmpl    $-4095, %eax
42    jb      1f
43    # Yes, so set errno.
44    negl    %eax
45    pushl   %eax
46    call    __set_errno
47    addl    $4, %esp
48    orl     $-1, %eax
491:
50    # Restore the callee save registers.
51    pop    %ebp
52    pop    %edi
53    pop    %esi
54    pop    %ebx
55    ret
56