syscalls.h 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676
  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. #undef _syscall0
  11. #define _syscall0(type,name) \
  12. type name(void) \
  13. { \
  14. return (type) (INLINE_SYSCALL(name, 0)); \
  15. }
  16. #undef _syscall1
  17. #define _syscall1(type,name,type1,arg1) \
  18. type name(type1 arg1) \
  19. { \
  20. return (type) (INLINE_SYSCALL(name, 1, arg1)); \
  21. }
  22. #undef _syscall2
  23. #define _syscall2(type,name,type1,arg1,type2,arg2) \
  24. type name(type1 arg1,type2 arg2) \
  25. { \
  26. return (type) (INLINE_SYSCALL(name, 2, arg1, arg2)); \
  27. }
  28. #undef _syscall3
  29. #define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \
  30. type name(type1 arg1,type2 arg2,type3 arg3) \
  31. { \
  32. return (type) (INLINE_SYSCALL(name, 3, arg1, arg2, arg3)); \
  33. }
  34. #undef _syscall4
  35. #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
  36. type name (type1 arg1, type2 arg2, type3 arg3, type4 arg4) \
  37. { \
  38. return (type) (INLINE_SYSCALL(name, 4, arg1, arg2, arg3, arg4)); \
  39. }
  40. #undef _syscall5
  41. #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
  42. type5,arg5) \
  43. type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5) \
  44. { \
  45. return (type) (INLINE_SYSCALL(name, 5, arg1, arg2, arg3, arg4, arg5)); \
  46. }
  47. #undef _syscall6
  48. #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
  49. type5,arg5,type6,arg6) \
  50. type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5, type6 arg6) \
  51. { \
  52. return (type) (INLINE_SYSCALL(name, 6, arg1, arg2, arg3, arg4, arg5, arg6)); \
  53. }
  54. #undef _syscall7
  55. #define _syscall7(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
  56. type5,arg5,type6,arg6,type7,arg7) \
  57. type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5, type6 arg6,type7 arg7) \
  58. { \
  59. return (type) (INLINE_SYSCALL(name, 7, arg1, arg2, arg3, arg4, arg5, arg6, arg7)); \
  60. }
  61. /*
  62. * Import from:
  63. * glibc-ports/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h
  64. * glibc-ports/sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h
  65. * glibc-ports/sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h
  66. */
  67. /* Define a macro which expands into the inline wrapper code for a system
  68. call. */
  69. #undef INLINE_SYSCALL
  70. #define INLINE_SYSCALL(name, nr, args...) \
  71. ({ INTERNAL_SYSCALL_DECL(err); \
  72. long result_var = INTERNAL_SYSCALL (name, err, nr, args); \
  73. if ( INTERNAL_SYSCALL_ERROR_P (result_var, err) ) \
  74. { \
  75. __set_errno (INTERNAL_SYSCALL_ERRNO (result_var, err)); \
  76. result_var = -1L; \
  77. } \
  78. result_var; })
  79. #undef INTERNAL_SYSCALL_DECL
  80. #define INTERNAL_SYSCALL_DECL(err) long err
  81. #undef INTERNAL_SYSCALL_ERROR_P
  82. #define INTERNAL_SYSCALL_ERROR_P(val, err) ((long) (err))
  83. #undef INTERNAL_SYSCALL_ERRNO
  84. #define INTERNAL_SYSCALL_ERRNO(val, err) (val)
  85. #undef INTERNAL_SYSCALL
  86. #define INTERNAL_SYSCALL(name, err, nr, args...) \
  87. internal_syscall##nr (, "li\t$2, %2\t\t\t# " #name "\n\t", \
  88. "i" (SYS_ify (name)), err, args)
  89. #undef INTERNAL_SYSCALL_NCS
  90. #define INTERNAL_SYSCALL_NCS(number, err, nr, args...) \
  91. internal_syscall##nr (= number, , "r" (__v0), err, args)
  92. #if _MIPS_SIM == _ABIO32
  93. #define internal_syscall0(ncs_init, cs_init, input, err, dummy...) \
  94. ({ \
  95. long _sys_result; \
  96. \
  97. { \
  98. register long __v0 asm("$2") ncs_init; \
  99. register long __a3 asm("$7"); \
  100. __asm__ volatile ( \
  101. ".set\tnoreorder\n\t" \
  102. cs_init \
  103. "syscall\n\t" \
  104. ".set reorder" \
  105. : "=r" (__v0), "=r" (__a3) \
  106. : input \
  107. : __SYSCALL_CLOBBERS); \
  108. err = __a3; \
  109. _sys_result = __v0; \
  110. } \
  111. _sys_result; \
  112. })
  113. #define internal_syscall1(ncs_init, cs_init, input, err, arg1) \
  114. ({ \
  115. long _sys_result; \
  116. \
  117. { \
  118. register long __v0 asm("$2") ncs_init; \
  119. register long __a0 asm("$4") = (long) arg1; \
  120. register long __a3 asm("$7"); \
  121. __asm__ volatile ( \
  122. ".set\tnoreorder\n\t" \
  123. cs_init \
  124. "syscall\n\t" \
  125. ".set reorder" \
  126. : "=r" (__v0), "=r" (__a3) \
  127. : input, "r" (__a0) \
  128. : __SYSCALL_CLOBBERS); \
  129. err = __a3; \
  130. _sys_result = __v0; \
  131. } \
  132. _sys_result; \
  133. })
  134. #define internal_syscall2(ncs_init, cs_init, input, err, arg1, arg2) \
  135. ({ \
  136. long _sys_result; \
  137. \
  138. { \
  139. register long __v0 asm("$2") ncs_init; \
  140. register long __a0 asm("$4") = (long) arg1; \
  141. register long __a1 asm("$5") = (long) arg2; \
  142. register long __a3 asm("$7"); \
  143. __asm__ volatile ( \
  144. ".set\tnoreorder\n\t" \
  145. cs_init \
  146. "syscall\n\t" \
  147. ".set\treorder" \
  148. : "=r" (__v0), "=r" (__a3) \
  149. : input, "r" (__a0), "r" (__a1) \
  150. : __SYSCALL_CLOBBERS); \
  151. err = __a3; \
  152. _sys_result = __v0; \
  153. } \
  154. _sys_result; \
  155. })
  156. #define internal_syscall3(ncs_init, cs_init, input, err, arg1, arg2, arg3)\
  157. ({ \
  158. long _sys_result; \
  159. \
  160. { \
  161. register long __v0 asm("$2") ncs_init; \
  162. register long __a0 asm("$4") = (long) arg1; \
  163. register long __a1 asm("$5") = (long) arg2; \
  164. register long __a2 asm("$6") = (long) arg3; \
  165. register long __a3 asm("$7"); \
  166. __asm__ volatile ( \
  167. ".set\tnoreorder\n\t" \
  168. cs_init \
  169. "syscall\n\t" \
  170. ".set\treorder" \
  171. : "=r" (__v0), "=r" (__a3) \
  172. : input, "r" (__a0), "r" (__a1), "r" (__a2) \
  173. : __SYSCALL_CLOBBERS); \
  174. err = __a3; \
  175. _sys_result = __v0; \
  176. } \
  177. _sys_result; \
  178. })
  179. #define internal_syscall4(ncs_init, cs_init, input, err, arg1, arg2, arg3, arg4)\
  180. ({ \
  181. long _sys_result; \
  182. \
  183. { \
  184. register long __v0 asm("$2") ncs_init; \
  185. register long __a0 asm("$4") = (long) arg1; \
  186. register long __a1 asm("$5") = (long) arg2; \
  187. register long __a2 asm("$6") = (long) arg3; \
  188. register long __a3 asm("$7") = (long) arg4; \
  189. __asm__ volatile ( \
  190. ".set\tnoreorder\n\t" \
  191. cs_init \
  192. "syscall\n\t" \
  193. ".set\treorder" \
  194. : "=r" (__v0), "+r" (__a3) \
  195. : input, "r" (__a0), "r" (__a1), "r" (__a2) \
  196. : __SYSCALL_CLOBBERS); \
  197. err = __a3; \
  198. _sys_result = __v0; \
  199. } \
  200. _sys_result; \
  201. })
  202. #ifdef __UCLIBC__
  203. #define FORCE_FRAME_POINTER
  204. #else
  205. /* We need to use a frame pointer for the functions in which we
  206. adjust $sp around the syscall, or debug information and unwind
  207. information will be $sp relative and thus wrong during the syscall. As
  208. of GCC 3.4.3, this is sufficient. */
  209. #define FORCE_FRAME_POINTER alloca (4)
  210. #endif
  211. #define internal_syscall5(ncs_init, cs_init, input, err, arg1, arg2, arg3, arg4, arg5)\
  212. ({ \
  213. long _sys_result; \
  214. \
  215. FORCE_FRAME_POINTER; \
  216. { \
  217. register long __v0 asm("$2") ncs_init; \
  218. register long __a0 asm("$4") = (long) arg1; \
  219. register long __a1 asm("$5") = (long) arg2; \
  220. register long __a2 asm("$6") = (long) arg3; \
  221. register long __a3 asm("$7") = (long) arg4; \
  222. __asm__ volatile ( \
  223. ".set\tnoreorder\n\t" \
  224. "subu\t$29, 32\n\t" \
  225. "sw\t%6, 16($29)\n\t" \
  226. cs_init \
  227. "syscall\n\t" \
  228. "addiu\t$29, 32\n\t" \
  229. ".set\treorder" \
  230. : "=r" (__v0), "+r" (__a3) \
  231. : input, "r" (__a0), "r" (__a1), "r" (__a2), \
  232. "r" ((long)arg5) \
  233. : __SYSCALL_CLOBBERS); \
  234. err = __a3; \
  235. _sys_result = __v0; \
  236. } \
  237. _sys_result; \
  238. })
  239. #define internal_syscall6(ncs_init, cs_init, input, err, arg1, arg2, arg3, arg4, arg5, arg6)\
  240. ({ \
  241. long _sys_result; \
  242. \
  243. FORCE_FRAME_POINTER; \
  244. { \
  245. register long __v0 asm("$2") ncs_init; \
  246. register long __a0 asm("$4") = (long) arg1; \
  247. register long __a1 asm("$5") = (long) arg2; \
  248. register long __a2 asm("$6") = (long) arg3; \
  249. register long __a3 asm("$7") = (long) arg4; \
  250. __asm__ volatile ( \
  251. ".set\tnoreorder\n\t" \
  252. "subu\t$29, 32\n\t" \
  253. "sw\t%6, 16($29)\n\t" \
  254. "sw\t%7, 20($29)\n\t" \
  255. cs_init \
  256. "syscall\n\t" \
  257. "addiu\t$29, 32\n\t" \
  258. ".set\treorder" \
  259. : "=r" (__v0), "+r" (__a3) \
  260. : input, "r" (__a0), "r" (__a1), "r" (__a2), \
  261. "r" ((long)arg5), "r" ((long)arg6) \
  262. : __SYSCALL_CLOBBERS); \
  263. err = __a3; \
  264. _sys_result = __v0; \
  265. } \
  266. _sys_result; \
  267. })
  268. #define internal_syscall7(ncs_init, cs_init, input, err, arg1, arg2, arg3, arg4, arg5, arg6, arg7)\
  269. ({ \
  270. long _sys_result; \
  271. \
  272. FORCE_FRAME_POINTER; \
  273. { \
  274. register long __v0 asm("$2") ncs_init; \
  275. register long __a0 asm("$4") = (long) arg1; \
  276. register long __a1 asm("$5") = (long) arg2; \
  277. register long __a2 asm("$6") = (long) arg3; \
  278. register long __a3 asm("$7") = (long) arg4; \
  279. __asm__ volatile ( \
  280. ".set\tnoreorder\n\t" \
  281. "subu\t$29, 32\n\t" \
  282. "sw\t%6, 16($29)\n\t" \
  283. "sw\t%7, 20($29)\n\t" \
  284. "sw\t%8, 24($29)\n\t" \
  285. cs_init \
  286. "syscall\n\t" \
  287. "addiu\t$29, 32\n\t" \
  288. ".set\treorder" \
  289. : "=r" (__v0), "+r" (__a3) \
  290. : input, "r" (__a0), "r" (__a1), "r" (__a2), \
  291. "r" ((long)arg5), "r" ((long)arg6), "r" ((long)arg7) \
  292. : __SYSCALL_CLOBBERS); \
  293. err = __a3; \
  294. _sys_result = __v0; \
  295. } \
  296. _sys_result; \
  297. })
  298. #define __SYSCALL_CLOBBERS "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13", \
  299. "$14", "$15", "$24", "$25", "memory"
  300. #elif _MIPS_SIM == _ABIN32
  301. #define internal_syscall0(ncs_init, cs_init, input, err, dummy...) \
  302. ({ \
  303. long _sys_result; \
  304. \
  305. { \
  306. register long long __v0 asm("$2") ncs_init; \
  307. register long long __a3 asm("$7"); \
  308. __asm__ volatile ( \
  309. ".set\tnoreorder\n\t" \
  310. cs_init \
  311. "syscall\n\t" \
  312. ".set reorder" \
  313. : "=r" (__v0), "=r" (__a3) \
  314. : input \
  315. : __SYSCALL_CLOBBERS); \
  316. err = __a3; \
  317. _sys_result = __v0; \
  318. } \
  319. _sys_result; \
  320. })
  321. #define internal_syscall1(ncs_init, cs_init, input, err, arg1) \
  322. ({ \
  323. long _sys_result; \
  324. \
  325. { \
  326. register long long __v0 asm("$2") ncs_init; \
  327. register long long __a0 asm("$4") = (long long) arg1; \
  328. register long long __a3 asm("$7"); \
  329. __asm__ volatile ( \
  330. ".set\tnoreorder\n\t" \
  331. cs_init \
  332. "syscall\n\t" \
  333. ".set reorder" \
  334. : "=r" (__v0), "=r" (__a3) \
  335. : input, "r" (__a0) \
  336. : __SYSCALL_CLOBBERS); \
  337. err = __a3; \
  338. _sys_result = __v0; \
  339. } \
  340. _sys_result; \
  341. })
  342. #define internal_syscall2(ncs_init, cs_init, input, err, arg1, arg2) \
  343. ({ \
  344. long _sys_result; \
  345. \
  346. { \
  347. register long long __v0 asm("$2") ncs_init; \
  348. register long long __a0 asm("$4") = (long long) arg1; \
  349. register long long __a1 asm("$5") = (long long) arg2; \
  350. register long long __a3 asm("$7"); \
  351. __asm__ volatile ( \
  352. ".set\tnoreorder\n\t" \
  353. cs_init \
  354. "syscall\n\t" \
  355. ".set\treorder" \
  356. : "=r" (__v0), "=r" (__a3) \
  357. : input, "r" (__a0), "r" (__a1) \
  358. : __SYSCALL_CLOBBERS); \
  359. err = __a3; \
  360. _sys_result = __v0; \
  361. } \
  362. _sys_result; \
  363. })
  364. #define internal_syscall3(ncs_init, cs_init, input, err, arg1, arg2, arg3) \
  365. ({ \
  366. long _sys_result; \
  367. \
  368. { \
  369. register long long __v0 asm("$2") ncs_init; \
  370. register long long __a0 asm("$4") = (long long) arg1; \
  371. register long long __a1 asm("$5") = (long long) arg2; \
  372. register long long __a2 asm("$6") = (long long) arg3; \
  373. register long long __a3 asm("$7"); \
  374. __asm__ volatile ( \
  375. ".set\tnoreorder\n\t" \
  376. cs_init \
  377. "syscall\n\t" \
  378. ".set\treorder" \
  379. : "=r" (__v0), "=r" (__a3) \
  380. : input, "r" (__a0), "r" (__a1), "r" (__a2) \
  381. : __SYSCALL_CLOBBERS); \
  382. err = __a3; \
  383. _sys_result = __v0; \
  384. } \
  385. _sys_result; \
  386. })
  387. #define internal_syscall4(ncs_init, cs_init, input, err, arg1, arg2, arg3, arg4) \
  388. ({ \
  389. long _sys_result; \
  390. \
  391. { \
  392. register long long __v0 asm("$2") ncs_init; \
  393. register long long __a0 asm("$4") = (long long) arg1; \
  394. register long long __a1 asm("$5") = (long long) arg2; \
  395. register long long __a2 asm("$6") = (long long) arg3; \
  396. register long long __a3 asm("$7") = (long long) arg4; \
  397. __asm__ volatile ( \
  398. ".set\tnoreorder\n\t" \
  399. cs_init \
  400. "syscall\n\t" \
  401. ".set\treorder" \
  402. : "=r" (__v0), "+r" (__a3) \
  403. : input, "r" (__a0), "r" (__a1), "r" (__a2) \
  404. : __SYSCALL_CLOBBERS); \
  405. err = __a3; \
  406. _sys_result = __v0; \
  407. } \
  408. _sys_result; \
  409. })
  410. #define internal_syscall5(ncs_init, cs_init, input, err, arg1, arg2, arg3, arg4, arg5) \
  411. ({ \
  412. long _sys_result; \
  413. \
  414. { \
  415. register long long __v0 asm("$2") ncs_init; \
  416. register long long __a0 asm("$4") = (long long) arg1; \
  417. register long long __a1 asm("$5") = (long long) arg2; \
  418. register long long __a2 asm("$6") = (long long) arg3; \
  419. register long long __a3 asm("$7") = (long long) arg4; \
  420. register long long __a4 asm("$8") = (long long) arg5; \
  421. __asm__ volatile ( \
  422. ".set\tnoreorder\n\t" \
  423. cs_init \
  424. "syscall\n\t" \
  425. ".set\treorder" \
  426. : "=r" (__v0), "+r" (__a3) \
  427. : input, "r" (__a0), "r" (__a1), "r" (__a2), "r" (__a4) \
  428. : __SYSCALL_CLOBBERS); \
  429. err = __a3; \
  430. _sys_result = __v0; \
  431. } \
  432. _sys_result; \
  433. })
  434. #define internal_syscall6(ncs_init, cs_init, input, err, arg1, arg2, arg3, arg4, arg5, arg6) \
  435. ({ \
  436. long _sys_result; \
  437. \
  438. { \
  439. register long long __v0 asm("$2") ncs_init; \
  440. register long long __a0 asm("$4") = (long long) arg1; \
  441. register long long __a1 asm("$5") = (long long) arg2; \
  442. register long long __a2 asm("$6") = (long long) arg3; \
  443. register long long __a3 asm("$7") = (long long) arg4; \
  444. register long long __a4 asm("$8") = (long long) arg5; \
  445. register long long __a5 asm("$9") = (long long) arg6; \
  446. __asm__ volatile ( \
  447. ".set\tnoreorder\n\t" \
  448. cs_init \
  449. "syscall\n\t" \
  450. ".set\treorder" \
  451. : "=r" (__v0), "+r" (__a3) \
  452. : input, "r" (__a0), "r" (__a1), "r" (__a2), "r" (__a4), \
  453. "r" (__a5) \
  454. : __SYSCALL_CLOBBERS); \
  455. err = __a3; \
  456. _sys_result = __v0; \
  457. } \
  458. _sys_result; \
  459. })
  460. #define __SYSCALL_CLOBBERS "$1", "$3", "$10", "$11", "$12", "$13", \
  461. "$14", "$15", "$24", "$25", "memory"
  462. #else /* _MIPS_SIM == _ABI64 */
  463. #define internal_syscall0(ncs_init, cs_init, input, err, dummy...) \
  464. ({ \
  465. long _sys_result; \
  466. \
  467. { \
  468. register long __v0 asm("$2") ncs_init; \
  469. register long __a3 asm("$7"); \
  470. __asm__ volatile ( \
  471. ".set\tnoreorder\n\t" \
  472. cs_init \
  473. "syscall\n\t" \
  474. ".set reorder" \
  475. : "=r" (__v0), "=r" (__a3) \
  476. : input \
  477. : __SYSCALL_CLOBBERS); \
  478. err = __a3; \
  479. _sys_result = __v0; \
  480. } \
  481. _sys_result; \
  482. })
  483. #define internal_syscall1(ncs_init, cs_init, input, err, arg1) \
  484. ({ \
  485. long _sys_result; \
  486. \
  487. { \
  488. register long __v0 asm("$2") ncs_init; \
  489. register long __a0 asm("$4") = (long) arg1; \
  490. register long __a3 asm("$7"); \
  491. __asm__ volatile ( \
  492. ".set\tnoreorder\n\t" \
  493. cs_init \
  494. "syscall\n\t" \
  495. ".set reorder" \
  496. : "=r" (__v0), "=r" (__a3) \
  497. : input, "r" (__a0) \
  498. : __SYSCALL_CLOBBERS); \
  499. err = __a3; \
  500. _sys_result = __v0; \
  501. } \
  502. _sys_result; \
  503. })
  504. #define internal_syscall2(ncs_init, cs_init, input, err, arg1, arg2) \
  505. ({ \
  506. long _sys_result; \
  507. \
  508. { \
  509. register long __v0 asm("$2") ncs_init; \
  510. register long __a0 asm("$4") = (long) arg1; \
  511. register long __a1 asm("$5") = (long) arg2; \
  512. register long __a3 asm("$7"); \
  513. __asm__ volatile ( \
  514. ".set\tnoreorder\n\t" \
  515. cs_init \
  516. "syscall\n\t" \
  517. ".set\treorder" \
  518. : "=r" (__v0), "=r" (__a3) \
  519. : input, "r" (__a0), "r" (__a1) \
  520. : __SYSCALL_CLOBBERS); \
  521. err = __a3; \
  522. _sys_result = __v0; \
  523. } \
  524. _sys_result; \
  525. })
  526. #define internal_syscall3(ncs_init, cs_init, input, err, arg1, arg2, arg3) \
  527. ({ \
  528. long _sys_result; \
  529. \
  530. { \
  531. register long __v0 asm("$2") ncs_init; \
  532. register long __a0 asm("$4") = (long) arg1; \
  533. register long __a1 asm("$5") = (long) arg2; \
  534. register long __a2 asm("$6") = (long) arg3; \
  535. register long __a3 asm("$7"); \
  536. __asm__ volatile ( \
  537. ".set\tnoreorder\n\t" \
  538. cs_init \
  539. "syscall\n\t" \
  540. ".set\treorder" \
  541. : "=r" (__v0), "=r" (__a3) \
  542. : input, "r" (__a0), "r" (__a1), "r" (__a2) \
  543. : __SYSCALL_CLOBBERS); \
  544. err = __a3; \
  545. _sys_result = __v0; \
  546. } \
  547. _sys_result; \
  548. })
  549. #define internal_syscall4(ncs_init, cs_init, input, err, arg1, arg2, arg3, arg4) \
  550. ({ \
  551. long _sys_result; \
  552. \
  553. { \
  554. register long __v0 asm("$2") ncs_init; \
  555. register long __a0 asm("$4") = (long) arg1; \
  556. register long __a1 asm("$5") = (long) arg2; \
  557. register long __a2 asm("$6") = (long) arg3; \
  558. register long __a3 asm("$7") = (long) arg4; \
  559. __asm__ volatile ( \
  560. ".set\tnoreorder\n\t" \
  561. cs_init \
  562. "syscall\n\t" \
  563. ".set\treorder" \
  564. : "=r" (__v0), "+r" (__a3) \
  565. : input, "r" (__a0), "r" (__a1), "r" (__a2) \
  566. : __SYSCALL_CLOBBERS); \
  567. err = __a3; \
  568. _sys_result = __v0; \
  569. } \
  570. _sys_result; \
  571. })
  572. #define internal_syscall5(ncs_init, cs_init, input, err, arg1, arg2, arg3, arg4, arg5) \
  573. ({ \
  574. long _sys_result; \
  575. \
  576. { \
  577. register long __v0 asm("$2") ncs_init; \
  578. register long __a0 asm("$4") = (long) arg1; \
  579. register long __a1 asm("$5") = (long) arg2; \
  580. register long __a2 asm("$6") = (long) arg3; \
  581. register long __a3 asm("$7") = (long) arg4; \
  582. register long __a4 asm("$8") = (long) arg5; \
  583. __asm__ volatile ( \
  584. ".set\tnoreorder\n\t" \
  585. cs_init \
  586. "syscall\n\t" \
  587. ".set\treorder" \
  588. : "=r" (__v0), "+r" (__a3) \
  589. : input, "r" (__a0), "r" (__a1), "r" (__a2), "r" (__a4) \
  590. : __SYSCALL_CLOBBERS); \
  591. err = __a3; \
  592. _sys_result = __v0; \
  593. } \
  594. _sys_result; \
  595. })
  596. #define internal_syscall6(ncs_init, cs_init, input, err, arg1, arg2, arg3, arg4, arg5, arg6) \
  597. ({ \
  598. long _sys_result; \
  599. \
  600. { \
  601. register long __v0 asm("$2") ncs_init; \
  602. register long __a0 asm("$4") = (long) arg1; \
  603. register long __a1 asm("$5") = (long) arg2; \
  604. register long __a2 asm("$6") = (long) arg3; \
  605. register long __a3 asm("$7") = (long) arg4; \
  606. register long __a4 asm("$8") = (long) arg5; \
  607. register long __a5 asm("$9") = (long) arg6; \
  608. __asm__ volatile ( \
  609. ".set\tnoreorder\n\t" \
  610. cs_init \
  611. "syscall\n\t" \
  612. ".set\treorder" \
  613. : "=r" (__v0), "+r" (__a3) \
  614. : input, "r" (__a0), "r" (__a1), "r" (__a2), "r" (__a4), \
  615. "r" (__a5) \
  616. : __SYSCALL_CLOBBERS); \
  617. err = __a3; \
  618. _sys_result = __v0; \
  619. } \
  620. _sys_result; \
  621. })
  622. #define __SYSCALL_CLOBBERS "$1", "$3", "$10", "$11", "$12", "$13", \
  623. "$14", "$15", "$24", "$25", "memory"
  624. #endif
  625. #endif /* __ASSEMBLER__ */
  626. #endif /* _BITS_SYSCALLS_H */