syscall_arch.h 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. #define __SYSCALL_LL_E(x) (x)
  2. #define __SYSCALL_LL_O(x) (x)
  3. #define __scc(X) sizeof(1?(X):0ULL) < 8 ? (unsigned long) (X) : (long long) (X)
  4. typedef long long syscall_arg_t;
  5. struct __timespec { long long tv_sec; long tv_nsec; };
  6. struct __timespec_kernel { long long tv_sec; long long tv_nsec; };
  7. #define __tsc(X) ((struct __timespec*)(unsigned long)(X))
  8. #define __fixup(X) do { if(X) X = (unsigned long) (&(struct __timespec_kernel) \
  9. { .tv_sec = __tsc(X)->tv_sec, .tv_nsec = __tsc(X)->tv_nsec}); } while(0)
  10. #define __fixup_case_2 \
  11. case SYS_nanosleep: \
  12. __fixup(a1); break; \
  13. case SYS_clock_settime: \
  14. __fixup(a2); break;
  15. #define __fixup_case_3 \
  16. case SYS_clock_nanosleep: case SYS_rt_sigtimedwait: case SYS_ppoll: \
  17. __fixup(a3); break; \
  18. case SYS_utimensat: \
  19. if(a3) a3 = (unsigned long) ((struct __timespec_kernel[2]) { \
  20. [0] = {.tv_sec = __tsc(a3)[0].tv_sec, .tv_nsec = __tsc(a3)[0].tv_nsec}, \
  21. [1] = {.tv_sec = __tsc(a3)[1].tv_sec, .tv_nsec = __tsc(a3)[1].tv_nsec}, \
  22. }); break;
  23. #define __fixup_case_4 \
  24. case SYS_futex: \
  25. if((a2 & (~128 /* FUTEX_PRIVATE_FLAG */)) == 0 /* FUTEX_WAIT */) __fixup(a4); break;
  26. #define __fixup_case_5 \
  27. case SYS_mq_timedsend: case SYS_mq_timedreceive: case SYS_pselect6: \
  28. __fixup(a5); break;
  29. static __inline long __syscall0(long long n)
  30. {
  31. unsigned long ret;
  32. __asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n) : "rcx", "r11", "memory");
  33. return ret;
  34. }
  35. static __inline long __syscall1(long long n, long long a1)
  36. {
  37. unsigned long ret;
  38. __asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n), "D"(a1) : "rcx", "r11", "memory");
  39. return ret;
  40. }
  41. static __inline long __syscall2(long long n, long long a1, long long a2)
  42. {
  43. unsigned long ret;
  44. struct __timespec *ts2 = 0;
  45. switch (n) {
  46. __fixup_case_2;
  47. }
  48. __asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2)
  49. : "rcx", "r11", "memory");
  50. return ret;
  51. }
  52. static __inline long __syscall3(long long n, long long a1, long long a2, long long a3)
  53. {
  54. unsigned long ret;
  55. switch (n) {
  56. __fixup_case_2;
  57. __fixup_case_3;
  58. }
  59. __asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2),
  60. "d"(a3) : "rcx", "r11", "memory");
  61. return ret;
  62. }
  63. static __inline long __syscall4(long long n, long long a1, long long a2, long long a3,
  64. long long a4_)
  65. {
  66. unsigned long ret;
  67. register long long a4 __asm__("r10") = a4_;
  68. switch (n) {
  69. __fixup_case_2;
  70. __fixup_case_3;
  71. __fixup_case_4;
  72. }
  73. __asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2),
  74. "d"(a3), "r"(a4): "rcx", "r11", "memory");
  75. return ret;
  76. }
  77. static __inline long __syscall5(long long n, long long a1, long long a2, long long a3,
  78. long long a4_, long long a5_)
  79. {
  80. unsigned long ret;
  81. register long long a4 __asm__("r10") = a4_;
  82. register long long a5 __asm__("r8") = a5_;
  83. switch (n) {
  84. __fixup_case_2;
  85. __fixup_case_3;
  86. __fixup_case_4;
  87. __fixup_case_5;
  88. }
  89. __asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2),
  90. "d"(a3), "r"(a4), "r"(a5) : "rcx", "r11", "memory");
  91. return ret;
  92. }
  93. static __inline long __syscall6(long long n, long long a1, long long a2, long long a3,
  94. long long a4_, long long a5_, long long a6_)
  95. {
  96. unsigned long ret;
  97. register long long a4 __asm__("r10") = a4_;
  98. register long long a5 __asm__("r8") = a5_;
  99. register long long a6 __asm__("r9") = a6_;
  100. switch (n) {
  101. __fixup_case_2;
  102. __fixup_case_3;
  103. __fixup_case_4;
  104. __fixup_case_5;
  105. }
  106. __asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2),
  107. "d"(a3), "r"(a4), "r"(a5), "r"(a6) : "rcx", "r11", "memory");
  108. return ret;
  109. }