syscall_arch.h 2.2 KB

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