syscall.inc 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463
  1. {
  2. This file is part of the Free Pascal run time library.
  3. Copyright (c) 2003 by Florian Klaempfl,
  4. member of the Free Pascal development team.
  5. See the file COPYING.FPC, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. **********************************************************************}
  11. {No debugging for syslinux include !}
  12. {$IFDEF SYS_LINUX}
  13. {$UNDEF SYSCALL_DEBUG}
  14. {$ENDIF SYS_LINUX}
  15. {*****************************************************************************
  16. --- Main:The System Call Self ---
  17. *****************************************************************************}
  18. {$ifdef FPC_ABI_EABI}
  19. {$ifdef CPUTHUMB}
  20. function FpSysCall(sysnr:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL0'];
  21. {
  22. Perform syscall and set errno variable if needed.
  23. }
  24. asm
  25. push {r7}
  26. mov r7,r0
  27. // svc #0x0
  28. // GNU 2.22 does not like svc #0x0
  29. .byte 0,0xdf
  30. mov r1,#126
  31. cmn r0,r1
  32. pop {r7}
  33. bhi .Lnoexit
  34. mov pc,lr
  35. .Lnoexit:
  36. push {lr}
  37. neg r0,r0
  38. bl seterrno
  39. mov r0,#0
  40. mvn r0,r0
  41. pop {pc}
  42. end;
  43. function FpSysCall(sysnr,param1:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL1'];
  44. {
  45. Perform syscall and set errno variable if needed.
  46. }
  47. asm
  48. push {r7}
  49. mov r7,r0
  50. mov r0,r1
  51. // svc #0x0
  52. // GNU 2.22 does not like svc #0x0
  53. .byte 0,0xdf
  54. mov r1,#126
  55. cmn r0,r1
  56. pop {r7}
  57. bhi .Lnoexit
  58. mov pc,lr
  59. .Lnoexit:
  60. push {lr}
  61. neg r0,r0
  62. bl seterrno
  63. mov r0,#0
  64. mvn r0,r0
  65. pop {pc}
  66. end;
  67. function FpSysCall(sysnr,param1,param2:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL2'];
  68. {
  69. Perform syscall and set errno variable if needed.
  70. }
  71. asm
  72. push {r7}
  73. mov r7,r0
  74. mov r0,r1
  75. mov r1,r2
  76. // svc #0x0
  77. // GNU 2.22 does not like svc #0x0
  78. .byte 0,0xdf
  79. mov r1,#126
  80. cmn r0,r1
  81. pop {r7}
  82. bhi .Lnoexit
  83. mov pc,lr
  84. .Lnoexit:
  85. push {lr}
  86. neg r0,r0
  87. bl seterrno
  88. mov r0,#0
  89. mvn r0,r0
  90. pop {pc}
  91. end;
  92. function FpSysCall(sysnr,param1,param2,param3:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL3'];
  93. {
  94. Perform syscall and set errno variable if needed.
  95. }
  96. asm
  97. push {r7}
  98. mov r7,r0
  99. mov r0,r1
  100. mov r1,r2
  101. mov r2,r3
  102. // svc #0x0
  103. // GNU 2.22 does not like svc #0x0
  104. .byte 0,0xdf
  105. mov r1,#126
  106. cmn r0,r1
  107. pop {r7}
  108. bhi .Lnoexit
  109. mov pc,lr
  110. .Lnoexit:
  111. push {lr}
  112. neg r0,r0
  113. bl seterrno
  114. mov r0,#0
  115. mvn r0,r0
  116. pop {pc}
  117. end;
  118. function FpSysCall(sysnr,param1,param2,param3,param4:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL4'];
  119. {
  120. Perform syscall and set errno variable if needed.
  121. }
  122. asm
  123. push {r7}
  124. push {r0}
  125. mov r0,r1
  126. mov r1,r2
  127. mov r2,r3
  128. ldr r3,[r13 ,#8]
  129. pop {r7}
  130. // svc #0x0
  131. // GNU 2.22 does not like svc #0x0
  132. .byte 0,0xdf
  133. mov r1,#126
  134. cmn r0,r1
  135. pop {r7}
  136. bls .LExit
  137. push {lr}
  138. neg r0,r0
  139. bl seterrno
  140. mov r0,#0
  141. mvn r0,r0
  142. pop {pc}
  143. .LExit:
  144. mov pc,lr
  145. end;
  146. function FpSysCall(sysnr,param1,param2,param3,param4,param5:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL5'];
  147. {
  148. Perform syscall and set errno variable if needed.
  149. }
  150. asm
  151. push {r4,r7}
  152. push {r0}
  153. mov r0,r1
  154. mov r1,r2
  155. mov r2,r3
  156. ldr r3,[r13 ,#12]
  157. ldr r4,[r13 ,#16]
  158. pop {r7}
  159. // svc #0x0
  160. // GNU 2.22 does not like svc #0x0
  161. .byte 0,0xdf
  162. mov r1,#126
  163. cmn r0,r1
  164. pop {r4,r7}
  165. bls .LExit
  166. push {lr}
  167. neg r0,r0
  168. bl seterrno
  169. mov r0,#0
  170. mvn r0,r0
  171. pop {pc}
  172. .LExit:
  173. mov pc,lr
  174. end;
  175. function FpSysCall(sysnr,param1,param2,param3,param4,param5,param6:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL6'];
  176. {
  177. Perform syscall and set errno variable if needed.
  178. }
  179. asm
  180. push {r4,r5,r7}
  181. push {r0}
  182. mov r0,r1
  183. mov r1,r2
  184. mov r2,r3
  185. ldr r3,[r13 ,#16]
  186. ldr r4,[r13 ,#20]
  187. ldr r5,[r13 ,#24]
  188. pop {r7}
  189. // svc #0x0
  190. // GNU 2.22 does not like svc #0x0
  191. .byte 0,0xdf
  192. mov r1,#126
  193. cmn r0,r1
  194. pop {r4,r5,r7}
  195. bls .LExit
  196. push {lr}
  197. neg r0,r0
  198. bl seterrno
  199. mov r0,#0
  200. mvn r0,r0
  201. pop {pc}
  202. .LExit:
  203. mov pc,lr
  204. end;
  205. {$else CPUTHUMB}
  206. function FpSysCall(sysnr:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL0'];
  207. {
  208. Perform syscall and set errno variable if needed.
  209. }
  210. asm
  211. str r7,[sp,#-4]!
  212. mov r7,r0
  213. swi #0x0
  214. cmn r0,#126
  215. ldr r7,[sp],#4
  216. movls pc,lr
  217. stmfd sp!,{lr}
  218. rsb r0,r0,#0
  219. bl seterrno
  220. mvn r0,#0
  221. ldmfd sp!,{pc}
  222. end;
  223. function FpSysCall(sysnr,param1:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL1'];
  224. {
  225. Perform syscall and set errno variable if needed.
  226. }
  227. asm
  228. str r7,[sp,#-4]!
  229. mov r7,r0
  230. mov r0,r1
  231. swi #0x0
  232. cmn r0,#126
  233. ldr r7,[sp],#4
  234. movls pc,lr
  235. stmfd sp!,{lr}
  236. rsb r0,r0,#0
  237. bl seterrno
  238. mvn r0,#0
  239. ldmfd sp!,{pc}
  240. end;
  241. function FpSysCall(sysnr,param1,param2:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL2'];
  242. {
  243. Perform syscall and set errno variable if needed.
  244. }
  245. asm
  246. str r7,[sp,#-4]!
  247. mov r7,r0
  248. mov r0,r1
  249. mov r1,r2
  250. swi #0x0
  251. cmn r0,#126
  252. ldr r7,[sp],#4
  253. movls pc,lr
  254. stmfd sp!,{lr}
  255. rsb r0,r0,#0
  256. bl seterrno
  257. mvn r0,#0
  258. ldmfd sp!,{pc}
  259. end;
  260. function FpSysCall(sysnr,param1,param2,param3:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL3'];
  261. {
  262. Perform syscall and set errno variable if needed.
  263. }
  264. asm
  265. str r7,[sp,#-4]!
  266. mov r7,r0
  267. mov r0,r1
  268. mov r1,r2
  269. mov r2,r3
  270. swi #0x0
  271. cmn r0,#126
  272. ldr r7,[sp],#4
  273. movls pc,lr
  274. stmfd sp!,{lr}
  275. rsb r0,r0,#0
  276. bl seterrno
  277. mvn r0,#0
  278. ldmfd sp!,{pc}
  279. end;
  280. function FpSysCall(sysnr,param1,param2,param3,param4:TSysParam):TSysResult; assembler; [public,alias:'FPC_SYSCALL4'];
  281. {
  282. Perform syscall and set errno variable if needed.
  283. }
  284. asm
  285. str r7,[sp,#-4]!
  286. mov r7,r0
  287. mov r0,r1
  288. mov r1,r2
  289. mov r2,r3
  290. ldr r3,param4
  291. swi #0x0
  292. cmn r0,#126
  293. ldr r7,[sp],#4
  294. bls .LExit
  295. rsb r0,r0,#0
  296. bl seterrno
  297. mvn r0,#0
  298. .LExit:
  299. end;
  300. function FpSysCall(sysnr,param1,param2,param3,param4,param5:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL5'];
  301. {
  302. Perform syscall and set errno variable if needed.
  303. }
  304. asm
  305. stmfd sp!,{r4,r7}
  306. mov r7,r0
  307. mov r0,r1
  308. mov r1,r2
  309. mov r2,r3
  310. ldr r3,param4
  311. ldr r4,param5
  312. swi #0x0
  313. cmn r0,#126
  314. ldmfd sp!,{r4,r7}
  315. bls .LExit
  316. rsb r0,r0,#0
  317. bl seterrno
  318. mvn r0,#0
  319. .LExit:
  320. end;
  321. function FpSysCall(sysnr,param1,param2,param3,param4,param5,param6:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL6'];
  322. {
  323. Perform syscall and set errno variable if needed.
  324. }
  325. asm
  326. stmfd sp!,{r4,r5,r7}
  327. mov r7,r0
  328. mov r0,r1
  329. mov r1,r2
  330. mov r2,r3
  331. ldr r3,param4
  332. ldr r4,param5
  333. ldr r5,param6
  334. swi #0x0
  335. cmn r0,#126
  336. ldmfd sp!,{r4,r5,r7}
  337. bls .LExit
  338. rsb r0,r0,#0
  339. bl seterrno
  340. mvn r0,#0
  341. .LExit:
  342. end;
  343. {$endif CPUTHUMB}
  344. {$else FPC_ABI_EABI}
  345. function FpSysCall(sysnr:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL0'];
  346. {
  347. Perform syscall and set errno variable if needed.
  348. }
  349. asm
  350. swi #0x900071
  351. cmn r0,#126
  352. movls pc,lr
  353. stmfd sp!,{lr}
  354. rsb r0,r0,#0
  355. bl seterrno
  356. mvn r0,#0
  357. ldmfd sp!,{pc}
  358. end;
  359. procedure FPC_SYSCALL; external name 'FPC_SYSCALL0';
  360. function FpSysCall(sysnr,param1:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL1'];
  361. {
  362. Jump to FPC_SYSCALL0 because code for FPC_SYSCALL0-FPC_SYSCALL3 is the same.
  363. }
  364. asm
  365. b FPC_SYSCALL
  366. end;
  367. function FpSysCall(sysnr,param1,param2:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL2'];
  368. {
  369. Jump to FPC_SYSCALL0 because code for FPC_SYSCALL0-FPC_SYSCALL3 is the same.
  370. }
  371. asm
  372. b FPC_SYSCALL
  373. end;
  374. function FpSysCall(sysnr,param1,param2,param3:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL3'];
  375. {
  376. Jump to FPC_SYSCALL0 because code for FPC_SYSCALL0-FPC_SYSCALL3 is the same.
  377. }
  378. asm
  379. b FPC_SYSCALL
  380. end;
  381. function FpSysCall(sysnr,param1,param2,param3,param4:TSysParam):TSysResult; assembler; [public,alias:'FPC_SYSCALL4'];
  382. {
  383. This function loads some parameters from stack and calls FPC_SYSCALL0.
  384. }
  385. asm
  386. stmfd sp!,{r4}
  387. ldr r4,param4
  388. bl FPC_SYSCALL
  389. ldmfd sp!,{r4}
  390. end;
  391. function FpSysCall(sysnr,param1,param2,param3,param4,param5:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL5'];
  392. {
  393. This function loads some parameters from stack and calls FPC_SYSCALL0.
  394. }
  395. asm
  396. stmfd sp!,{r4,r5}
  397. ldr r4,param4
  398. ldr r5,param5
  399. bl FPC_SYSCALL
  400. ldmfd sp!,{r4,r5}
  401. end;
  402. function FpSysCall(sysnr,param1,param2,param3,param4,param5,param6:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL6'];
  403. {
  404. This function loads some parameters from stack and calls FPC_SYSCALL0.
  405. }
  406. asm
  407. stmfd sp!,{r4,r5,r6}
  408. ldr r4,param4
  409. ldr r5,param5
  410. ldr r6,param6
  411. bl FPC_SYSCALL
  412. ldmfd sp!,{r4,r5,r6}
  413. end;
  414. {$endif FPC_ABI_EABI}