syscall_arch.h 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. #define __SYSCALL_LL_E(x) (x)
  2. #define __SYSCALL_LL_O(x) (x)
  3. __attribute__((visibility("hidden")))
  4. long (__syscall)(long, ...);
  5. #define SYSCALL_RLIM_INFINITY (-1UL/2)
  6. #include <sys/stat.h>
  7. struct kernel_stat {
  8. unsigned int st_dev;
  9. unsigned int __pad1[3];
  10. unsigned long long st_ino;
  11. unsigned int st_mode;
  12. unsigned int st_nlink;
  13. int st_uid;
  14. int st_gid;
  15. unsigned int st_rdev;
  16. unsigned int __pad2[3];
  17. long long st_size;
  18. unsigned int st_atime_sec;
  19. unsigned int st_atime_nsec;
  20. unsigned int st_mtime_sec;
  21. unsigned int st_mtime_nsec;
  22. unsigned int st_ctime_sec;
  23. unsigned int st_ctime_nsec;
  24. unsigned int st_blksize;
  25. unsigned int __pad3;
  26. unsigned long long st_blocks;
  27. };
  28. static void __stat_fix(struct kernel_stat *kst, struct stat *st)
  29. {
  30. st->st_dev = kst->st_dev;
  31. st->st_ino = kst->st_ino;
  32. st->st_mode = kst->st_mode;
  33. st->st_nlink = kst->st_nlink;
  34. st->st_uid = kst->st_uid;
  35. st->st_gid = kst->st_gid;
  36. st->st_rdev = kst->st_rdev;
  37. st->st_size = kst->st_size;
  38. st->st_atim.tv_sec = kst->st_atime_sec;
  39. st->st_atim.tv_nsec = kst->st_atime_nsec;
  40. st->st_mtim.tv_sec = kst->st_mtime_sec;
  41. st->st_mtim.tv_nsec = kst->st_mtime_nsec;
  42. st->st_ctim.tv_sec = kst->st_ctime_sec;
  43. st->st_ctim.tv_nsec = kst->st_ctime_nsec;
  44. st->st_blksize = kst->st_blksize;
  45. st->st_blocks = kst->st_blocks;
  46. }
  47. #ifndef __clang__
  48. static inline long __syscall0(long n)
  49. {
  50. register long r7 __asm__("$7");
  51. register long r2 __asm__("$2");
  52. __asm__ __volatile__ (
  53. "daddu $2,$0,%2 ; syscall"
  54. : "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7)
  55. : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
  56. "$14", "$15", "$24", "$25", "hi", "lo", "memory");
  57. return r7 ? -r2 : r2;
  58. }
  59. static inline long __syscall1(long n, long a)
  60. {
  61. register long r4 __asm__("$4") = a;
  62. register long r7 __asm__("$7");
  63. register long r2 __asm__("$2");
  64. __asm__ __volatile__ (
  65. "daddu $2,$0,%2 ; syscall"
  66. : "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7),
  67. "r"(r4)
  68. : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
  69. "$14", "$15", "$24", "$25", "hi", "lo", "memory");
  70. return r7 ? -r2 : r2;
  71. }
  72. static inline long __syscall2(long n, long a, long b)
  73. {
  74. struct kernel_stat kst;
  75. long ret;
  76. register long r4 __asm__("$4");
  77. register long r5 __asm__("$5");
  78. register long r7 __asm__("$7");
  79. register long r2 __asm__("$2");
  80. r5 = b;
  81. if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
  82. r5 = (long) &kst;
  83. r4 = a;
  84. __asm__ __volatile__ (
  85. "daddu $2,$0,%2 ; syscall"
  86. : "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7),
  87. "r"(r4), "r"(r5)
  88. : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
  89. "$14", "$15", "$24", "$25", "hi", "lo", "memory");
  90. if (r7) return -r2;
  91. ret = r2;
  92. if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
  93. __stat_fix(&kst, (struct stat *)b);
  94. return ret;
  95. }
  96. static inline long __syscall3(long n, long a, long b, long c)
  97. {
  98. struct kernel_stat kst;
  99. long ret;
  100. register long r4 __asm__("$4");
  101. register long r5 __asm__("$5");
  102. register long r6 __asm__("$6");
  103. register long r7 __asm__("$7");
  104. register long r2 __asm__("$2");
  105. r5 = b;
  106. if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
  107. r5 = (long) &kst;
  108. r4 = a;
  109. r6 = c;
  110. __asm__ __volatile__ (
  111. "daddu $2,$0,%2 ; syscall"
  112. : "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7),
  113. "r"(r4), "r"(r5), "r"(r6)
  114. : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
  115. "$14", "$15", "$24", "$25", "hi", "lo", "memory");
  116. if (r7) return -r2;
  117. ret = r2;
  118. if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
  119. __stat_fix(&kst, (struct stat *)b);
  120. return ret;
  121. }
  122. static inline long __syscall4(long n, long a, long b, long c, long d)
  123. {
  124. struct kernel_stat kst;
  125. long ret;
  126. register long r4 __asm__("$4");
  127. register long r5 __asm__("$5");
  128. register long r6 __asm__("$6");
  129. register long r7 __asm__("$7");
  130. register long r2 __asm__("$2");
  131. r4 = a;
  132. r5 = b;
  133. r6 = c;
  134. r7 = d;
  135. if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
  136. r5 = (long) &kst;
  137. if (n == SYS_newfstatat)
  138. r6 = (long) &kst;
  139. __asm__ __volatile__ (
  140. "daddu $2,$0,%2 ; syscall"
  141. : "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7),
  142. "r"(r4), "r"(r5), "r"(r6)
  143. : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
  144. "$14", "$15", "$24", "$25", "hi", "lo", "memory");
  145. if (r7) return -r2;
  146. ret = r2;
  147. if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
  148. __stat_fix(&kst, (struct stat *)b);
  149. if (n == SYS_newfstatat)
  150. __stat_fix(&kst, (struct stat *)c);
  151. return ret;
  152. }
  153. #else
  154. static inline long __syscall0(long n)
  155. {
  156. return (__syscall)(n);
  157. }
  158. static inline long __syscall1(long n, long a)
  159. {
  160. return (__syscall)(n, a);
  161. }
  162. static inline long __syscall2(long n, long a, long b)
  163. {
  164. long r2;
  165. long old_b = b;
  166. struct kernel_stat kst;
  167. if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
  168. b = (long) &kst;
  169. r2 = (__syscall)(n, a, b);
  170. if (r2 > -4096UL) return r2;
  171. if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
  172. __stat_fix(&kst, (struct stat *)old_b);
  173. return r2;
  174. }
  175. static inline long __syscall3(long n, long a, long b, long c)
  176. {
  177. long r2;
  178. long old_b = b;
  179. struct kernel_stat kst;
  180. if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
  181. b = (long) &kst;
  182. r2 = (__syscall)(n, a, b, c);
  183. if (r2 > -4096UL) return r2;
  184. if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
  185. __stat_fix(&kst, (struct stat *)old_b);
  186. return r2;
  187. }
  188. static inline long __syscall4(long n, long a, long b, long c, long d)
  189. {
  190. long r2;
  191. long old_b = b;
  192. long old_c = c;
  193. struct kernel_stat kst;
  194. if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
  195. b = (long) &kst;
  196. if (n == SYS_newfstatat)
  197. c = (long) &kst;
  198. r2 = (__syscall)(n, a, b, c, d);
  199. if (r2 > -4096UL) return r2;
  200. if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
  201. __stat_fix(&kst, (struct stat *)old_b);
  202. if (n == SYS_newfstatat)
  203. __stat_fix(&kst, (struct stat *)old_c);
  204. return r2;
  205. }
  206. #endif
  207. static inline long __syscall5(long n, long a, long b, long c, long d, long e)
  208. {
  209. long r2;
  210. long old_b = b;
  211. long old_c = c;
  212. struct kernel_stat kst;
  213. if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
  214. b = (long) &kst;
  215. if (n == SYS_newfstatat)
  216. c = (long) &kst;
  217. r2 = (__syscall)(n, a, b, c, d, e);
  218. if (r2 > -4096UL) return r2;
  219. if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
  220. __stat_fix(&kst, (struct stat *)old_b);
  221. if (n == SYS_newfstatat)
  222. __stat_fix(&kst, (struct stat *)old_c);
  223. return r2;
  224. }
  225. static inline long __syscall6(long n, long a, long b, long c, long d, long e, long f)
  226. {
  227. long r2;
  228. long old_b = b;
  229. long old_c = c;
  230. struct kernel_stat kst;
  231. if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
  232. b = (long) &kst;
  233. if (n == SYS_newfstatat)
  234. c = (long) &kst;
  235. r2 = (__syscall)(n, a, b, c, d, e, f);
  236. if (r2 > -4096UL) return r2;
  237. if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
  238. __stat_fix(&kst, (struct stat *)old_b);
  239. if (n == SYS_newfstatat)
  240. __stat_fix(&kst, (struct stat *)old_c);
  241. return r2;
  242. }
  243. #define VDSO_USEFUL
  244. #define VDSO_CGT_SYM "__vdso_clock_gettime"
  245. #define VDSO_CGT_VER "LINUX_2.6"