syscall.inc 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454
  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; [public,alias:'FPC_SYSCALL4'];
  119. {
  120. Perform syscall and set errno variable if needed.
  121. }
  122. asm
  123. push {r6,r7}
  124. push {r0}
  125. mov r0,r1
  126. mov r1,r2
  127. mov r2,r3
  128. ldr r3,param4
  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 {r6,r7}
  136. bls .LExit
  137. neg r0,r0
  138. bl seterrno
  139. mov r0,#0
  140. mvn r0,r0
  141. .LExit:
  142. end;
  143. function FpSysCall(sysnr,param1,param2,param3,param4,param5:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL5'];
  144. {
  145. Perform syscall and set errno variable if needed.
  146. }
  147. asm
  148. push {r4,r7}
  149. push {r0}
  150. mov r0,r1
  151. mov r1,r2
  152. mov r2,r3
  153. ldr r3,param4
  154. ldr r4,param5
  155. pop {r7}
  156. // svc #0x0
  157. // GNU 2.22 does not like svc #0x0
  158. .byte 0,0xdf
  159. mov r1,#126
  160. cmn r0,r1
  161. pop {r4,r7}
  162. bls .LExit
  163. neg r0,r0
  164. bl seterrno
  165. mov r0,#0
  166. mvn r0,r0
  167. .LExit:
  168. end;
  169. function FpSysCall(sysnr,param1,param2,param3,param4,param5,param6:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL6'];
  170. {
  171. Perform syscall and set errno variable if needed.
  172. }
  173. asm
  174. push {r4,r5,r6,r7}
  175. push {r0}
  176. mov r0,r1
  177. mov r1,r2
  178. mov r2,r3
  179. ldr r3,param4
  180. ldr r4,param5
  181. ldr r4,param6
  182. pop {r7}
  183. // svc #0x0
  184. // GNU 2.22 does not like svc #0x0
  185. .byte 0,0xdf
  186. mov r1,#126
  187. cmn r0,r1
  188. pop {r4,r5,r6,r7}
  189. bls .LExit
  190. neg r0,r0
  191. bl seterrno
  192. mov r0,#0
  193. mvn r0,r0
  194. .LExit:
  195. end;
  196. {$else CPUTHUMB}
  197. function FpSysCall(sysnr:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL0'];
  198. {
  199. Perform syscall and set errno variable if needed.
  200. }
  201. asm
  202. str r7,[sp,#-4]!
  203. mov r7,r0
  204. swi #0x0
  205. cmn r0,#126
  206. ldr r7,[sp],#4
  207. movls pc,lr
  208. stmfd sp!,{lr}
  209. rsb r0,r0,#0
  210. bl seterrno
  211. mvn r0,#0
  212. ldmfd sp!,{pc}
  213. end;
  214. function FpSysCall(sysnr,param1:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL1'];
  215. {
  216. Perform syscall and set errno variable if needed.
  217. }
  218. asm
  219. str r7,[sp,#-4]!
  220. mov r7,r0
  221. mov r0,r1
  222. swi #0x0
  223. cmn r0,#126
  224. ldr r7,[sp],#4
  225. movls pc,lr
  226. stmfd sp!,{lr}
  227. rsb r0,r0,#0
  228. bl seterrno
  229. mvn r0,#0
  230. ldmfd sp!,{pc}
  231. end;
  232. function FpSysCall(sysnr,param1,param2:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL2'];
  233. {
  234. Perform syscall and set errno variable if needed.
  235. }
  236. asm
  237. str r7,[sp,#-4]!
  238. mov r7,r0
  239. mov r0,r1
  240. mov r1,r2
  241. swi #0x0
  242. cmn r0,#126
  243. ldr r7,[sp],#4
  244. movls pc,lr
  245. stmfd sp!,{lr}
  246. rsb r0,r0,#0
  247. bl seterrno
  248. mvn r0,#0
  249. ldmfd sp!,{pc}
  250. end;
  251. function FpSysCall(sysnr,param1,param2,param3:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL3'];
  252. {
  253. Perform syscall and set errno variable if needed.
  254. }
  255. asm
  256. str r7,[sp,#-4]!
  257. mov r7,r0
  258. mov r0,r1
  259. mov r1,r2
  260. mov r2,r3
  261. swi #0x0
  262. cmn r0,#126
  263. ldr r7,[sp],#4
  264. movls pc,lr
  265. stmfd sp!,{lr}
  266. rsb r0,r0,#0
  267. bl seterrno
  268. mvn r0,#0
  269. ldmfd sp!,{pc}
  270. end;
  271. function FpSysCall(sysnr,param1,param2,param3,param4:TSysParam):TSysResult; assembler; [public,alias:'FPC_SYSCALL4'];
  272. {
  273. Perform syscall and set errno variable if needed.
  274. }
  275. asm
  276. str r7,[sp,#-4]!
  277. mov r7,r0
  278. mov r0,r1
  279. mov r1,r2
  280. mov r2,r3
  281. ldr r3,param4
  282. swi #0x0
  283. cmn r0,#126
  284. ldr r7,[sp],#4
  285. bls .LExit
  286. rsb r0,r0,#0
  287. bl seterrno
  288. mvn r0,#0
  289. .LExit:
  290. end;
  291. function FpSysCall(sysnr,param1,param2,param3,param4,param5:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL5'];
  292. {
  293. Perform syscall and set errno variable if needed.
  294. }
  295. asm
  296. stmfd sp!,{r4,r7}
  297. mov r7,r0
  298. mov r0,r1
  299. mov r1,r2
  300. mov r2,r3
  301. ldr r3,param4
  302. ldr r4,param5
  303. swi #0x0
  304. cmn r0,#126
  305. ldmfd sp!,{r4,r7}
  306. bls .LExit
  307. rsb r0,r0,#0
  308. bl seterrno
  309. mvn r0,#0
  310. .LExit:
  311. end;
  312. function FpSysCall(sysnr,param1,param2,param3,param4,param5,param6:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL6'];
  313. {
  314. Perform syscall and set errno variable if needed.
  315. }
  316. asm
  317. stmfd sp!,{r4,r5,r7}
  318. mov r7,r0
  319. mov r0,r1
  320. mov r1,r2
  321. mov r2,r3
  322. ldr r3,param4
  323. ldr r4,param5
  324. ldr r5,param6
  325. swi #0x0
  326. cmn r0,#126
  327. ldmfd sp!,{r4,r5,r7}
  328. bls .LExit
  329. rsb r0,r0,#0
  330. bl seterrno
  331. mvn r0,#0
  332. .LExit:
  333. end;
  334. {$endif CPUTHUMB}
  335. {$else FPC_ABI_EABI}
  336. function FpSysCall(sysnr:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL0'];
  337. {
  338. Perform syscall and set errno variable if needed.
  339. }
  340. asm
  341. swi #0x900071
  342. cmn r0,#126
  343. movls pc,lr
  344. stmfd sp!,{lr}
  345. rsb r0,r0,#0
  346. bl seterrno
  347. mvn r0,#0
  348. ldmfd sp!,{pc}
  349. end;
  350. procedure FPC_SYSCALL; external name 'FPC_SYSCALL0';
  351. function FpSysCall(sysnr,param1:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL1'];
  352. {
  353. Jump to FPC_SYSCALL0 because code for FPC_SYSCALL0-FPC_SYSCALL3 is the same.
  354. }
  355. asm
  356. b FPC_SYSCALL
  357. end;
  358. function FpSysCall(sysnr,param1,param2:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL2'];
  359. {
  360. Jump to FPC_SYSCALL0 because code for FPC_SYSCALL0-FPC_SYSCALL3 is the same.
  361. }
  362. asm
  363. b FPC_SYSCALL
  364. end;
  365. function FpSysCall(sysnr,param1,param2,param3:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL3'];
  366. {
  367. Jump to FPC_SYSCALL0 because code for FPC_SYSCALL0-FPC_SYSCALL3 is the same.
  368. }
  369. asm
  370. b FPC_SYSCALL
  371. end;
  372. function FpSysCall(sysnr,param1,param2,param3,param4:TSysParam):TSysResult; assembler; [public,alias:'FPC_SYSCALL4'];
  373. {
  374. This function loads some parameters from stack and calls FPC_SYSCALL0.
  375. }
  376. asm
  377. stmfd sp!,{r4}
  378. ldr r4,param4
  379. bl FPC_SYSCALL
  380. ldmfd sp!,{r4}
  381. end;
  382. function FpSysCall(sysnr,param1,param2,param3,param4,param5:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL5'];
  383. {
  384. This function loads some parameters from stack and calls FPC_SYSCALL0.
  385. }
  386. asm
  387. stmfd sp!,{r4,r5}
  388. ldr r4,param4
  389. ldr r5,param5
  390. bl FPC_SYSCALL
  391. ldmfd sp!,{r4,r5}
  392. end;
  393. function FpSysCall(sysnr,param1,param2,param3,param4,param5,param6:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL6'];
  394. {
  395. This function loads some parameters from stack and calls FPC_SYSCALL0.
  396. }
  397. asm
  398. stmfd sp!,{r4,r5,r6}
  399. ldr r4,param4
  400. ldr r5,param5
  401. ldr r6,param6
  402. bl FPC_SYSCALL
  403. ldmfd sp!,{r4,r5,r6}
  404. end;
  405. {$endif FPC_ABI_EABI}