syscall.S 1.5 KB

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