|  | /* | 
|  | * Generic syscall call. | 
|  | * 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 <private/bionic_asm.h> | 
|  |  | 
|  | ENTRY(syscall) | 
|  | # Push the callee save registers. | 
|  | push    %ebx | 
|  | .cfi_adjust_cfa_offset 4 | 
|  | .cfi_rel_offset ebx, 0 | 
|  | push    %esi | 
|  | .cfi_adjust_cfa_offset 4 | 
|  | .cfi_rel_offset esi, 0 | 
|  | push    %edi | 
|  | .cfi_adjust_cfa_offset 4 | 
|  | .cfi_rel_offset edi, 0 | 
|  | push    %ebp | 
|  | .cfi_adjust_cfa_offset 4 | 
|  | .cfi_rel_offset ebp, 0 | 
|  |  | 
|  | # Get and save the system call entry address. | 
|  | call    __kernel_syscall | 
|  | push    %eax | 
|  | .cfi_adjust_cfa_offset 4 | 
|  | .cfi_rel_offset eax, 0 | 
|  |  | 
|  | # Load all the arguments from the calling frame. | 
|  | # (Not all will be valid, depending on the syscall.) | 
|  | mov     24(%esp),%eax | 
|  | mov     28(%esp),%ebx | 
|  | mov     32(%esp),%ecx | 
|  | mov     36(%esp),%edx | 
|  | mov     40(%esp),%esi | 
|  | mov     44(%esp),%edi | 
|  | mov     48(%esp),%ebp | 
|  |  | 
|  | # Make the system call. | 
|  | call    *(%esp) | 
|  | addl    $4, %esp | 
|  |  | 
|  | # Error? | 
|  | cmpl    $-MAX_ERRNO, %eax | 
|  | jb      1f | 
|  | # Yes, so set errno. | 
|  | negl    %eax | 
|  | pushl   %eax | 
|  | call    __set_errno_internal | 
|  | addl    $4, %esp | 
|  | 1: | 
|  | # Restore the callee save registers. | 
|  | pop    %ebp | 
|  | .cfi_adjust_cfa_offset -4 | 
|  | .cfi_restore ebp | 
|  | pop    %edi | 
|  | .cfi_adjust_cfa_offset -4 | 
|  | .cfi_restore edi | 
|  | pop    %esi | 
|  | .cfi_adjust_cfa_offset -4 | 
|  | .cfi_restore esi | 
|  | pop    %ebx | 
|  | .cfi_adjust_cfa_offset -4 | 
|  | .cfi_restore ebx | 
|  | ret | 
|  | END(syscall) |