2
0

syscall.inc 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573
  1. {
  2. This file is part of the Free Pascal run time library.
  3. Copyright (c) 1999-2009 by Michael Van Canneyt and David Zhang
  4. See the file COPYING.FPC, included in this distribution,
  5. for details about the copyright.
  6. This program is distributed in the hope that it will be useful,
  7. but WITHOUT ANY WARRANTY; without even the implied warranty of
  8. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  9. **********************************************************************}
  10. {No debugging for syslinux include !}
  11. {$IFDEF SYS_LINUX}
  12. {$UNDEF SYSCALL_DEBUG}
  13. {$ENDIF SYS_LINUX}
  14. {$define FPC_SYSTEM_HAS_FPFORK}
  15. {
  16. behaviour of result of fork on sparc/linux is different than on other
  17. linux flavours
  18. }
  19. function Fpfork : pid_t; [public, alias : 'FPC_SYSC_FORK'];assembler;
  20. var
  21. temp: longint;
  22. asm
  23. sw $4,0($23)
  24. sw $5,-4($23)
  25. sw $6,-8($23)
  26. sw $7,-12($23)
  27. sw $8,-16($23)
  28. sw $9,-20($23)
  29. sw $10,-24($23)
  30. sw $11,-28($23)
  31. sw $12,-32($23)
  32. sw $13,-36($23)
  33. sw $14,-40($23)
  34. addiu $23,$23,-44
  35. li $2,4002
  36. syscall
  37. nop
  38. beq $7,$0,.LDone
  39. nop
  40. lui $8,%hi(fpc_threadvar_relocate_proc)
  41. addiu $8,%lo(fpc_threadvar_relocate_proc)
  42. lw $8,0($8)
  43. bne $8,$0,.LThreaded
  44. nop
  45. lui $4,%hi(Errno+4)
  46. addiu $4,%lo(Errno+4)
  47. sw $2,0($4)
  48. b .LFailed
  49. nop
  50. .LThreaded:
  51. sw $2,-4($fp)#temp#sw $4
  52. lui $4,%hi(errno)
  53. addiu $4,$4,%lo(errno)
  54. jal $8
  55. nop
  56. lw $8,-4($fp)
  57. sw $8,0($2)
  58. .LFailed:
  59. li $2,-1
  60. .LDone:
  61. addiu $23,$23,44
  62. lw $4,0($23)
  63. lw $5,-4($23)
  64. lw $6,-8($23)
  65. lw $7,-12($23)
  66. lw $8,-16($23)
  67. lw $9,-20($23)
  68. lw $10,-24($23)
  69. lw $11,-28($23)
  70. lw $12,-32($23)
  71. lw $13,-36($23)
  72. lw $14,-40($23)
  73. end;
  74. {*****************************************************************************
  75. --- Main:The System Call Self ---
  76. *****************************************************************************}
  77. function FpSysCall(sysnr:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL0'];
  78. {
  79. This function puts the registers in place, does the call, and then
  80. copies back the registers as they are after the SysCall.
  81. }
  82. var
  83. temp: longint;
  84. asm
  85. sw $4,0($23)
  86. sw $5,-4($23)
  87. sw $6,-8($23)
  88. sw $7,-12($23)
  89. sw $8,-16($23)
  90. sw $9,-20($23)
  91. sw $10,-24($23)
  92. sw $11,-28($23)
  93. sw $12,-32($23)
  94. sw $13,-36($23)
  95. sw $14,-40($23)
  96. addiu $23,$23,-44
  97. move $2,$4
  98. syscall
  99. nop
  100. beq $7,$0,.LDone
  101. nop
  102. lui $8,%hi(fpc_threadvar_relocate_proc)
  103. addiu $8,%lo(fpc_threadvar_relocate_proc)
  104. lw $8,0($8)
  105. bne $8,$0,.LThreaded
  106. nop
  107. lui $4,%hi(Errno+4)
  108. addiu $4,%lo(Errno+4)
  109. sw $2,0($4)
  110. b .LFailed
  111. nop
  112. .LThreaded:
  113. sw $2,-4($fp)#temp#sw $4
  114. lui $4,%hi(errno)
  115. addiu $4,$4,%lo(errno)
  116. jal $8
  117. nop
  118. lw $8,-4($fp)
  119. sw $8,0($2)
  120. .LFailed:
  121. li $2,-1
  122. .LDone:
  123. addiu $23,$23,44
  124. lw $4,0($23)
  125. lw $5,-4($23)
  126. lw $6,-8($23)
  127. lw $7,-12($23)
  128. lw $8,-16($23)
  129. lw $9,-20($23)
  130. lw $10,-24($23)
  131. lw $11,-28($23)
  132. lw $12,-32($23)
  133. lw $13,-36($23)
  134. lw $14,-40($23)
  135. end;
  136. function FpSysCall(sysnr,param1:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL1'];
  137. {
  138. This function puts the registers in place, does the call, and then
  139. copies back the registers as they are after the SysCall.
  140. }
  141. var
  142. temp: longint;
  143. asm
  144. sw $4,0($23)
  145. sw $5,-4($23)
  146. sw $6,-8($23)
  147. sw $7,-12($23)
  148. sw $8,-16($23)
  149. sw $9,-20($23)
  150. sw $10,-24($23)
  151. sw $11,-28($23)
  152. sw $12,-32($23)
  153. sw $13,-36($23)
  154. sw $14,-40($23)
  155. addiu $23,$23,-44
  156. move $2,$4
  157. move $4,$5
  158. syscall
  159. nop
  160. beq $7,$0,.LDone
  161. nop
  162. lui $8,%hi(fpc_threadvar_relocate_proc)
  163. addiu $8,%lo(fpc_threadvar_relocate_proc)
  164. lw $8,0($8)
  165. bne $8,$0,.LThreaded
  166. nop
  167. lui $4,%hi(Errno+4)
  168. addiu $4,%lo(Errno+4)
  169. sw $2,0($4)
  170. b .LFailed
  171. nop
  172. .LThreaded:
  173. sw $2,-4($fp)#temp#sw $4
  174. lui $4,%hi(errno)
  175. addiu $4,$4,%lo(errno)
  176. jal $8
  177. nop
  178. lw $8,-4($fp)
  179. sw $8,0($2)
  180. .LFailed:
  181. li $2,-1
  182. .LDone:
  183. addiu $23,$23,44
  184. lw $4,0($23)
  185. lw $5,-4($23)
  186. lw $6,-8($23)
  187. lw $7,-12($23)
  188. lw $8,-16($23)
  189. lw $9,-20($23)
  190. lw $10,-24($23)
  191. lw $11,-28($23)
  192. lw $12,-32($23)
  193. lw $13,-36($23)
  194. lw $14,-40($23)
  195. end;
  196. function FpSysCall(sysnr,param1,param2:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL2'];
  197. {
  198. This function puts the registers in place, does the call, and then
  199. copies back the registers as they are after the SysCall.
  200. }
  201. var
  202. temp: longint;
  203. asm
  204. sw $4,0($23)
  205. sw $5,-4($23)
  206. sw $6,-8($23)
  207. sw $7,-12($23)
  208. sw $8,-16($23)
  209. sw $9,-20($23)
  210. sw $10,-24($23)
  211. sw $11,-28($23)
  212. sw $12,-32($23)
  213. sw $13,-36($23)
  214. sw $14,-40($23)
  215. addiu $23,$23,-44
  216. move $2,$4
  217. move $4,$5
  218. move $5,$6
  219. syscall
  220. nop
  221. beq $7,$0,.LDone
  222. nop
  223. lui $8,%hi(fpc_threadvar_relocate_proc)
  224. addiu $8,%lo(fpc_threadvar_relocate_proc)
  225. lw $8,0($8)
  226. bne $8,$0,.LThreaded
  227. nop
  228. lui $4,%hi(Errno+4)
  229. addiu $4,%lo(Errno+4)
  230. sw $2,0($4)
  231. b .LFailed
  232. nop
  233. .LThreaded:
  234. sw $2,-4($fp)#temp#sw $4
  235. lui $4,%hi(errno)
  236. addiu $4,$4,%lo(errno)
  237. jal $8
  238. nop
  239. lw $8,-4($fp)
  240. sw $8,0($2)
  241. .LFailed:
  242. li $2,-1
  243. .LDone:
  244. addiu $23,$23,44
  245. lw $4,0($23)
  246. lw $5,-4($23)
  247. lw $6,-8($23)
  248. lw $7,-12($23)
  249. lw $8,-16($23)
  250. lw $9,-20($23)
  251. lw $10,-24($23)
  252. lw $11,-28($23)
  253. lw $12,-32($23)
  254. lw $13,-36($23)
  255. lw $14,-40($23)
  256. end;
  257. function FpSysCall(sysnr,param1,param2,param3:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL3'];
  258. {
  259. This function puts the registers in place, does the call, and then
  260. copies back the registers as they are after the SysCall.
  261. }
  262. var
  263. temp: longint;
  264. asm
  265. sw $4,0($23)
  266. sw $5,-4($23)
  267. sw $6,-8($23)
  268. sw $7,-12($23)
  269. sw $8,-16($23)
  270. sw $9,-20($23)
  271. sw $10,-24($23)
  272. sw $11,-28($23)
  273. sw $12,-32($23)
  274. sw $13,-36($23)
  275. sw $14,-40($23)
  276. addiu $23,$23,-44
  277. move $2,$4
  278. move $4,$5
  279. move $5,$6
  280. move $6,$7
  281. syscall
  282. nop
  283. beq $7,$0,.LDone
  284. nop
  285. lui $8,%hi(fpc_threadvar_relocate_proc)
  286. addiu $8,%lo(fpc_threadvar_relocate_proc)
  287. lw $8,0($8)
  288. bne $8,$0,.LThreaded
  289. nop
  290. lui $4,%hi(Errno+4)
  291. addiu $4,%lo(Errno+4)
  292. sw $2,0($4)
  293. b .LFailed
  294. nop
  295. .LThreaded:
  296. sw $2,-4($fp)#temp#sw $4
  297. lui $4,%hi(errno)
  298. addiu $4,$4,%lo(errno)
  299. jal $8
  300. nop
  301. lw $8,-4($fp)
  302. sw $8,0($2)
  303. .LFailed:
  304. li $2,-1
  305. .LDone:
  306. addiu $23,$23,44
  307. lw $4,0($23)
  308. lw $5,-4($23)
  309. lw $6,-8($23)
  310. lw $7,-12($23)
  311. lw $8,-16($23)
  312. lw $9,-20($23)
  313. lw $10,-24($23)
  314. lw $11,-28($23)
  315. lw $12,-32($23)
  316. lw $13,-36($23)
  317. lw $14,-40($23)
  318. end;
  319. function FpSysCall(sysnr,param1,param2,param3,param4:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL4'];
  320. {
  321. This function puts the registers in place, does the call, and then
  322. copies back the registers as they are after the SysCall.
  323. }
  324. var
  325. temp: longint;
  326. asm
  327. sw $4,0($23)
  328. sw $5,-4($23)
  329. sw $6,-8($23)
  330. sw $7,-12($23)
  331. sw $8,-16($23)
  332. sw $9,-20($23)
  333. sw $10,-24($23)
  334. sw $11,-28($23)
  335. sw $12,-32($23)
  336. sw $13,-36($23)
  337. sw $14,-40($23)
  338. addiu $23,$23,-44
  339. move $2,$4
  340. move $4,$5
  341. move $5,$6
  342. move $6,$7
  343. move $7,$8
  344. syscall
  345. nop
  346. beq $7,$0,.LDone
  347. nop
  348. lui $8,%hi(fpc_threadvar_relocate_proc)
  349. addiu $8,%lo(fpc_threadvar_relocate_proc)
  350. lw $8,0($8)
  351. bne $8,$0,.LThreaded
  352. nop
  353. lui $4,%hi(Errno+4)
  354. addiu $4,%lo(Errno+4)
  355. sw $2,0($4)
  356. b .LFailed
  357. nop
  358. .LThreaded:
  359. sw $2,-4($fp)#temp#sw $4
  360. lui $4,%hi(errno)
  361. addiu $4,$4,%lo(errno)
  362. jal $8
  363. nop
  364. lw $8,-4($fp)
  365. sw $8,0($2)
  366. .LFailed:
  367. li $2,-1
  368. .LDone:
  369. addiu $23,$23,44
  370. lw $4,0($23)
  371. lw $5,-4($23)
  372. lw $6,-8($23)
  373. lw $7,-12($23)
  374. lw $8,-16($23)
  375. lw $9,-20($23)
  376. lw $10,-24($23)
  377. lw $11,-28($23)
  378. lw $12,-32($23)
  379. lw $13,-36($23)
  380. lw $14,-40($23)
  381. end;
  382. function FpSysCall(sysnr,param1,param2,param3,param4,param5:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL5'];
  383. {
  384. This function puts the registers in place, does the call, and then
  385. copies back the registers as they are after the SysCall.
  386. }
  387. var
  388. temp: longint;
  389. asm
  390. sw $4,0($23)
  391. sw $5,-4($23)
  392. sw $6,-8($23)
  393. sw $7,-12($23)
  394. sw $8,-16($23)
  395. sw $9,-20($23)
  396. sw $10,-24($23)
  397. sw $11,-28($23)
  398. sw $12,-32($23)
  399. sw $13,-36($23)
  400. sw $14,-40($23)
  401. addiu $23,$23,-44
  402. move $2,$4
  403. move $4,$5
  404. move $5,$6
  405. move $6,$7
  406. move $7,$8
  407. # move $8,$9
  408. subu $29,32
  409. sw $9, 16($29)
  410. syscall
  411. nop
  412. addiu $29,32
  413. beq $7,$0,.LDone
  414. nop
  415. lui $8,%hi(fpc_threadvar_relocate_proc)
  416. addiu $8,%lo(fpc_threadvar_relocate_proc)
  417. lw $8,0($8)
  418. bne $8,$0,.LThreaded
  419. nop
  420. lui $4,%hi(Errno+4)
  421. addiu $4,%lo(Errno+4)
  422. sw $2,0($4)
  423. b .LFailed
  424. nop
  425. .LThreaded:
  426. sw $2,-4($fp)#temp#sw $4
  427. lui $4,%hi(errno)
  428. addiu $4,$4,%lo(errno)
  429. jal $8
  430. nop
  431. lw $8,-4($fp)
  432. sw $8,0($2)
  433. .LFailed:
  434. li $2,-1
  435. .LDone:
  436. addiu $23,$23,44
  437. lw $4,0($23)
  438. lw $5,-4($23)
  439. lw $6,-8($23)
  440. lw $7,-12($23)
  441. lw $8,-16($23)
  442. lw $9,-20($23)
  443. lw $10,-24($23)
  444. lw $11,-28($23)
  445. lw $12,-32($23)
  446. lw $13,-36($23)
  447. lw $14,-40($23)
  448. end;
  449. function FpSysCall(sysnr,param1,param2,param3,param4,param5,param6:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL6'];
  450. {
  451. This function puts the registers in place, does the call, and then
  452. copies back the registers as they are after the SysCall.
  453. }
  454. var
  455. temp: longint;
  456. asm
  457. sw $4,0($23)
  458. sw $5,-4($23)
  459. sw $6,-8($23)
  460. sw $7,-12($23)
  461. sw $8,-16($23)
  462. sw $9,-20($23)
  463. sw $10,-24($23)
  464. sw $11,-28($23)
  465. sw $12,-32($23)
  466. sw $13,-36($23)
  467. sw $14,-40($23)
  468. addiu $23,$23,-44
  469. move $2,$4
  470. move $4,$5
  471. move $5,$6
  472. move $6,$7
  473. move $7,$8
  474. move $8,$9
  475. lw $9,0($fp)
  476. subu $29,32
  477. sw $8, 16($29)
  478. sw $9, 20($29)
  479. syscall
  480. nop
  481. addiu $29,32
  482. beq $7,$0,.LDone
  483. nop
  484. lui $8,%hi(fpc_threadvar_relocate_proc)
  485. addiu $8,%lo(fpc_threadvar_relocate_proc)
  486. lw $8,0($8)
  487. bne $8,$0,.LThreaded
  488. nop
  489. lui $4,%hi(Errno+4)
  490. addiu $4,%lo(Errno+4)
  491. sw $2,0($4)
  492. b .LFailed
  493. nop
  494. .LThreaded:
  495. sw $2,-4($fp)#temp#sw $4
  496. lui $4,%hi(errno)
  497. addiu $4,$4,%lo(errno)
  498. jal $8
  499. nop
  500. lw $8,-4($fp)
  501. sw $8,0($2)
  502. .LFailed:
  503. li $2,-1
  504. .LDone:
  505. addiu $23,$23,44
  506. lw $4,0($23)
  507. lw $5,-4($23)
  508. lw $6,-8($23)
  509. lw $7,-12($23)
  510. lw $8,-16($23)
  511. lw $9,-20($23)
  512. lw $10,-24($23)
  513. lw $11,-28($23)
  514. lw $12,-32($23)
  515. lw $13,-36($23)
  516. lw $14,-40($23)
  517. end;