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 <private/bionic_asm.h>
14
15ENTRY(syscall)
16    # Push the callee save registers.
17    push    %ebx
18    push    %esi
19    push    %edi
20    push    %ebp
21
22    # Load all the arguments from the calling frame.
23    # (Not all will be valid, depending on the syscall.)
24    mov     20(%esp),%eax
25    mov     24(%esp),%ebx
26    mov     28(%esp),%ecx
27    mov     32(%esp),%edx
28    mov     36(%esp),%esi
29    mov     40(%esp),%edi
30    mov     44(%esp),%ebp
31
32    # Make the system call.
33    int     $0x80
34
35    # Error?
36    cmpl    $-MAX_ERRNO, %eax
37    jb      1f
38    # Yes, so set errno.
39    negl    %eax
40    pushl   %eax
41    call    __set_errno_internal
42    addl    $4, %esp
431:
44    # Restore the callee save registers.
45    pop    %ebp
46    pop    %edi
47    pop    %esi
48    pop    %ebx
49    ret
50END(syscall)
51