libaio-0.3.109-arches.patch 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671
  1. Patch borrowed from OpenEmbedded, available at
  2. recipes/libaio/libaio-0.3.106/00_arches.patch in their source
  3. tree. The patch has been adapted to remove the ARM-related
  4. definitions, since they have been merged in later versions of libaio.
  5. The patch adds various architecture specific definitions (syscall
  6. number and macros) for m68k, MIPS, PA/RISC and Sparc. Amongst these,
  7. Buildroot mostly only cares about MIPS, but it was just easier to take
  8. the whole OpenEmbedded patch.
  9. Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
  10. ---
  11. src/libaio.h | 24 +++++
  12. src/syscall-m68k.h | 78 +++++++++++++++++
  13. src/syscall-mips.h | 223 +++++++++++++++++++++++++++++++++++++++++++++++++++
  14. src/syscall-parisc.h | 146 +++++++++++++++++++++++++++++++++
  15. src/syscall-sparc.h | 130 +++++++++++++++++++++++++++++
  16. src/syscall.h | 8 +
  17. 7 files changed, 725 insertions(+)
  18. Index: libaio-0.3.109/src/libaio.h
  19. ===================================================================
  20. --- libaio-0.3.109.orig/src/libaio.h
  21. +++ libaio-0.3.109/src/libaio.h
  22. @@ -83,6 +83,30 @@
  23. #define PADDEDptr(x, y) x; unsigned y
  24. #define PADDEDul(x, y) unsigned long x; unsigned y
  25. # endif
  26. +#elif defined(__m68k__) /* big endian, 32 bits */
  27. +#define PADDED(x, y) unsigned y; x
  28. +#define PADDEDptr(x, y) unsigned y; x
  29. +#define PADDEDul(x, y) unsigned y; unsigned long x
  30. +#elif defined(__sparc__) /* big endian, 32 bits */
  31. +#define PADDED(x, y) unsigned y; x
  32. +#define PADDEDptr(x, y) unsigned y; x
  33. +#define PADDEDul(x, y) unsigned y; unsigned long x
  34. +#elif defined(__hppa__) /* big endian, 32 bits */
  35. +#define PADDED(x, y) unsigned y; x
  36. +#define PADDEDptr(x, y) unsigned y; x
  37. +#define PADDEDul(x, y) unsigned y; unsigned long x
  38. +#elif defined(__mips__)
  39. +# if defined (__MIPSEB__) /* big endian, 32 bits */
  40. +#define PADDED(x, y) unsigned y; x
  41. +#define PADDEDptr(x, y) unsigned y; x
  42. +#define PADDEDul(x, y) unsigned y; unsigned long x
  43. +# elif defined(__MIPSEL__) /* little endian, 32 bits */
  44. +#define PADDED(x, y) x; unsigned y
  45. +#define PADDEDptr(x, y) x; unsigned y
  46. +#define PADDEDul(x, y) unsigned long x; unsigned y
  47. +# else
  48. +# error "neither mipseb nor mipsel?"
  49. +# endif
  50. #else
  51. #error endian?
  52. #endif
  53. Index: libaio-0.3.109/src/syscall-m68k.h
  54. ===================================================================
  55. --- /dev/null
  56. +++ libaio-0.3.109/src/syscall-m68k.h
  57. @@ -0,0 +1,78 @@
  58. +#define __NR_io_setup 241
  59. +#define __NR_io_destroy 242
  60. +#define __NR_io_getevents 243
  61. +#define __NR_io_submit 244
  62. +#define __NR_io_cancel 245
  63. +
  64. +#define io_syscall1(type,fname,sname,atype,a) \
  65. +type fname(atype a) \
  66. +{ \
  67. +register long __res __asm__ ("%d0") = __NR_##sname; \
  68. +register long __a __asm__ ("%d1") = (long)(a); \
  69. +__asm__ __volatile__ ("trap #0" \
  70. + : "+d" (__res) \
  71. + : "d" (__a) ); \
  72. +return (type) __res; \
  73. +}
  74. +
  75. +#define io_syscall2(type,fname,sname,atype,a,btype,b) \
  76. +type fname(atype a,btype b) \
  77. +{ \
  78. +register long __res __asm__ ("%d0") = __NR_##sname; \
  79. +register long __a __asm__ ("%d1") = (long)(a); \
  80. +register long __b __asm__ ("%d2") = (long)(b); \
  81. +__asm__ __volatile__ ("trap #0" \
  82. + : "+d" (__res) \
  83. + : "d" (__a), "d" (__b) \
  84. + ); \
  85. +return (type) __res; \
  86. +}
  87. +
  88. +#define io_syscall3(type,fname,sname,atype,a,btype,b,ctype,c) \
  89. +type fname(atype a,btype b,ctype c) \
  90. +{ \
  91. +register long __res __asm__ ("%d0") = __NR_##sname; \
  92. +register long __a __asm__ ("%d1") = (long)(a); \
  93. +register long __b __asm__ ("%d2") = (long)(b); \
  94. +register long __c __asm__ ("%d3") = (long)(c); \
  95. +__asm__ __volatile__ ("trap #0" \
  96. + : "+d" (__res) \
  97. + : "d" (__a), "d" (__b), \
  98. + "d" (__c) \
  99. + ); \
  100. +return (type) __res; \
  101. +}
  102. +
  103. +#define io_syscall4(type,fname,sname,atype,a,btype,b,ctype,c,dtype,d) \
  104. +type fname (atype a, btype b, ctype c, dtype d) \
  105. +{ \
  106. +register long __res __asm__ ("%d0") = __NR_##sname; \
  107. +register long __a __asm__ ("%d1") = (long)(a); \
  108. +register long __b __asm__ ("%d2") = (long)(b); \
  109. +register long __c __asm__ ("%d3") = (long)(c); \
  110. +register long __d __asm__ ("%d4") = (long)(d); \
  111. +__asm__ __volatile__ ("trap #0" \
  112. + : "+d" (__res) \
  113. + : "d" (__a), "d" (__b), \
  114. + "d" (__c), "d" (__d) \
  115. + ); \
  116. +return (type) __res; \
  117. +}
  118. +
  119. +#define io_syscall5(type,fname,sname,atype,a,btype,b,ctype,c,dtype,d,etype,e) \
  120. +type fname (atype a,btype b,ctype c,dtype d,etype e) \
  121. +{ \
  122. +register long __res __asm__ ("%d0") = __NR_##sname; \
  123. +register long __a __asm__ ("%d1") = (long)(a); \
  124. +register long __b __asm__ ("%d2") = (long)(b); \
  125. +register long __c __asm__ ("%d3") = (long)(c); \
  126. +register long __d __asm__ ("%d4") = (long)(d); \
  127. +register long __e __asm__ ("%d5") = (long)(e); \
  128. +__asm__ __volatile__ ("trap #0" \
  129. + : "+d" (__res) \
  130. + : "d" (__a), "d" (__b), \
  131. + "d" (__c), "d" (__d), "d" (__e) \
  132. + ); \
  133. +return (type) __res; \
  134. +}
  135. +
  136. Index: libaio-0.3.109/src/syscall-mips.h
  137. ===================================================================
  138. --- /dev/null
  139. +++ libaio-0.3.109/src/syscall-mips.h
  140. @@ -0,0 +1,223 @@
  141. +/*
  142. + * This file is subject to the terms and conditions of the GNU General Public
  143. + * License. See the file "COPYING" in the main directory of this archive
  144. + * for more details.
  145. + *
  146. + * Copyright (C) 1995, 96, 97, 98, 99, 2000 by Ralf Baechle
  147. + * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
  148. + *
  149. + * Changed system calls macros _syscall5 - _syscall7 to push args 5 to 7 onto
  150. + * the stack. Robin Farine for ACN S.A, Copyright (C) 1996 by ACN S.A
  151. + */
  152. +
  153. +#ifndef _MIPS_SIM_ABI32
  154. +#define _MIPS_SIM_ABI32 1
  155. +#define _MIPS_SIM_NABI32 2
  156. +#define _MIPS_SIM_ABI64 3
  157. +#endif
  158. +
  159. +#if _MIPS_SIM == _MIPS_SIM_ABI32
  160. +
  161. +/*
  162. + * Linux o32 style syscalls are in the range from 4000 to 4999.
  163. + */
  164. +#define __NR_Linux 4000
  165. +#define __NR_io_setup (__NR_Linux + 241)
  166. +#define __NR_io_destroy (__NR_Linux + 242)
  167. +#define __NR_io_getevents (__NR_Linux + 243)
  168. +#define __NR_io_submit (__NR_Linux + 244)
  169. +#define __NR_io_cancel (__NR_Linux + 245)
  170. +
  171. +#endif /* _MIPS_SIM == _MIPS_SIM_ABI32 */
  172. +
  173. +#if _MIPS_SIM == _MIPS_SIM_ABI64
  174. +
  175. +/*
  176. + * Linux 64-bit syscalls are in the range from 5000 to 5999.
  177. + */
  178. +#define __NR_Linux 5000
  179. +#define __NR_io_setup (__NR_Linux + 200)
  180. +#define __NR_io_destroy (__NR_Linux + 201)
  181. +#define __NR_io_getevents (__NR_Linux + 202)
  182. +#define __NR_io_submit (__NR_Linux + 203)
  183. +#define __NR_io_cancel (__NR_Linux + 204)
  184. +#endif /* _MIPS_SIM == _MIPS_SIM_ABI64 */
  185. +
  186. +#if _MIPS_SIM == _MIPS_SIM_NABI32
  187. +
  188. +/*
  189. + * Linux N32 syscalls are in the range from 6000 to 6999.
  190. + */
  191. +#define __NR_Linux 6000
  192. +#define __NR_io_setup (__NR_Linux + 200)
  193. +#define __NR_io_destroy (__NR_Linux + 201)
  194. +#define __NR_io_getevents (__NR_Linux + 202)
  195. +#define __NR_io_submit (__NR_Linux + 203)
  196. +#define __NR_io_cancel (__NR_Linux + 204)
  197. +#endif /* _MIPS_SIM == _MIPS_SIM_NABI32 */
  198. +
  199. +#define io_syscall1(type,fname,sname,atype,a) \
  200. +type fname(atype a) \
  201. +{ \
  202. + register unsigned long __a0 asm("$4") = (unsigned long) a; \
  203. + register unsigned long __a3 asm("$7"); \
  204. + unsigned long __v0; \
  205. + \
  206. + __asm__ volatile ( \
  207. + ".set\tnoreorder\n\t" \
  208. + "li\t$2, %3\t\t\t# " #fname "\n\t" \
  209. + "syscall\n\t" \
  210. + "move\t%0, $2\n\t" \
  211. + ".set\treorder" \
  212. + : "=&r" (__v0), "=r" (__a3) \
  213. + : "r" (__a0), "i" (__NR_##sname) \
  214. + : "$2", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", \
  215. + "memory"); \
  216. + \
  217. + if (__a3 == 0) \
  218. + return (type) __v0; \
  219. + return (type) -1; \
  220. +}
  221. +
  222. +#define io_syscall2(type,fname,sname,atype,a,btype,b) \
  223. +type fname(atype a, btype b) \
  224. +{ \
  225. + register unsigned long __a0 asm("$4") = (unsigned long) a; \
  226. + register unsigned long __a1 asm("$5") = (unsigned long) b; \
  227. + register unsigned long __a3 asm("$7"); \
  228. + unsigned long __v0; \
  229. + \
  230. + __asm__ volatile ( \
  231. + ".set\tnoreorder\n\t" \
  232. + "li\t$2, %4\t\t\t# " #fname "\n\t" \
  233. + "syscall\n\t" \
  234. + "move\t%0, $2\n\t" \
  235. + ".set\treorder" \
  236. + : "=&r" (__v0), "=r" (__a3) \
  237. + : "r" (__a0), "r" (__a1), "i" (__NR_##sname) \
  238. + : "$2", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", \
  239. + "memory"); \
  240. + \
  241. + if (__a3 == 0) \
  242. + return (type) __v0; \
  243. + return (type) -1; \
  244. +}
  245. +
  246. +#define io_syscall3(type,fname,sname,atype,a,btype,b,ctype,c) \
  247. +type fname(atype a, btype b, ctype c) \
  248. +{ \
  249. + register unsigned long __a0 asm("$4") = (unsigned long) a; \
  250. + register unsigned long __a1 asm("$5") = (unsigned long) b; \
  251. + register unsigned long __a2 asm("$6") = (unsigned long) c; \
  252. + register unsigned long __a3 asm("$7"); \
  253. + unsigned long __v0; \
  254. + \
  255. + __asm__ volatile ( \
  256. + ".set\tnoreorder\n\t" \
  257. + "li\t$2, %5\t\t\t# " #fname "\n\t" \
  258. + "syscall\n\t" \
  259. + "move\t%0, $2\n\t" \
  260. + ".set\treorder" \
  261. + : "=&r" (__v0), "=r" (__a3) \
  262. + : "r" (__a0), "r" (__a1), "r" (__a2), "i" (__NR_##sname) \
  263. + : "$2", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", \
  264. + "memory"); \
  265. + \
  266. + if (__a3 == 0) \
  267. + return (type) __v0; \
  268. + return (type) -1; \
  269. +}
  270. +
  271. +#define io_syscall4(type,fname,sname,atype,a,btype,b,ctype,c,dtype,d) \
  272. +type fname(atype a, btype b, ctype c, dtype d) \
  273. +{ \
  274. + register unsigned long __a0 asm("$4") = (unsigned long) a; \
  275. + register unsigned long __a1 asm("$5") = (unsigned long) b; \
  276. + register unsigned long __a2 asm("$6") = (unsigned long) c; \
  277. + register unsigned long __a3 asm("$7") = (unsigned long) d; \
  278. + unsigned long __v0; \
  279. + \
  280. + __asm__ volatile ( \
  281. + ".set\tnoreorder\n\t" \
  282. + "li\t$2, %5\t\t\t# " #fname "\n\t" \
  283. + "syscall\n\t" \
  284. + "move\t%0, $2\n\t" \
  285. + ".set\treorder" \
  286. + : "=&r" (__v0), "+r" (__a3) \
  287. + : "r" (__a0), "r" (__a1), "r" (__a2), "i" (__NR_##sname) \
  288. + : "$2", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", \
  289. + "memory"); \
  290. + \
  291. + if (__a3 == 0) \
  292. + return (type) __v0; \
  293. + return (type) -1; \
  294. +}
  295. +
  296. +#if (_MIPS_SIM == _MIPS_SIM_ABI32)
  297. +
  298. +/*
  299. + * Using those means your brain needs more than an oil change ;-)
  300. + */
  301. +
  302. +#define io_syscall5(type,fname,sname,atype,a,btype,b,ctype,c,dtype,d,etype,e) \
  303. +type fname(atype a, btype b, ctype c, dtype d, etype e) \
  304. +{ \
  305. + register unsigned long __a0 asm("$4") = (unsigned long) a; \
  306. + register unsigned long __a1 asm("$5") = (unsigned long) b; \
  307. + register unsigned long __a2 asm("$6") = (unsigned long) c; \
  308. + register unsigned long __a3 asm("$7") = (unsigned long) d; \
  309. + unsigned long __v0; \
  310. + \
  311. + __asm__ volatile ( \
  312. + ".set\tnoreorder\n\t" \
  313. + "lw\t$2, %6\n\t" \
  314. + "subu\t$29, 32\n\t" \
  315. + "sw\t$2, 16($29)\n\t" \
  316. + "li\t$2, %5\t\t\t# " #fname "\n\t" \
  317. + "syscall\n\t" \
  318. + "move\t%0, $2\n\t" \
  319. + "addiu\t$29, 32\n\t" \
  320. + ".set\treorder" \
  321. + : "=&r" (__v0), "+r" (__a3) \
  322. + : "r" (__a0), "r" (__a1), "r" (__a2), "i" (__NR_##sname), \
  323. + "m" ((unsigned long)e) \
  324. + : "$2", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", \
  325. + "memory"); \
  326. + \
  327. + if (__a3 == 0) \
  328. + return (type) __v0; \
  329. + return (type) -1; \
  330. +}
  331. +
  332. +#endif /* (_MIPS_SIM == _MIPS_SIM_ABI32) */
  333. +
  334. +#if (_MIPS_SIM == _MIPS_SIM_NABI32) || (_MIPS_SIM == _MIPS_SIM_ABI64)
  335. +
  336. +#define io_syscall5(type,fname,sname,atype,a,btype,b,ctype,c,dtype,d,etype,e) \
  337. +type fname (atype a,btype b,ctype c,dtype d,etype e) \
  338. +{ \
  339. + register unsigned long __a0 asm("$4") = (unsigned long) a; \
  340. + register unsigned long __a1 asm("$5") = (unsigned long) b; \
  341. + register unsigned long __a2 asm("$6") = (unsigned long) c; \
  342. + register unsigned long __a3 asm("$7") = (unsigned long) d; \
  343. + register unsigned long __a4 asm("$8") = (unsigned long) e; \
  344. + unsigned long __v0; \
  345. + \
  346. + __asm__ volatile ( \
  347. + ".set\tnoreorder\n\t" \
  348. + "li\t$2, %6\t\t\t# " #fname "\n\t" \
  349. + "syscall\n\t" \
  350. + "move\t%0, $2\n\t" \
  351. + ".set\treorder" \
  352. + : "=&r" (__v0), "+r" (__a3) \
  353. + : "r" (__a0), "r" (__a1), "r" (__a2), "r" (__a4), "i" (__NR_##sname) \
  354. + : "$2", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", \
  355. + "memory"); \
  356. + \
  357. + if (__a3 == 0) \
  358. + return (type) __v0; \
  359. + return (type) -1; \
  360. +}
  361. +
  362. +#endif /* (_MIPS_SIM == _MIPS_SIM_NABI32) || (_MIPS_SIM == _MIPS_SIM_ABI64) */
  363. +
  364. Index: libaio-0.3.109/src/syscall-parisc.h
  365. ===================================================================
  366. --- /dev/null
  367. +++ libaio-0.3.109/src/syscall-parisc.h
  368. @@ -0,0 +1,146 @@
  369. +/*
  370. + * Linux system call numbers.
  371. + *
  372. + * Cary Coutant says that we should just use another syscall gateway
  373. + * page to avoid clashing with the HPUX space, and I think he's right:
  374. + * it will would keep a branch out of our syscall entry path, at the
  375. + * very least. If we decide to change it later, we can ``just'' tweak
  376. + * the LINUX_GATEWAY_ADDR define at the bottom and make __NR_Linux be
  377. + * 1024 or something. Oh, and recompile libc. =)
  378. + *
  379. + * 64-bit HPUX binaries get the syscall gateway address passed in a register
  380. + * from the kernel at startup, which seems a sane strategy.
  381. + */
  382. +
  383. +#define __NR_Linux 0
  384. +#define __NR_io_setup (__NR_Linux + 215)
  385. +#define __NR_io_destroy (__NR_Linux + 216)
  386. +#define __NR_io_getevents (__NR_Linux + 217)
  387. +#define __NR_io_submit (__NR_Linux + 218)
  388. +#define __NR_io_cancel (__NR_Linux + 219)
  389. +
  390. +#define SYS_ify(syscall_name) __NR_##syscall_name
  391. +
  392. +/* Assume all syscalls are done from PIC code just to be
  393. + * safe. The worst case scenario is that you lose a register
  394. + * and save/restore r19 across the syscall. */
  395. +#define PIC
  396. +
  397. +/* Definition taken from glibc 2.3.3
  398. + * sysdeps/unix/sysv/linux/hppa/sysdep.h
  399. + */
  400. +
  401. +#ifdef PIC
  402. +/* WARNING: CANNOT BE USED IN A NOP! */
  403. +# define K_STW_ASM_PIC " copy %%r19, %%r4\n"
  404. +# define K_LDW_ASM_PIC " copy %%r4, %%r19\n"
  405. +# define K_USING_GR4 "%r4",
  406. +#else
  407. +# define K_STW_ASM_PIC " \n"
  408. +# define K_LDW_ASM_PIC " \n"
  409. +# define K_USING_GR4
  410. +#endif
  411. +
  412. +/* GCC has to be warned that a syscall may clobber all the ABI
  413. + registers listed as "caller-saves", see page 8, Table 2
  414. + in section 2.2.6 of the PA-RISC RUN-TIME architecture
  415. + document. However! r28 is the result and will conflict with
  416. + the clobber list so it is left out. Also the input arguments
  417. + registers r20 -> r26 will conflict with the list so they
  418. + are treated specially. Although r19 is clobbered by the syscall
  419. + we cannot say this because it would violate ABI, thus we say
  420. + r4 is clobbered and use that register to save/restore r19
  421. + across the syscall. */
  422. +
  423. +#define K_CALL_CLOB_REGS "%r1", "%r2", K_USING_GR4 \
  424. + "%r20", "%r29", "%r31"
  425. +
  426. +#undef K_INLINE_SYSCALL
  427. +#define K_INLINE_SYSCALL(name, nr, args...) ({ \
  428. + long __sys_res; \
  429. + { \
  430. + register unsigned long __res __asm__("r28"); \
  431. + K_LOAD_ARGS_##nr(args) \
  432. + /* FIXME: HACK stw/ldw r19 around syscall */ \
  433. + __asm__ volatile( \
  434. + K_STW_ASM_PIC \
  435. + " ble 0x100(%%sr2, %%r0)\n" \
  436. + " ldi %1, %%r20\n" \
  437. + K_LDW_ASM_PIC \
  438. + : "=r" (__res) \
  439. + : "i" (SYS_ify(name)) K_ASM_ARGS_##nr \
  440. + : "memory", K_CALL_CLOB_REGS K_CLOB_ARGS_##nr \
  441. + ); \
  442. + __sys_res = (long)__res; \
  443. + } \
  444. + __sys_res; \
  445. +})
  446. +
  447. +#define K_LOAD_ARGS_0()
  448. +#define K_LOAD_ARGS_1(r26) \
  449. + register unsigned long __r26 __asm__("r26") = (unsigned long)(r26); \
  450. + K_LOAD_ARGS_0()
  451. +#define K_LOAD_ARGS_2(r26,r25) \
  452. + register unsigned long __r25 __asm__("r25") = (unsigned long)(r25); \
  453. + K_LOAD_ARGS_1(r26)
  454. +#define K_LOAD_ARGS_3(r26,r25,r24) \
  455. + register unsigned long __r24 __asm__("r24") = (unsigned long)(r24); \
  456. + K_LOAD_ARGS_2(r26,r25)
  457. +#define K_LOAD_ARGS_4(r26,r25,r24,r23) \
  458. + register unsigned long __r23 __asm__("r23") = (unsigned long)(r23); \
  459. + K_LOAD_ARGS_3(r26,r25,r24)
  460. +#define K_LOAD_ARGS_5(r26,r25,r24,r23,r22) \
  461. + register unsigned long __r22 __asm__("r22") = (unsigned long)(r22); \
  462. + K_LOAD_ARGS_4(r26,r25,r24,r23)
  463. +#define K_LOAD_ARGS_6(r26,r25,r24,r23,r22,r21) \
  464. + register unsigned long __r21 __asm__("r21") = (unsigned long)(r21); \
  465. + K_LOAD_ARGS_5(r26,r25,r24,r23,r22)
  466. +
  467. +/* Even with zero args we use r20 for the syscall number */
  468. +#define K_ASM_ARGS_0
  469. +#define K_ASM_ARGS_1 K_ASM_ARGS_0, "r" (__r26)
  470. +#define K_ASM_ARGS_2 K_ASM_ARGS_1, "r" (__r25)
  471. +#define K_ASM_ARGS_3 K_ASM_ARGS_2, "r" (__r24)
  472. +#define K_ASM_ARGS_4 K_ASM_ARGS_3, "r" (__r23)
  473. +#define K_ASM_ARGS_5 K_ASM_ARGS_4, "r" (__r22)
  474. +#define K_ASM_ARGS_6 K_ASM_ARGS_5, "r" (__r21)
  475. +
  476. +/* The registers not listed as inputs but clobbered */
  477. +#define K_CLOB_ARGS_6
  478. +#define K_CLOB_ARGS_5 K_CLOB_ARGS_6, "%r21"
  479. +#define K_CLOB_ARGS_4 K_CLOB_ARGS_5, "%r22"
  480. +#define K_CLOB_ARGS_3 K_CLOB_ARGS_4, "%r23"
  481. +#define K_CLOB_ARGS_2 K_CLOB_ARGS_3, "%r24"
  482. +#define K_CLOB_ARGS_1 K_CLOB_ARGS_2, "%r25"
  483. +#define K_CLOB_ARGS_0 K_CLOB_ARGS_1, "%r26"
  484. +
  485. +#define io_syscall1(type,fname,sname,type1,arg1) \
  486. +type fname(type1 arg1) \
  487. +{ \
  488. + return K_INLINE_SYSCALL(sname, 1, arg1); \
  489. +}
  490. +
  491. +#define io_syscall2(type,fname,sname,type1,arg1,type2,arg2) \
  492. +type fname(type1 arg1, type2 arg2) \
  493. +{ \
  494. + return K_INLINE_SYSCALL(sname, 2, arg1, arg2); \
  495. +}
  496. +
  497. +#define io_syscall3(type,fname,sname,type1,arg1,type2,arg2,type3,arg3) \
  498. +type fname(type1 arg1, type2 arg2, type3 arg3) \
  499. +{ \
  500. + return K_INLINE_SYSCALL(sname, 3, arg1, arg2, arg3); \
  501. +}
  502. +
  503. +#define io_syscall4(type,fname,sname,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
  504. +type fname(type1 arg1, type2 arg2, type3 arg3, type4 arg4) \
  505. +{ \
  506. + return K_INLINE_SYSCALL(sname, 4, arg1, arg2, arg3, arg4); \
  507. +}
  508. +
  509. +#define io_syscall5(type,fname,sname,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5) \
  510. +type fname(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) \
  511. +{ \
  512. + return K_INLINE_SYSCALL(sname, 5, arg1, arg2, arg3, arg4, arg5); \
  513. +}
  514. +
  515. Index: libaio-0.3.109/src/syscall-sparc.h
  516. ===================================================================
  517. --- /dev/null
  518. +++ libaio-0.3.109/src/syscall-sparc.h
  519. @@ -0,0 +1,130 @@
  520. +/* $Id: unistd.h,v 1.74 2002/02/08 03:57:18 davem Exp $ */
  521. +
  522. +/*
  523. + * System calls under the Sparc.
  524. + *
  525. + * Don't be scared by the ugly clobbers, it is the only way I can
  526. + * think of right now to force the arguments into fixed registers
  527. + * before the trap into the system call with gcc 'asm' statements.
  528. + *
  529. + * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
  530. + *
  531. + * SunOS compatibility based upon preliminary work which is:
  532. + *
  533. + * Copyright (C) 1995 Adrian M. Rodriguez (adrian@remus.rutgers.edu)
  534. + */
  535. +
  536. +
  537. +#define __NR_io_setup 268
  538. +#define __NR_io_destroy 269
  539. +#define __NR_io_submit 270
  540. +#define __NR_io_cancel 271
  541. +#define __NR_io_getevents 272
  542. +
  543. +
  544. +#define io_syscall1(type,fname,sname,type1,arg1) \
  545. +type fname(type1 arg1) \
  546. +{ \
  547. +long __res; \
  548. +register long __g1 __asm__ ("g1") = __NR_##sname; \
  549. +register long __o0 __asm__ ("o0") = (long)(arg1); \
  550. +__asm__ __volatile__ ("t 0x10\n\t" \
  551. + "bcc 1f\n\t" \
  552. + "mov %%o0, %0\n\t" \
  553. + "sub %%g0, %%o0, %0\n\t" \
  554. + "1:\n\t" \
  555. + : "=r" (__res), "=&r" (__o0) \
  556. + : "1" (__o0), "r" (__g1) \
  557. + : "cc"); \
  558. +if (__res < -255 || __res >= 0) \
  559. + return (type) __res; \
  560. +return -1; \
  561. +}
  562. +
  563. +#define io_syscall2(type,fname,sname,type1,arg1,type2,arg2) \
  564. +type fname(type1 arg1,type2 arg2) \
  565. +{ \
  566. +long __res; \
  567. +register long __g1 __asm__ ("g1") = __NR_##sname; \
  568. +register long __o0 __asm__ ("o0") = (long)(arg1); \
  569. +register long __o1 __asm__ ("o1") = (long)(arg2); \
  570. +__asm__ __volatile__ ("t 0x10\n\t" \
  571. + "bcc 1f\n\t" \
  572. + "mov %%o0, %0\n\t" \
  573. + "sub %%g0, %%o0, %0\n\t" \
  574. + "1:\n\t" \
  575. + : "=r" (__res), "=&r" (__o0) \
  576. + : "1" (__o0), "r" (__o1), "r" (__g1) \
  577. + : "cc"); \
  578. +if (__res < -255 || __res >= 0) \
  579. + return (type) __res; \
  580. +return -1; \
  581. +}
  582. +
  583. +#define io_syscall3(type,fname,sname,type1,arg1,type2,arg2,type3,arg3) \
  584. +type fname(type1 arg1,type2 arg2,type3 arg3) \
  585. +{ \
  586. +long __res; \
  587. +register long __g1 __asm__ ("g1") = __NR_##sname; \
  588. +register long __o0 __asm__ ("o0") = (long)(arg1); \
  589. +register long __o1 __asm__ ("o1") = (long)(arg2); \
  590. +register long __o2 __asm__ ("o2") = (long)(arg3); \
  591. +__asm__ __volatile__ ("t 0x10\n\t" \
  592. + "bcc 1f\n\t" \
  593. + "mov %%o0, %0\n\t" \
  594. + "sub %%g0, %%o0, %0\n\t" \
  595. + "1:\n\t" \
  596. + : "=r" (__res), "=&r" (__o0) \
  597. + : "1" (__o0), "r" (__o1), "r" (__o2), "r" (__g1) \
  598. + : "cc"); \
  599. +if (__res < -255 || __res>=0) \
  600. + return (type) __res; \
  601. +return -1; \
  602. +}
  603. +
  604. +#define io_syscall4(type,fname,sname,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
  605. +type fname(type1 arg1, type2 arg2, type3 arg3, type4 arg4) \
  606. +{ \
  607. +long __res; \
  608. +register long __g1 __asm__ ("g1") = __NR_##sname; \
  609. +register long __o0 __asm__ ("o0") = (long)(arg1); \
  610. +register long __o1 __asm__ ("o1") = (long)(arg2); \
  611. +register long __o2 __asm__ ("o2") = (long)(arg3); \
  612. +register long __o3 __asm__ ("o3") = (long)(arg4); \
  613. +__asm__ __volatile__ ("t 0x10\n\t" \
  614. + "bcc 1f\n\t" \
  615. + "mov %%o0, %0\n\t" \
  616. + "sub %%g0, %%o0, %0\n\t" \
  617. + "1:\n\t" \
  618. + : "=r" (__res), "=&r" (__o0) \
  619. + : "1" (__o0), "r" (__o1), "r" (__o2), "r" (__o3), "r" (__g1) \
  620. + : "cc"); \
  621. +if (__res < -255 || __res>=0) \
  622. + return (type) __res; \
  623. +return -1; \
  624. +}
  625. +
  626. +#define io_syscall5(type,fname,sname,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
  627. + type5,arg5) \
  628. +type fname(type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5) \
  629. +{ \
  630. +long __res; \
  631. +register long __g1 __asm__ ("g1") = __NR_##sname; \
  632. +register long __o0 __asm__ ("o0") = (long)(arg1); \
  633. +register long __o1 __asm__ ("o1") = (long)(arg2); \
  634. +register long __o2 __asm__ ("o2") = (long)(arg3); \
  635. +register long __o3 __asm__ ("o3") = (long)(arg4); \
  636. +register long __o4 __asm__ ("o4") = (long)(arg5); \
  637. +__asm__ __volatile__ ("t 0x10\n\t" \
  638. + "bcc 1f\n\t" \
  639. + "mov %%o0, %0\n\t" \
  640. + "sub %%g0, %%o0, %0\n\t" \
  641. + "1:\n\t" \
  642. + : "=r" (__res), "=&r" (__o0) \
  643. + : "1" (__o0), "r" (__o1), "r" (__o2), "r" (__o3), "r" (__o4), "r" (__g1) \
  644. + : "cc"); \
  645. +if (__res < -255 || __res>=0) \
  646. + return (type) __res; \
  647. +return -1; \
  648. +}
  649. +
  650. Index: libaio-0.3.109/src/syscall.h
  651. ===================================================================
  652. --- libaio-0.3.109.orig/src/syscall.h
  653. +++ libaio-0.3.109/src/syscall.h
  654. @@ -24,6 +24,14 @@
  655. #include "syscall-alpha.h"
  656. #elif defined(__arm__)
  657. #include "syscall-arm.h"
  658. +#elif defined(__m68k__)
  659. +#include "syscall-m68k.h"
  660. +#elif defined(__sparc__)
  661. +#include "syscall-sparc.h"
  662. +#elif defined(__hppa__)
  663. +#include "syscall-parisc.h"
  664. +#elif defined(__mips__)
  665. +#include "syscall-mips.h"
  666. #else
  667. #error "add syscall-arch.h"
  668. #endif