syscall.inc 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  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. it ls
  217. movls pc,lr
  218. stmfd sp!,{lr}
  219. rsb r0,r0,#0
  220. bl seterrno
  221. mvn r0,#0
  222. ldmfd sp!,{pc}
  223. end;
  224. function FpSysCall(sysnr,param1:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL1'];
  225. {
  226. Perform syscall and set errno variable if needed.
  227. }
  228. asm
  229. str r7,[sp,#-4]!
  230. mov r7,r0
  231. mov r0,r1
  232. swi #0x0
  233. cmn r0,#126
  234. ldr r7,[sp],#4
  235. it ls
  236. movls pc,lr
  237. stmfd sp!,{lr}
  238. rsb r0,r0,#0
  239. bl seterrno
  240. mvn r0,#0
  241. ldmfd sp!,{pc}
  242. end;
  243. function FpSysCall(sysnr,param1,param2:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL2'];
  244. {
  245. Perform syscall and set errno variable if needed.
  246. }
  247. asm
  248. str r7,[sp,#-4]!
  249. mov r7,r0
  250. mov r0,r1
  251. mov r1,r2
  252. swi #0x0
  253. cmn r0,#126
  254. ldr r7,[sp],#4
  255. it ls
  256. movls pc,lr
  257. stmfd sp!,{lr}
  258. rsb r0,r0,#0
  259. bl seterrno
  260. mvn r0,#0
  261. ldmfd sp!,{pc}
  262. end;
  263. function FpSysCall(sysnr,param1,param2,param3:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL3'];
  264. {
  265. Perform syscall and set errno variable if needed.
  266. }
  267. asm
  268. str r7,[sp,#-4]!
  269. mov r7,r0
  270. mov r0,r1
  271. mov r1,r2
  272. mov r2,r3
  273. swi #0x0
  274. cmn r0,#126
  275. ldr r7,[sp],#4
  276. it ls
  277. movls pc,lr
  278. stmfd sp!,{lr}
  279. rsb r0,r0,#0
  280. bl seterrno
  281. mvn r0,#0
  282. ldmfd sp!,{pc}
  283. end;
  284. function FpSysCall(sysnr,param1,param2,param3,param4:TSysParam):TSysResult; assembler; [public,alias:'FPC_SYSCALL4'];
  285. {
  286. Perform syscall and set errno variable if needed.
  287. }
  288. asm
  289. str r7,[sp,#-4]!
  290. mov r7,r0
  291. mov r0,r1
  292. mov r1,r2
  293. mov r2,r3
  294. ldr r3,param4
  295. swi #0x0
  296. cmn r0,#126
  297. ldr r7,[sp],#4
  298. bls .LExit
  299. rsb r0,r0,#0
  300. bl seterrno
  301. mvn r0,#0
  302. .LExit:
  303. end;
  304. function FpSysCall(sysnr,param1,param2,param3,param4,param5:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL5'];
  305. {
  306. Perform syscall and set errno variable if needed.
  307. }
  308. asm
  309. stmfd sp!,{r4,r7}
  310. mov r7,r0
  311. mov r0,r1
  312. mov r1,r2
  313. mov r2,r3
  314. ldr r3,param4
  315. ldr r4,param5
  316. swi #0x0
  317. cmn r0,#126
  318. ldmfd sp!,{r4,r7}
  319. bls .LExit
  320. rsb r0,r0,#0
  321. bl seterrno
  322. mvn r0,#0
  323. .LExit:
  324. end;
  325. function FpSysCall(sysnr,param1,param2,param3,param4,param5,param6:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL6'];
  326. {
  327. Perform syscall and set errno variable if needed.
  328. }
  329. asm
  330. stmfd sp!,{r4,r5,r7}
  331. mov r7,r0
  332. mov r0,r1
  333. mov r1,r2
  334. mov r2,r3
  335. ldr r3,param4
  336. ldr r4,param5
  337. ldr r5,param6
  338. swi #0x0
  339. cmn r0,#126
  340. ldmfd sp!,{r4,r5,r7}
  341. bls .LExit
  342. rsb r0,r0,#0
  343. bl seterrno
  344. mvn r0,#0
  345. .LExit:
  346. end;
  347. {$endif CPUTHUMB}
  348. {$else FPC_ABI_EABI}
  349. function FpSysCall(sysnr:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL0'];
  350. {
  351. Perform syscall and set errno variable if needed.
  352. }
  353. asm
  354. swi #0x900071
  355. cmn r0,#126
  356. movls pc,lr
  357. stmfd sp!,{lr}
  358. rsb r0,r0,#0
  359. bl seterrno
  360. mvn r0,#0
  361. ldmfd sp!,{pc}
  362. end;
  363. procedure FPC_SYSCALL; external name 'FPC_SYSCALL0';
  364. function FpSysCall(sysnr,param1:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL1'];
  365. {
  366. Jump to FPC_SYSCALL0 because code for FPC_SYSCALL0-FPC_SYSCALL3 is the same.
  367. }
  368. asm
  369. b FPC_SYSCALL
  370. end;
  371. function FpSysCall(sysnr,param1,param2:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL2'];
  372. {
  373. Jump to FPC_SYSCALL0 because code for FPC_SYSCALL0-FPC_SYSCALL3 is the same.
  374. }
  375. asm
  376. b FPC_SYSCALL
  377. end;
  378. function FpSysCall(sysnr,param1,param2,param3:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL3'];
  379. {
  380. Jump to FPC_SYSCALL0 because code for FPC_SYSCALL0-FPC_SYSCALL3 is the same.
  381. }
  382. asm
  383. b FPC_SYSCALL
  384. end;
  385. function FpSysCall(sysnr,param1,param2,param3,param4:TSysParam):TSysResult; assembler; [public,alias:'FPC_SYSCALL4'];
  386. {
  387. This function loads some parameters from stack and calls FPC_SYSCALL0.
  388. }
  389. asm
  390. stmfd sp!,{r4}
  391. ldr r4,param4
  392. bl FPC_SYSCALL
  393. ldmfd sp!,{r4}
  394. end;
  395. function FpSysCall(sysnr,param1,param2,param3,param4,param5:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL5'];
  396. {
  397. This function loads some parameters from stack and calls FPC_SYSCALL0.
  398. }
  399. asm
  400. stmfd sp!,{r4,r5}
  401. ldr r4,param4
  402. ldr r5,param5
  403. bl FPC_SYSCALL
  404. ldmfd sp!,{r4,r5}
  405. end;
  406. function FpSysCall(sysnr,param1,param2,param3,param4,param5,param6:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL6'];
  407. {
  408. This function loads some parameters from stack and calls FPC_SYSCALL0.
  409. }
  410. asm
  411. stmfd sp!,{r4,r5,r6}
  412. ldr r4,param4
  413. ldr r5,param5
  414. ldr r6,param6
  415. bl FPC_SYSCALL
  416. ldmfd sp!,{r4,r5,r6}
  417. end;
  418. {$endif FPC_ABI_EABI}