1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- /*
- * June 27, 2001 Manuel Novoa III
- *
- * This is a heavily modified version of gcc's output for the _syscall5 macro.
- * The idea (originally from dietlibc) is that all syscall functions simply set
- * the syscall number as the first argument, then set the syscall arguments as
- * the next up-to-five arguments, and then jump here. All the common work is
- * done by syscall(), saving a fair amount of generated code when a number of
- * syscalls are used. The (potential) cost is some unnecessary pushes, pops,
- * and movs but the execution time penalty should be relatively small compared
- * to the cost of the syscall itself.
- *
- * July 24, 2002
- *
- * Modified by Erik Andersen to take all function parameters from off the stack
- * like a proper function and eliminates the old 255 syscall number limit. So
- * now we can just call this as a function as syscall() per the function
- * prototype in unistd.h, so to call _exit(42) you can just call.
- * syscall(__NR_exit, 42);
- * and things will just work.
- */
- .text
- .global syscall
- .type syscall,%function
- syscall:
- pushl %ebp
- pushl %edi
- pushl %esi
- pushl %ebx
- movl 44(%esp),%ebp /* Load the 6 syscall argument registers */
- movl 40(%esp),%edi
- movl 36(%esp),%esi
- movl 32(%esp),%edx
- movl 28(%esp),%ecx
- movl 24(%esp),%ebx
- movl 20(%esp),%eax /* Load syscall number into %eax. */
- int $0x80
- popl %ebx
- popl %esi
- popl %edi
- popl %ebp
- cmpl $-4095,%eax
- jae __syscall_error
- ret /* Return to caller. */
- .size syscall,.-syscall
|