syscall_arch.h 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. #define __SYSCALL_LL_E(x) \
  2. ((union { long long ll; long l[2]; }){ .ll = x }).l[0], \
  3. ((union { long long ll; long l[2]; }){ .ll = x }).l[1]
  4. #define __SYSCALL_LL_O(x) 0, __SYSCALL_LL_E((x))
  5. #define SYSCALL_RLIM_INFINITY (-1UL/2)
  6. static inline long __syscall0(long n)
  7. {
  8. register long r7 __asm__("$7");
  9. register long r2 __asm__("$2");
  10. __asm__ __volatile__ (
  11. "addu $2,$0,%2 ; syscall"
  12. : "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7)
  13. : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
  14. "$14", "$15", "$24", "$25", "hi", "lo", "memory");
  15. return r7 ? -r2 : r2;
  16. }
  17. static inline long __syscall1(long n, long a)
  18. {
  19. register long r4 __asm__("$4") = a;
  20. register long r7 __asm__("$7");
  21. register long r2 __asm__("$2");
  22. __asm__ __volatile__ (
  23. "addu $2,$0,%2 ; syscall"
  24. : "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7),
  25. "r"(r4)
  26. : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
  27. "$14", "$15", "$24", "$25", "hi", "lo", "memory");
  28. return r7 ? -r2 : r2;
  29. }
  30. static inline long __syscall2(long n, long a, long b)
  31. {
  32. register long r4 __asm__("$4") = a;
  33. register long r5 __asm__("$5") = b;
  34. register long r7 __asm__("$7");
  35. register long r2 __asm__("$2");
  36. __asm__ __volatile__ (
  37. "addu $2,$0,%2 ; syscall"
  38. : "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7),
  39. "r"(r4), "r"(r5)
  40. : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
  41. "$14", "$15", "$24", "$25", "hi", "lo", "memory");
  42. return r7 ? -r2 : r2;
  43. }
  44. static inline long __syscall3(long n, long a, long b, long c)
  45. {
  46. register long r4 __asm__("$4") = a;
  47. register long r5 __asm__("$5") = b;
  48. register long r6 __asm__("$6") = c;
  49. register long r7 __asm__("$7");
  50. register long r2 __asm__("$2");
  51. __asm__ __volatile__ (
  52. "addu $2,$0,%2 ; syscall"
  53. : "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7),
  54. "r"(r4), "r"(r5), "r"(r6)
  55. : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
  56. "$14", "$15", "$24", "$25", "hi", "lo", "memory");
  57. return r7 ? -r2 : r2;
  58. }
  59. static inline long __syscall4(long n, long a, long b, long c, long d)
  60. {
  61. register long r4 __asm__("$4") = a;
  62. register long r5 __asm__("$5") = b;
  63. register long r6 __asm__("$6") = c;
  64. register long r7 __asm__("$7") = d;
  65. register long r2 __asm__("$2");
  66. __asm__ __volatile__ (
  67. "addu $2,$0,%2 ; syscall"
  68. : "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7),
  69. "r"(r4), "r"(r5), "r"(r6)
  70. : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
  71. "$14", "$15", "$24", "$25", "hi", "lo", "memory");
  72. return r7 ? -r2 : r2;
  73. }
  74. static inline long __syscall5(long n, long a, long b, long c, long d, long e)
  75. {
  76. register long r4 __asm__("$4") = a;
  77. register long r5 __asm__("$5") = b;
  78. register long r6 __asm__("$6") = c;
  79. register long r7 __asm__("$7") = d;
  80. register long r8 __asm__("$8") = e;
  81. register long r2 __asm__("$2");
  82. __asm__ __volatile__ (
  83. "subu $sp,$sp,32 ; sw $8,16($sp) ; "
  84. "addu $2,$0,%3 ; syscall ;"
  85. "addu $sp,$sp,32"
  86. : "=&r"(r2), "=r"(r7), "+r"(r8)
  87. : "ir"(n), "0"(r2), "1"(r7), "r"(r4), "r"(r5), "r"(r6)
  88. : "$1", "$3", "$9", "$10", "$11", "$12", "$13",
  89. "$14", "$15", "$24", "$25", "hi", "lo", "memory");
  90. return r7 ? -r2 : r2;
  91. }
  92. static inline long __syscall6(long n, long a, long b, long c, long d, long e, long f)
  93. {
  94. register long r4 __asm__("$4") = a;
  95. register long r5 __asm__("$5") = b;
  96. register long r6 __asm__("$6") = c;
  97. register long r7 __asm__("$7") = d;
  98. register long r8 __asm__("$8") = e;
  99. register long r9 __asm__("$9") = f;
  100. register long r2 __asm__("$2");
  101. __asm__ __volatile__ (
  102. "subu $sp,$sp,32 ; sw $8,16($sp) ; sw $9,20($sp) ; "
  103. "addu $2,$0,%4 ; syscall ;"
  104. "addu $sp,$sp,32"
  105. : "=&r"(r2), "=r"(r7), "+r"(r8), "+r"(r9)
  106. : "ir"(n), "0"(r2), "1"(r7), "r"(r4), "r"(r5), "r"(r6)
  107. : "$1", "$3", "$10", "$11", "$12", "$13",
  108. "$14", "$15", "$24", "$25", "hi", "lo", "memory");
  109. return r7 ? -r2 : r2;
  110. }
  111. static inline long __syscall7(long n, long a, long b, long c, long d, long e, long f, long g)
  112. {
  113. register long r4 __asm__("$4") = a;
  114. register long r5 __asm__("$5") = b;
  115. register long r6 __asm__("$6") = c;
  116. register long r7 __asm__("$7") = d;
  117. register long r8 __asm__("$8") = e;
  118. register long r9 __asm__("$9") = f;
  119. register long r10 __asm__("$10") = g;
  120. register long r2 __asm__("$2");
  121. __asm__ __volatile__ (
  122. "subu $sp,$sp,32 ; sw $8,16($sp) ; sw $9,20($sp) ; sw $10,24($sp) ; "
  123. "addu $2,$0,%5 ; syscall ;"
  124. "addu $sp,$sp,32"
  125. : "=&r"(r2), "=r"(r7), "+r"(r8), "+r"(r9), "+r"(r10)
  126. : "ir"(n), "0"(r2), "1"(r7), "r"(r4), "r"(r5), "r"(r6)
  127. : "$1", "$3", "$11", "$12", "$13",
  128. "$14", "$15", "$24", "$25", "hi", "lo", "memory");
  129. return r7 ? -r2 : r2;
  130. }
  131. #define VDSO_USEFUL
  132. #define VDSO_CGT_SYM "__vdso_clock_gettime"
  133. #define VDSO_CGT_VER "LINUX_2.6"