syscall.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. #ifndef __SYSCALL_H__
  2. #define __SYSCALL_H__
  3. #include "bits/syscall.h"
  4. #include "bits/errno.h"
  5. #define CLOBBERS \
  6. "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13", \
  7. "$14", "$15", "$24", "$25", "hi", "lo", "memory"
  8. static inline long syscall0(long n)
  9. {
  10. register long v0 asm("v0") = n;
  11. register long a3 asm("a3");
  12. asm volatile (
  13. "syscall"
  14. : "=r"(v0), "=r"(a3)
  15. : "0"(v0), "1"(a3)
  16. : CLOBBERS);
  17. return a3 ? -v0 : v0;
  18. }
  19. static inline long syscall1(long n, long a)
  20. {
  21. register long v0 asm("v0") = n;
  22. register long a0 asm("a0") = a;
  23. register long a3 asm("a3");
  24. asm volatile (
  25. "syscall"
  26. : "=r"(v0), "=r"(a3)
  27. : "0"(v0), "1"(a3), "r"(a0)
  28. : CLOBBERS);
  29. return a3 ? -v0 : v0;
  30. }
  31. static inline long syscall2(long n, long a, long b)
  32. {
  33. register long v0 asm("v0") = n;
  34. register long a0 asm("a0") = a;
  35. register long a1 asm("a1") = b;
  36. register long a3 asm("a3");
  37. asm volatile (
  38. "syscall"
  39. : "=r"(v0), "=r"(a3)
  40. : "0"(v0), "1"(a3), "r"(a1), "r"(a0)
  41. : CLOBBERS);
  42. return a3 ? -v0 : v0;
  43. }
  44. static inline long syscall3(long n, long a, long b, long c)
  45. {
  46. register long v0 asm("v0") = n;
  47. register long a0 asm("a0") = a;
  48. register long a1 asm("a1") = b;
  49. register long a2 asm("a2") = c;
  50. register long a3 asm("a3");
  51. asm volatile (
  52. "syscall"
  53. : "=r"(v0), "=r"(a3)
  54. : "0"(v0), "1"(a3), "r"(a2), "r"(a1), "r"(a0)
  55. : CLOBBERS);
  56. return a3 ? -v0 : v0;
  57. }
  58. static inline long syscall4(long n, long a, long b, long c, long d)
  59. {
  60. register long v0 asm("v0") = n;
  61. register long a0 asm("a0") = a;
  62. register long a1 asm("a1") = b;
  63. register long a2 asm("a2") = c;
  64. register long a3 asm("a3") = d;
  65. asm volatile (
  66. "syscall"
  67. : "=r"(v0), "=r"(a3)
  68. : "0"(v0), "1"(a3), "r"(a2), "r"(a1), "r"(a0)
  69. : CLOBBERS);
  70. return a3 ? -v0 : v0;
  71. }
  72. static inline long syscall5(long n, long a, long b, long c, long d, long e)
  73. {
  74. register long v0 asm("v0") = n;
  75. register long a0 asm("a0") = a;
  76. register long a1 asm("a1") = b;
  77. register long a2 asm("a2") = c;
  78. register long a3 asm("a3") = d;
  79. asm volatile (
  80. "addiu $sp,$sp,-24;"
  81. "sw %[e],16($sp);"
  82. "syscall;"
  83. "addiu $sp,$sp,24"
  84. : "=r"(v0), "=r"(a3)
  85. : "0"(v0), "1"(a3), "r"(a2), "r"(a1), "r"(a0), [e] "r"(e)
  86. : CLOBBERS);
  87. return a3 ? -v0 : v0;
  88. }
  89. static inline long syscall6(long n, long a, long b, long c, long d, long e, long f)
  90. {
  91. register long a0 asm("a0") = a;
  92. register long a1 asm("a1") = b;
  93. register long a2 asm("a2") = c;
  94. register long a3 asm("a3") = d;
  95. register long v0 asm("v0") = n;
  96. asm volatile (
  97. "addiu $sp,$sp,-24;"
  98. "sw %[e],16($sp);"
  99. "sw %[f],20($sp);"
  100. "syscall;"
  101. "addiu $sp,$sp,24"
  102. : "=&r"(v0), "=r"(a3)
  103. : "0"(v0), "1"(a3), "r"(a2), "r"(a1), "r"(a0), [e] "r"(e), [f] "r"(f)
  104. : CLOBBERS);
  105. return a3 ? -v0 : v0;
  106. }
  107. #endif