syscalls.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. #ifndef _BITS_SYSCALLS_H
  2. #define _BITS_SYSCALLS_H
  3. #ifndef _SYSCALL_H
  4. # error "Never use <bits/syscalls.h> directly; include <sys/syscall.h> instead."
  5. #endif
  6. #include <sgidefs.h>
  7. #ifndef __ASSEMBLER__
  8. #include <errno.h>
  9. #define SYS_ify(syscall_name) (__NR_##syscall_name)
  10. #define __SYSCALL_CLOBBERS "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13", \
  11. "$14", "$15", "$24", "$25", "memory"
  12. #define _syscall0(type,name) \
  13. type name(void) \
  14. { \
  15. long err; \
  16. long sys_result; \
  17. { \
  18. register unsigned long __v0 asm("$2"); \
  19. register unsigned long __a3 asm("$7"); \
  20. __asm__ volatile ( \
  21. ".set noreorder\n\t" \
  22. "li $2, %2 # " #name "\n\t" \
  23. "syscall\n\t" \
  24. ".set reorder" \
  25. : "=r" (__v0), "=r" (__a3) \
  26. : "i" (SYS_ify(name)) \
  27. : __SYSCALL_CLOBBERS); \
  28. err = __a3; \
  29. sys_result = __v0; \
  30. } \
  31. if (err == 0) \
  32. return (type) sys_result; \
  33. __set_errno(sys_result); \
  34. return (type)-1; \
  35. }
  36. #define _syscall1(type,name,atype,a) \
  37. type name(atype a) \
  38. { \
  39. long err; \
  40. long sys_result; \
  41. { \
  42. register unsigned long __v0 asm("$2"); \
  43. register unsigned long __a0 asm("$4") = (unsigned long) a; \
  44. register unsigned long __a3 asm("$7"); \
  45. __asm__ volatile ( \
  46. ".set noreorder\n\t" \
  47. "li $2, %3\t\t\t# " #name "\n\t" \
  48. "syscall\n\t" \
  49. ".set reorder" \
  50. : "=r" (__v0), "=r" (__a3) \
  51. : "r" (__a0), "i" (SYS_ify(name)) \
  52. : __SYSCALL_CLOBBERS); \
  53. err = __a3; \
  54. sys_result = __v0; \
  55. } \
  56. if (err == 0) \
  57. return (type) sys_result; \
  58. __set_errno(sys_result); \
  59. return (type)-1; \
  60. }
  61. #define _syscall2(type,name,atype,a,btype,b) \
  62. type name(atype a,btype b) \
  63. { \
  64. long err; \
  65. long sys_result; \
  66. { \
  67. register unsigned long __v0 asm("$2"); \
  68. register unsigned long __a0 asm("$4") = (unsigned long) a; \
  69. register unsigned long __a1 asm("$5") = (unsigned long) b; \
  70. register unsigned long __a3 asm("$7"); \
  71. __asm__ volatile ( \
  72. ".set noreorder\n\t" \
  73. "li $2, %4\t\t\t# " #name "\n\t" \
  74. "syscall\n\t" \
  75. ".set reorder" \
  76. : "=r" (__v0), "=r" (__a3) \
  77. : "r" (__a0), "r" (__a1), "i" (SYS_ify(name)) \
  78. : __SYSCALL_CLOBBERS); \
  79. err = __a3; \
  80. sys_result = __v0; \
  81. } \
  82. if (err == 0) \
  83. return (type) sys_result; \
  84. __set_errno(sys_result); \
  85. return (type)-1; \
  86. }
  87. #define _syscall3(type,name,atype,a,btype,b,ctype,c) \
  88. type name (atype a, btype b, ctype c) \
  89. { \
  90. long err; \
  91. long sys_result; \
  92. { \
  93. register unsigned long __v0 asm("$2"); \
  94. register unsigned long __a0 asm("$4") = (unsigned long) a; \
  95. register unsigned long __a1 asm("$5") = (unsigned long) b; \
  96. register unsigned long __a2 asm("$6") = (unsigned long) c; \
  97. register unsigned long __a3 asm("$7"); \
  98. __asm__ volatile ( \
  99. ".set noreorder\n\t" \
  100. "li $2, %5\t\t\t# " #name "\n\t" \
  101. "syscall\n\t" \
  102. ".set reorder" \
  103. : "=r" (__v0), "=r" (__a3) \
  104. : "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name)) \
  105. : __SYSCALL_CLOBBERS); \
  106. err = __a3; \
  107. sys_result = __v0; \
  108. } \
  109. if (err == 0) \
  110. return (type) sys_result; \
  111. __set_errno(sys_result); \
  112. return (type)-1; \
  113. }
  114. #define _syscall4(type,name,atype,a,btype,b,ctype,c,dtype,d) \
  115. type name (atype a, btype b, ctype c, dtype d) \
  116. { \
  117. long err; \
  118. long sys_result; \
  119. { \
  120. register unsigned long __v0 asm("$2"); \
  121. register unsigned long __a0 asm("$4") = (unsigned long) a; \
  122. register unsigned long __a1 asm("$5") = (unsigned long) b; \
  123. register unsigned long __a2 asm("$6") = (unsigned long) c; \
  124. register unsigned long __a3 asm("$7") = (unsigned long) d; \
  125. __asm__ volatile ( \
  126. ".set noreorder\n\t" \
  127. "li $2, %5\t\t\t# " #name "\n\t" \
  128. "syscall\n\t" \
  129. ".set reorder" \
  130. : "=r" (__v0), "+r" (__a3) \
  131. : "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name)) \
  132. : __SYSCALL_CLOBBERS); \
  133. err = __a3; \
  134. sys_result = __v0; \
  135. } \
  136. if (err == 0) \
  137. return (type) sys_result; \
  138. __set_errno(sys_result); \
  139. return (type)-1; \
  140. }
  141. #if _MIPS_SIM == _MIPS_SIM_ABI32
  142. #define _syscall5(type,name,atype,a,btype,b,ctype,c,dtype,d,etype,e) \
  143. type name (atype a,btype b,ctype c,dtype d,etype e) \
  144. { \
  145. long err; \
  146. long sys_result; \
  147. const unsigned long *constE = (void*)(unsigned long) e; \
  148. { \
  149. register unsigned long __v0 asm("$2"); \
  150. register unsigned long __a0 asm("$4") = (unsigned long) a; \
  151. register unsigned long __a1 asm("$5") = (unsigned long) b; \
  152. register unsigned long __a2 asm("$6") = (unsigned long) c; \
  153. register unsigned long __a3 asm("$7") = (unsigned long) d; \
  154. __asm__ volatile ( \
  155. ".set noreorder\n\t" \
  156. "lw $2, %6\n\t" \
  157. "subu $29, 32\n\t" \
  158. "sw $2, 16($29)\n\t" \
  159. "li $2, %5\t\t\t# " #name "\n\t" \
  160. "syscall\n\t" \
  161. "addiu $29, 32\n\t" \
  162. ".set reorder" \
  163. : "=r" (__v0), "+r" (__a3) \
  164. : "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name)), \
  165. "m" (constE) \
  166. : __SYSCALL_CLOBBERS); \
  167. err = __a3; \
  168. sys_result = __v0; \
  169. } \
  170. if (err == 0) \
  171. return (type) sys_result; \
  172. __set_errno(sys_result); \
  173. return (type)-1; \
  174. }
  175. #define _syscall6(type,name,atype,a,btype,b,ctype,c,dtype,d,etype,e,ftype,f) \
  176. type name (atype a,btype b,ctype c,dtype d,etype e,ftype f) \
  177. { \
  178. long err; \
  179. long sys_result; \
  180. const unsigned long *constE = (void*)(unsigned long) e; \
  181. const unsigned long *constF = (void*)(unsigned long) f; \
  182. { \
  183. register unsigned long __v0 asm("$2"); \
  184. register unsigned long __a0 asm("$4") = (unsigned long) a; \
  185. register unsigned long __a1 asm("$5") = (unsigned long) b; \
  186. register unsigned long __a2 asm("$6") = (unsigned long) c; \
  187. register unsigned long __a3 asm("$7") = (unsigned long) d; \
  188. __asm__ volatile ( \
  189. ".set noreorder\n\t" \
  190. "lw $2, %6\n\t" \
  191. "lw $8, %7\n\t" \
  192. "subu $29, 32\n\t" \
  193. "sw $2, 16($29)\n\t" \
  194. "sw $8, 20($29)\n\t" \
  195. "li $2, %5\t\t\t# " #name "\n\t" \
  196. "syscall\n\t" \
  197. "addiu $29, 32\n\t" \
  198. ".set reorder" \
  199. : "=r" (__v0), "+r" (__a3) \
  200. : "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name)), \
  201. "m" (constE), "m" (constF) \
  202. : __SYSCALL_CLOBBERS); \
  203. err = __a3; \
  204. sys_result = __v0; \
  205. } \
  206. if (err == 0) \
  207. return (type) sys_result; \
  208. __set_errno(sys_result); \
  209. return (type)-1; \
  210. }
  211. #define _syscall7(type,name,atype,a,btype,b,ctype,c,dtype,d,etype,e,ftype,f,gtype,g) \
  212. type name (atype a,btype b,ctype c,dtype d,etype e,ftype f,gtype g) \
  213. { \
  214. long err; \
  215. long sys_result; \
  216. const unsigned long *constE = (void*)(unsigned long) e; \
  217. const unsigned long *constF = (void*)(unsigned long) f; \
  218. const unsigned long *constG = (void*)(unsigned long) g; \
  219. { \
  220. register unsigned long __v0 asm("$2"); \
  221. register unsigned long __a0 asm("$4") = (unsigned long) a; \
  222. register unsigned long __a1 asm("$5") = (unsigned long) b; \
  223. register unsigned long __a2 asm("$6") = (unsigned long) c; \
  224. register unsigned long __a3 asm("$7") = (unsigned long) d; \
  225. __asm__ volatile ( \
  226. ".set noreorder\n\t" \
  227. "lw $2, %6\n\t" \
  228. "lw $8, %7\n\t" \
  229. "lw $9, %8\n\t" \
  230. "subu $29, 32\n\t" \
  231. "sw $2, 16($29)\n\t" \
  232. "sw $8, 20($29)\n\t" \
  233. "sw $9, 24($29)\n\t" \
  234. "li $2, %5\t\t\t# " #name "\n\t" \
  235. "syscall\n\t" \
  236. "addiu $29, 32\n\t" \
  237. ".set reorder" \
  238. : "=r" (__v0), "+r" (__a3) \
  239. : "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name)), \
  240. "m" (constE), "m" (constF), "m" (constG) \
  241. : __SYSCALL_CLOBBERS); \
  242. err = __a3; \
  243. sys_result = __v0; \
  244. } \
  245. if (err == 0) \
  246. return (type) sys_result; \
  247. __set_errno(sys_result); \
  248. return (type)-1; \
  249. }
  250. #else /* N32 || N64 */
  251. #define _syscall5(type,name,atype,a,btype,b,ctype,c,dtype,d,etype,e) \
  252. type name (atype a,btype b,ctype c,dtype d,etype e) \
  253. { \
  254. long err; \
  255. long sys_result; \
  256. { \
  257. register unsigned long __v0 asm("$2"); \
  258. register unsigned long __a0 asm("$4") = (unsigned long) a; \
  259. register unsigned long __a1 asm("$5") = (unsigned long) b; \
  260. register unsigned long __a2 asm("$6") = (unsigned long) c; \
  261. register unsigned long __a3 asm("$7") = (unsigned long) d; \
  262. register unsigned long __a4 asm("$8") = (unsigned long) e; \
  263. __asm__ volatile ( \
  264. ".set noreorder\n\t" \
  265. "li $2, %6\t\t\t# " #name "\n\t" \
  266. "syscall\n\t" \
  267. ".set reorder" \
  268. : "=r" (__v0), "+r" (__a3) \
  269. : "r" (__a0), "r" (__a1), "r" (__a2), "r" (__a4), "i" (SYS_ify(name)) \
  270. : "$1", "$3", "$9", "$10", "$11", "$12", "$13", \
  271. "$14", "$15", "$24", "$25", "memory"); \
  272. err = __a3; \
  273. sys_result = __v0; \
  274. } \
  275. if (err == 0) \
  276. return (type) sys_result; \
  277. __set_errno(sys_result); \
  278. return (type)-1; \
  279. }
  280. #define _syscall6(type,name,atype,a,btype,b,ctype,c,dtype,d,etype,e,ftype,f) \
  281. type name (atype a,btype b,ctype c,dtype d,etype e,ftype f) \
  282. { \
  283. long err; \
  284. long sys_result; \
  285. { \
  286. register unsigned long __v0 asm("$2"); \
  287. register unsigned long __a0 asm("$4") = (unsigned long) a; \
  288. register unsigned long __a1 asm("$5") = (unsigned long) b; \
  289. register unsigned long __a2 asm("$6") = (unsigned long) c; \
  290. register unsigned long __a3 asm("$7") = (unsigned long) d; \
  291. register unsigned long __a4 asm("$8") = (unsigned long) e; \
  292. register unsigned long __a5 asm("$9") = (unsigned long) f; \
  293. __asm__ volatile ( \
  294. ".set noreorder\n\t" \
  295. "li $2, %7\t\t\t# " #name "\n\t" \
  296. "syscall\n\t" \
  297. ".set reorder" \
  298. : "=r" (__v0), "+r" (__a3) \
  299. : "r" (__a0), "r" (__a1), "r" (__a2), "r" (__a4), "r" (__a5), "i" (SYS_ify(name)) \
  300. : "$1", "$3", "$10", "$11", "$12", "$13", \
  301. "$14", "$15", "$24", "$25", "memory"); \
  302. err = __a3; \
  303. sys_result = __v0; \
  304. } \
  305. if (err == 0) \
  306. return (type) sys_result; \
  307. __set_errno(sys_result); \
  308. return (type)-1; \
  309. }
  310. #define _syscall7(type,name,atype,a,btype,b,ctype,c,dtype,d,etype,e,ftype,f,gtype,g) \
  311. type name (atype a,btype b,ctype c,dtype d,etype e,ftype f,gtype g) \
  312. { \
  313. long err; \
  314. long sys_result; \
  315. { \
  316. register unsigned long __v0 asm("$2"); \
  317. register unsigned long __a0 asm("$4") = (unsigned long) a; \
  318. register unsigned long __a1 asm("$5") = (unsigned long) b; \
  319. register unsigned long __a2 asm("$6") = (unsigned long) c; \
  320. register unsigned long __a3 asm("$7") = (unsigned long) d; \
  321. register unsigned long __a4 asm("$8") = (unsigned long) e; \
  322. register unsigned long __a5 asm("$9") = (unsigned long) f; \
  323. register unsigned long __a6 asm("$10") = (unsigned long) g; \
  324. __asm__ volatile ( \
  325. ".set noreorder\n\t" \
  326. "li $2, %8\t\t\t# " #name "\n\t" \
  327. "syscall\n\t" \
  328. ".set reorder" \
  329. : "=r" (__v0), "+r" (__a3) \
  330. : "r" (__a0), "r" (__a1), "r" (__a2), "r" (__a4), "r" (__a5), "r" (__a6), "i" (SYS_ify(name)) \
  331. : "$1", "$3", "$11", "$12", "$13", \
  332. "$14", "$15", "$24", "$25", "memory"); \
  333. err = __a3; \
  334. sys_result = __v0; \
  335. } \
  336. if (err == 0) \
  337. return (type) sys_result; \
  338. __set_errno(sys_result); \
  339. return (type)-1; \
  340. }
  341. #endif /* N32 || N64 */
  342. #endif /* __ASSEMBLER__ */
  343. #endif /* _BITS_SYSCALLS_H */