syscall_arch.h 3.7 KB

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