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