syscall_arch.h 2.7 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) __SYSCALL_LL_E((x))
  5. /* The extra OR instructions are to work around a hardware bug:
  6. * http://documentation.renesas.com/doc/products/mpumcu/tu/tnsh7456ae.pdf
  7. */
  8. #define __asm_syscall(trapno, ...) do { \
  9. __asm__ __volatile__ ( \
  10. "trapa #31\n" \
  11. "or r0, r0\n" \
  12. "or r0, r0\n" \
  13. "or r0, r0\n" \
  14. "or r0, r0\n" \
  15. "or r0, r0\n" \
  16. : "=r"(r0) : __VA_ARGS__ : "memory"); \
  17. return r0; \
  18. } while (0)
  19. static inline long __syscall0(long n)
  20. {
  21. register long r3 __asm__("r3") = n;
  22. register long r0 __asm__("r0");
  23. __asm_syscall(16, "r"(r3));
  24. }
  25. static inline long __syscall1(long n, long a)
  26. {
  27. register long r3 __asm__("r3") = n;
  28. register long r4 __asm__("r4") = a;
  29. register long r0 __asm__("r0");
  30. __asm_syscall(17, "r"(r3), "r"(r4));
  31. }
  32. static inline long __syscall2(long n, long a, long b)
  33. {
  34. register long r3 __asm__("r3") = n;
  35. register long r4 __asm__("r4") = a;
  36. register long r5 __asm__("r5") = b;
  37. register long r0 __asm__("r0");
  38. __asm_syscall(18, "r"(r3), "r"(r4), "r"(r5));
  39. }
  40. static inline long __syscall3(long n, long a, long b, long c)
  41. {
  42. register long r3 __asm__("r3") = n;
  43. register long r4 __asm__("r4") = a;
  44. register long r5 __asm__("r5") = b;
  45. register long r6 __asm__("r6") = c;
  46. register long r0 __asm__("r0");
  47. __asm_syscall(19, "r"(r3), "r"(r4), "r"(r5), "r"(r6));
  48. }
  49. static inline long __syscall4(long n, long a, long b, long c, long d)
  50. {
  51. register long r3 __asm__("r3") = n;
  52. register long r4 __asm__("r4") = a;
  53. register long r5 __asm__("r5") = b;
  54. register long r6 __asm__("r6") = c;
  55. register long r7 __asm__("r7") = d;
  56. register long r0 __asm__("r0");
  57. __asm_syscall(20, "r"(r3), "r"(r4), "r"(r5), "r"(r6), "r"(r7));
  58. }
  59. static inline long __syscall5(long n, long a, long b, long c, long d, long e)
  60. {
  61. register long r3 __asm__("r3") = n;
  62. register long r4 __asm__("r4") = a;
  63. register long r5 __asm__("r5") = b;
  64. register long r6 __asm__("r6") = c;
  65. register long r7 __asm__("r7") = d;
  66. register long r0 __asm__("r0") = e;
  67. __asm_syscall(21, "r"(r3), "r"(r4), "r"(r5), "r"(r6), "r"(r7), "0"(r0));
  68. }
  69. static inline long __syscall6(long n, long a, long b, long c, long d, long e, long f)
  70. {
  71. register long r3 __asm__("r3") = n;
  72. register long r4 __asm__("r4") = a;
  73. register long r5 __asm__("r5") = b;
  74. register long r6 __asm__("r6") = c;
  75. register long r7 __asm__("r7") = d;
  76. register long r0 __asm__("r0") = e;
  77. register long r1 __asm__("r1") = f;
  78. __asm_syscall(22, "r"(r3), "r"(r4), "r"(r5), "r"(r6), "r"(r7), "0"(r0), "r"(r1));
  79. }