syscall_arch.h 2.2 KB

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