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