syscall_arch.h 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. #define __SYSCALL_LL_E(x) (x)
  2. #define __SYSCALL_LL_O(x) (x)
  3. hidden long (__syscall)(long, ...);
  4. #define SYSCALL_RLIM_INFINITY (-1UL/2)
  5. #if _MIPSEL || __MIPSEL || __MIPSEL__
  6. #define __stat_fix(st) ((st),(void)0)
  7. #else
  8. #include <sys/stat.h>
  9. static inline void __stat_fix(long p)
  10. {
  11. struct stat *st = (struct stat *)p;
  12. st->st_dev >>= 32;
  13. st->st_rdev >>= 32;
  14. }
  15. #endif
  16. static inline long __syscall0(long n)
  17. {
  18. register long r7 __asm__("$7");
  19. register long r2 __asm__("$2");
  20. __asm__ __volatile__ (
  21. "addu $2,$0,%2 ; syscall"
  22. : "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7)
  23. : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
  24. "$14", "$15", "$24", "$25", "hi", "lo", "memory");
  25. return r7 ? -r2 : r2;
  26. }
  27. static inline long __syscall1(long n, long a)
  28. {
  29. register long r4 __asm__("$4") = a;
  30. register long r7 __asm__("$7");
  31. register long r2 __asm__("$2");
  32. __asm__ __volatile__ (
  33. "addu $2,$0,%2 ; syscall"
  34. : "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7),
  35. "r"(r4)
  36. : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
  37. "$14", "$15", "$24", "$25", "hi", "lo", "memory");
  38. return r7 ? -r2 : r2;
  39. }
  40. static inline long __syscall2(long n, long a, long b)
  41. {
  42. register long r4 __asm__("$4") = a;
  43. register long r5 __asm__("$5") = b;
  44. register long r7 __asm__("$7");
  45. register long r2 __asm__("$2");
  46. __asm__ __volatile__ (
  47. "addu $2,$0,%2 ; syscall"
  48. : "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7),
  49. "r"(r4), "r"(r5)
  50. : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
  51. "$14", "$15", "$24", "$25", "hi", "lo", "memory");
  52. if (r7) return -r2;
  53. long ret = r2;
  54. if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat) __stat_fix(b);
  55. return ret;
  56. }
  57. static inline long __syscall3(long n, long a, long b, long c)
  58. {
  59. register long r4 __asm__("$4") = a;
  60. register long r5 __asm__("$5") = b;
  61. register long r6 __asm__("$6") = c;
  62. register long r7 __asm__("$7");
  63. register long r2 __asm__("$2");
  64. __asm__ __volatile__ (
  65. "addu $2,$0,%2 ; syscall"
  66. : "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7),
  67. "r"(r4), "r"(r5), "r"(r6)
  68. : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
  69. "$14", "$15", "$24", "$25", "hi", "lo", "memory");
  70. if (r7) return -r2;
  71. long ret = r2;
  72. if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat) __stat_fix(b);
  73. return ret;
  74. }
  75. static inline long __syscall4(long n, long a, long b, long c, long d)
  76. {
  77. register long r4 __asm__("$4") = a;
  78. register long r5 __asm__("$5") = b;
  79. register long r6 __asm__("$6") = c;
  80. register long r7 __asm__("$7") = d;
  81. register long r2 __asm__("$2");
  82. __asm__ __volatile__ (
  83. "addu $2,$0,%2 ; syscall"
  84. : "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7),
  85. "r"(r4), "r"(r5), "r"(r6)
  86. : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
  87. "$14", "$15", "$24", "$25", "hi", "lo", "memory");
  88. if (r7) return -r2;
  89. long ret = r2;
  90. if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat) __stat_fix(b);
  91. if (n == SYS_newfstatat) __stat_fix(c);
  92. return ret;
  93. }
  94. static inline long __syscall5(long n, long a, long b, long c, long d, long e)
  95. {
  96. long r2 = (__syscall)(n, a, b, c, d, e);
  97. if (r2 > -4096UL) return r2;
  98. if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat) __stat_fix(b);
  99. if (n == SYS_newfstatat) __stat_fix(c);
  100. return r2;
  101. }
  102. static inline long __syscall6(long n, long a, long b, long c, long d, long e, long f)
  103. {
  104. long r2 = (__syscall)(n, a, b, c, d, e, f);
  105. if (r2 > -4096UL) return r2;
  106. if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat) __stat_fix(b);
  107. if (n == SYS_newfstatat) __stat_fix(c);
  108. return r2;
  109. }
  110. #define VDSO_USEFUL
  111. #define VDSO_CGT_SYM "__vdso_clock_gettime"
  112. #define VDSO_CGT_VER "LINUX_2.6"