syscall_arch.h 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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. long (__syscall)(long, ...);
  6. #define SYSCALL_RLIM_INFINITY (-1UL/2)
  7. #ifndef __clang__
  8. #define __asm_syscall(...) do { \
  9. register long r2 __asm__("$2"); \
  10. __asm__ __volatile__ ( \
  11. "addu $2,$0,%2 ; syscall" \
  12. : "=&r"(r2), "=r"(r7) : "ir"(n), __VA_ARGS__, "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. } while (0)
  17. static inline long __syscall0(long n)
  18. {
  19. register long r7 __asm__("$7");
  20. __asm_syscall("i"(0));
  21. }
  22. static inline long __syscall1(long n, long a)
  23. {
  24. register long r4 __asm__("$4") = a;
  25. register long r7 __asm__("$7");
  26. __asm_syscall("r"(r4));
  27. }
  28. static inline long __syscall2(long n, long a, long b)
  29. {
  30. register long r4 __asm__("$4") = a;
  31. register long r5 __asm__("$5") = b;
  32. register long r7 __asm__("$7");
  33. __asm_syscall("r"(r4), "r"(r5));
  34. }
  35. static inline long __syscall3(long n, long a, long b, long c)
  36. {
  37. register long r4 __asm__("$4") = a;
  38. register long r5 __asm__("$5") = b;
  39. register long r6 __asm__("$6") = c;
  40. register long r7 __asm__("$7");
  41. __asm_syscall("r"(r4), "r"(r5), "r"(r6));
  42. }
  43. static inline long __syscall4(long n, long a, long b, long c, long d)
  44. {
  45. register long r4 __asm__("$4") = a;
  46. register long r5 __asm__("$5") = b;
  47. register long r6 __asm__("$6") = c;
  48. register long r7 __asm__("$7") = d;
  49. __asm_syscall("r"(r4), "r"(r5), "r"(r6));
  50. }
  51. #else
  52. static inline long __syscall0(long n)
  53. {
  54. return (__syscall)(n);
  55. }
  56. static inline long __syscall1(long n, long a)
  57. {
  58. return (__syscall)(n, a);
  59. }
  60. static inline long __syscall2(long n, long a, long b)
  61. {
  62. return (__syscall)(n, a, b);
  63. }
  64. static inline long __syscall3(long n, long a, long b, long c)
  65. {
  66. return (__syscall)(n, a, b, c);
  67. }
  68. static inline long __syscall4(long n, long a, long b, long c, long d)
  69. {
  70. return (__syscall)(n, a, b, c, d);
  71. }
  72. #endif
  73. static inline long __syscall5(long n, long a, long b, long c, long d, long e)
  74. {
  75. return (__syscall)(n, a, b, c, d, e);
  76. }
  77. static inline long __syscall6(long n, long a, long b, long c, long d, long e, long f)
  78. {
  79. return (__syscall)(n, a, b, c, d, e, f);
  80. }