syscall_arch.h 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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. "move $2,$7 ; syscall" \
  11. : "=&r"(r2), "=r"(r7) : __VA_ARGS__ \
  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") = n;
  19. __asm_syscall("r"(r7));
  20. }
  21. static inline long __syscall1(long n, long a)
  22. {
  23. register long r7 __asm__("$7") = n;
  24. register long r4 __asm__("$4") = a;
  25. __asm_syscall("r"(r7), "r"(r4));
  26. }
  27. static inline long __syscall2(long n, long a, long b)
  28. {
  29. register long r7 __asm__("$7") = n;
  30. register long r4 __asm__("$4") = a;
  31. register long r5 __asm__("$5") = b;
  32. __asm_syscall("r"(r7), "r"(r4), "r"(r5));
  33. }
  34. static inline long __syscall3(long n, long a, long b, long c)
  35. {
  36. register long r7 __asm__("$7") = n;
  37. register long r4 __asm__("$4") = a;
  38. register long r5 __asm__("$5") = b;
  39. register long r6 __asm__("$6") = c;
  40. __asm_syscall("r"(r7), "r"(r4), "r"(r5), "r"(r6));
  41. }
  42. #else
  43. static inline long __syscall0(long n)
  44. {
  45. return (__syscall)(n);
  46. }
  47. static inline long __syscall1(long n, long a)
  48. {
  49. return (__syscall)(n, a);
  50. }
  51. static inline long __syscall2(long n, long a, long b)
  52. {
  53. return (__syscall)(n, a, b);
  54. }
  55. static inline long __syscall3(long n, long a, long b, long c)
  56. {
  57. return (__syscall)(n, a, b, c);
  58. }
  59. #endif
  60. static inline long __syscall4(long n, long a, long b, long c, long d)
  61. {
  62. return (__syscall)(n, a, b, c, d);
  63. }
  64. static inline long __syscall5(long n, long a, long b, long c, long d, long e)
  65. {
  66. return (__syscall)(n, a, b, c, d, e);
  67. }
  68. static inline long __syscall6(long n, long a, long b, long c, long d, long e, long f)
  69. {
  70. return (__syscall)(n, a, b, c, d, e, f);
  71. }