syscall.S 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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. #include <features.h>
  23. .text
  24. .align 4
  25. .globl syscall
  26. .type syscall,@function
  27. syscall:
  28. pushl %edi
  29. pushl %esi
  30. pushl %ebx
  31. movl 36(%esp),%edi; /* Load the 5 syscall argument registers */
  32. movl 32(%esp),%esi;
  33. movl 28(%esp),%edx;
  34. movl 24(%esp),%ecx;
  35. movl 20(%esp),%ebx;
  36. movl 16(%esp),%eax /* Load syscall number into %eax. */
  37. #APP
  38. int $0x80
  39. #NO_APP
  40. cmpl $-4095,%eax
  41. jbe .Ldone
  42. #ifdef __PIC__
  43. call Lhere
  44. Lhere:
  45. popl %ebx
  46. addl $_GLOBAL_OFFSET_TABLE_+[.-Lhere],%ebx
  47. negl %eax
  48. movl %eax,%ecx
  49. #ifdef __UCLIBC_HAS_THREADS__
  50. call __errno_location@PLT
  51. #else
  52. movl errno@GOT(%ebx),%eax
  53. #endif /* __UCLIBC_HAS_THREADS__ */
  54. movl %ecx,(%eax)
  55. #else
  56. negl %eax
  57. #ifdef __UCLIBC_HAS_THREADS__
  58. movl %eax,%ecx
  59. call __errno_location
  60. movl %ecx,(%eax)
  61. #else
  62. movl %eax,errno
  63. #endif /* __UCLIBC_HAS_THREADS__ */
  64. #endif /* __PIC__ */
  65. movl $-1,%eax
  66. .p2align 4,,7
  67. .Ldone:
  68. popl %ebx
  69. popl %esi
  70. popl %edi
  71. ret
  72. .Lsize:
  73. .size syscall,.Lsize-syscall