syscall.inc 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448
  1. {
  2. This file is part of the Free Pascal run time library.
  3. Copyright (c) 1999-2000 by Michael Van Canneyt,
  4. member of the Free Pascal development team.
  5. The syscalls for the new RTL, moved to platform dependant dir.
  6. Old linux calling convention is still kept.
  7. See the file COPYING.FPC, included in this distribution,
  8. for details about the copyright.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  12. **********************************************************************}
  13. {$ASMMODE ATT}
  14. {*************************SYSENTER CODE********************************}
  15. { included by system.pp in linux rtl }
  16. const
  17. AT_NULL = 0;
  18. {* Pointer to the global system page used for system calls and other
  19. nice things. *}
  20. AT_SYSINFO = 32;
  21. AT_SYSINFO_EHDR = 33;
  22. type
  23. TAuxiliaryValue = cuInt32;
  24. TInternalUnion = record
  25. a_val: cuint32; //* Integer value */
  26. {* We use to have pointer elements added here. We cannot do that,
  27. though, since it does not work when using 32-bit definitions
  28. on 64-bit platforms and vice versa. *}
  29. end;
  30. Elf32_auxv_t = record
  31. a_type: cuint32; //* Entry type */
  32. a_un: TInternalUnion;
  33. end;
  34. TElf32AuxiliaryVector = Elf32_auxv_t;
  35. PElf32AuxiliaryVector = ^TElf32AuxiliaryVector;
  36. var
  37. psysinfo: LongWord = 0;
  38. procedure InitSyscallIntf;
  39. var
  40. ep: PPChar;
  41. auxv: PElf32AuxiliaryVector;
  42. begin
  43. psysinfo := 0;
  44. ep := envp;
  45. while ep^ <> nil do
  46. Inc(ep);
  47. Inc(ep);
  48. auxv := PElf32AuxiliaryVector(ep);
  49. repeat
  50. if auxv^.a_type = AT_SYSINFO then begin
  51. psysinfo := auxv^.a_un.a_val;
  52. if psysinfo <> 0 then
  53. sysenter_supported := 1; // descision factor in asm syscall routines
  54. Break;
  55. end;
  56. Inc(auxv);
  57. until auxv^.a_type = AT_NULL;
  58. end;
  59. {***********************SYSENTER CODE END******************************}
  60. Procedure fpc_geteipasebx;[external name 'fpc_geteipasebx'];
  61. function FpSysCall(sysnr:TSysParam):TSysResult; assembler; register; [public,alias:'FPC_SYSCALL0'];
  62. { Var sysnr located in register eax }
  63. asm
  64. push %ebx
  65. push %ecx
  66. {$ifdef FPC_PIC}
  67. call fpc_geteipasebx
  68. addl $_GLOBAL_OFFSET_TABLE_,%ebx
  69. movl sysenter_supported@GOT(%ebx),%ecx
  70. movl (%ecx),%ecx
  71. cmp $0, %ecx
  72. {$else FPC_PIC}
  73. cmp $0, sysenter_supported
  74. {$endif FPC_PIC}
  75. jne .LSysEnter
  76. int $0x80
  77. jmp .LTail
  78. .LSysEnter:
  79. {$ifdef FPC_PIC}
  80. movl psysinfo@GOT(%ebx),%ecx
  81. movl (%ecx),%ecx
  82. call *%ecx
  83. {$else FPC_PIC}
  84. call psysinfo
  85. {$endif FPC_PIC}
  86. .LTail:
  87. pop %ecx
  88. pop %ebx
  89. cmpl $-4095,%eax
  90. jb .LSyscOK
  91. negl %eax
  92. call seterrno
  93. movl $-1,%eax
  94. .LSyscOK:
  95. end;
  96. function FpSysCall(sysnr,param1 : TSysParam):TSysResult; assembler; register; [public,alias:'FPC_SYSCALL1'];
  97. { Var sysnr located in register eax
  98. Var param1 located in register edx }
  99. asm
  100. push %ebx
  101. push %ecx
  102. {$ifdef FPC_PIC}
  103. call fpc_geteipasebx
  104. addl $_GLOBAL_OFFSET_TABLE_,%ebx
  105. movl sysenter_supported@GOT(%ebx),%ecx
  106. movl (%ecx),%ecx
  107. cmp $0, %ecx
  108. {$else FPC_PIC}
  109. cmp $0, sysenter_supported
  110. {$endif FPC_PIC}
  111. jne .LSysEnter
  112. movl %edx,%ebx // param1
  113. int $0x80
  114. jmp .LTail
  115. .LSysEnter:
  116. {$ifdef FPC_PIC}
  117. movl psysinfo@GOT(%ebx),%ecx
  118. movl (%ecx),%ecx
  119. movl %edx,%ebx // param1
  120. call *%ecx
  121. {$else FPC_PIC}
  122. movl %edx,%ebx // param1
  123. call psysinfo
  124. {$endif FPC_PIC}
  125. .LTail:
  126. pop %ecx
  127. pop %ebx
  128. cmpl $-4095,%eax
  129. jb .LSyscOK
  130. negl %eax
  131. call seterrno
  132. movl $-1,%eax
  133. .LSyscOK:
  134. end;
  135. function FpSysCall(sysnr,param1,param2 : TSysParam):TSysResult; assembler; register; [public,alias:'FPC_SYSCALL2'];
  136. { Var sysnr located in register eax
  137. Var param1 located in register edx
  138. Var param2 located in register ecx }
  139. asm
  140. push %ebx
  141. push %edx
  142. push %ecx
  143. {$ifdef FPC_PIC}
  144. call fpc_geteipasebx
  145. addl $_GLOBAL_OFFSET_TABLE_,%ebx
  146. movl sysenter_supported@GOT(%ebx),%ecx
  147. movl (%ecx),%ecx
  148. cmp $0, %ecx
  149. {$else FPC_PIC}
  150. cmp $0, sysenter_supported
  151. {$endif FPC_PIC}
  152. jne .LSysEnter
  153. movl %edx,%ebx // param1
  154. pop %ecx // param2
  155. int $0x80
  156. jmp .LTail
  157. .LSysEnter:
  158. {$ifdef FPC_PIC}
  159. movl psysinfo@GOT(%ebx),%ecx
  160. movl %edx,%ebx // param1
  161. movl (%ecx),%edx
  162. pop %ecx // param2
  163. call *%edx
  164. {$else FPC_PIC}
  165. movl %edx,%ebx // param1
  166. pop %ecx // param2
  167. call psysinfo
  168. {$endif FPC_PIC}
  169. .LTail:
  170. pop %edx
  171. pop %ebx
  172. cmpl $-4095,%eax
  173. jb .LSyscOK
  174. negl %eax
  175. call seterrno
  176. movl $-1,%eax
  177. .LSyscOK:
  178. end;
  179. function FpSysCall(sysnr,param1,param2,param3:TSysParam):TSysResult; assembler; register; [public,alias:'FPC_SYSCALL3'];
  180. { Var sysnr located in register eax
  181. Var param1 located in register edx
  182. Var param2 located in register ecx
  183. Var param3 located at ebp+20 }
  184. var
  185. _psysinfo: LongWord;
  186. asm
  187. push %ebx
  188. push %edx
  189. push %ecx
  190. {$ifdef FPC_PIC}
  191. call fpc_geteipasebx
  192. addl $_GLOBAL_OFFSET_TABLE_,%ebx
  193. movl sysenter_supported@GOT(%ebx),%ecx
  194. movl (%ecx),%ecx
  195. cmp $0, %ecx
  196. {$else FPC_PIC}
  197. cmp $0, sysenter_supported
  198. {$endif FPC_PIC}
  199. jne .LSysEnter
  200. movl %edx,%ebx // param1
  201. pop %ecx // param2
  202. movl param3,%edx // param3
  203. int $0x80
  204. jmp .LTail
  205. .LSysEnter:
  206. {$ifdef FPC_PIC}
  207. movl psysinfo@GOT(%ebx),%ecx
  208. movl (%ecx),%ecx
  209. movl %ecx,_psysinfo
  210. movl %edx,%ebx // param1
  211. pop %ecx // param2
  212. movl param3,%edx // param3
  213. call _psysinfo
  214. {$else FPC_PIC}
  215. movl %edx,%ebx // param1
  216. pop %ecx // param2
  217. movl param3,%edx // param3
  218. call psysinfo
  219. {$endif FPC_PIC}
  220. .LTail:
  221. pop %edx
  222. pop %ebx
  223. cmpl $-4095,%eax
  224. jb .LSyscOK
  225. negl %eax
  226. call seterrno
  227. movl $-1,%eax
  228. .LSyscOK:
  229. end;
  230. function FpSysCall(sysnr,param1,param2,param3,param4:TSysParam):TSysResult; assembler; register; [public,alias:'FPC_SYSCALL4'];
  231. { Var sysnr located in register eax
  232. Var param1 located in register edx
  233. Var param2 located in register ecx
  234. Var param3 located at ebp+20
  235. Var param4 located at ebp+16 }
  236. var
  237. _psysinfo: LongWord;
  238. asm
  239. push %ebx
  240. push %esi
  241. push %ecx
  242. {$ifdef FPC_PIC}
  243. call fpc_geteipasebx
  244. addl $_GLOBAL_OFFSET_TABLE_,%ebx
  245. movl sysenter_supported@GOT(%ebx),%ecx
  246. movl (%ecx),%ecx
  247. cmp $0, %ecx
  248. {$else FPC_PIC}
  249. cmp $0, sysenter_supported
  250. {$endif FPC_PIC}
  251. jne .LSysEnter
  252. movl %edx,%ebx // param1
  253. pop %ecx // param2
  254. movl param3,%edx // param3
  255. movl param4,%esi // param4
  256. int $0x80
  257. jmp .LTail
  258. .LSysEnter:
  259. {$ifdef FPC_PIC}
  260. movl psysinfo@GOT(%ebx),%ecx
  261. movl (%ecx),%ecx
  262. movl %ecx,_psysinfo
  263. movl %edx,%ebx // param1
  264. pop %ecx // param2
  265. movl param3,%edx // param3
  266. movl param4,%esi // param4
  267. call _psysinfo
  268. {$else FPC_PIC}
  269. movl %edx,%ebx // param1
  270. pop %ecx // param2
  271. movl param3,%edx // param3
  272. movl param4,%esi // param4
  273. call psysinfo
  274. {$endif FPC_PIC}
  275. .LTail:
  276. pop %esi
  277. pop %ebx
  278. cmpl $-4095,%eax
  279. jb .LSyscOK
  280. negl %eax
  281. call seterrno
  282. movl $-1,%eax
  283. .LSyscOK:
  284. end;
  285. function FpSysCall(sysnr,param1,param2,param3,param4,param5 : TSysParam):TSysResult; assembler; register; [public,alias:'FPC_SYSCALL5'];
  286. { Var sysnr located in register eax
  287. Var param1 located in register edx
  288. Var param2 located in register ecx
  289. Var param3 located at ebp+20
  290. Var param4 located at ebp+16
  291. Var param5 located at ebp+12 }
  292. var
  293. _psysinfo: LongWord;
  294. asm
  295. push %ebx
  296. push %edx
  297. push %esi
  298. push %edi
  299. push %ecx
  300. {$ifdef FPC_PIC}
  301. call fpc_geteipasebx
  302. addl $_GLOBAL_OFFSET_TABLE_,%ebx
  303. movl sysenter_supported@GOT(%ebx),%ecx
  304. movl (%ecx),%ecx
  305. cmp $0, %ecx
  306. {$else FPC_PIC}
  307. cmp $0, sysenter_supported
  308. {$endif FPC_PIC}
  309. jne .LSysEnter
  310. movl %edx,%ebx // param1
  311. pop %ecx // param2
  312. movl param3,%edx // param3
  313. movl param4,%esi // param4
  314. movl param5,%edi // param5
  315. int $0x80
  316. jmp .LTail
  317. .LSysEnter:
  318. {$ifdef FPC_PIC}
  319. movl psysinfo@GOT(%ebx),%ecx
  320. movl (%ecx),%ecx
  321. movl %ecx,_psysinfo
  322. movl %edx,%ebx // param1
  323. pop %ecx // param2
  324. movl param3,%edx // param3
  325. movl param4,%esi // param4
  326. movl param5,%edi // param5
  327. call _psysinfo
  328. {$else FPC_PIC}
  329. movl %edx,%ebx // param1
  330. pop %ecx // param2
  331. movl param3,%edx // param3
  332. movl param4,%esi // param4
  333. movl param5,%edi // param5
  334. call psysinfo
  335. {$endif FPC_PIC}
  336. .LTail:
  337. pop %edi
  338. pop %esi
  339. pop %edx
  340. pop %ebx
  341. cmpl $-4095,%eax
  342. jb .LSyscOK
  343. negl %eax
  344. call seterrno
  345. movl $-1,%eax
  346. .LSyscOK:
  347. end;
  348. function FpSysCall(sysnr,param1,param2,param3,param4,param5,param6: TSysParam):TSysResult; assembler; register; [public,alias:'FPC_SYSCALL6'];
  349. { Var sysnr located in register eax
  350. Var param1 located in register edx
  351. Var param2 located in register ecx
  352. Var param3 located at ebp+20
  353. Var param4 located at ebp+16
  354. Var param5 located at ebp+12
  355. Var param6 located at ebp+8 }
  356. var
  357. _psysinfo: LongWord;
  358. asm
  359. push %ebx
  360. push %edx
  361. push %esi
  362. push %edi
  363. push %ebp
  364. push %ecx
  365. {$ifdef FPC_PIC}
  366. call fpc_geteipasebx
  367. addl $_GLOBAL_OFFSET_TABLE_,%ebx
  368. movl sysenter_supported@GOT(%ebx),%ecx
  369. movl (%ecx),%ecx
  370. cmp $0, %ecx
  371. {$else FPC_PIC}
  372. cmp $0, sysenter_supported
  373. {$endif FPC_PIC}
  374. jne .LSysEnter
  375. movl %edx,%ebx // param1
  376. pop %ecx // param2
  377. movl param3,%edx // param3
  378. movl param4,%esi // param4
  379. movl param5,%edi // param5
  380. movl param6,%ebp // param6
  381. int $0x80
  382. jmp .LTail
  383. .LSysEnter:
  384. {$ifdef FPC_PIC}
  385. movl psysinfo@GOT(%ebx),%ecx
  386. movl (%ecx),%ecx
  387. movl %ecx,_psysinfo
  388. movl %edx,%ebx // param1
  389. pop %ecx // param2
  390. movl param3,%edx // param3
  391. movl param4,%esi // param4
  392. movl param5,%edi // param5
  393. movl param6,%ebp // param6
  394. call _psysinfo
  395. {$else FPC_PIC}
  396. movl %edx,%ebx // param1
  397. pop %ecx // param2
  398. movl param3,%edx // param3
  399. movl param4,%esi // param4
  400. movl param5,%edi // param5
  401. movl param6,%ebp // param6
  402. call psysinfo
  403. {$endif FPC_PIC}
  404. .LTail:
  405. pop %ebp
  406. pop %edi
  407. pop %esi
  408. pop %edx
  409. pop %ebx
  410. cmpl $-4095,%eax
  411. jb .LSyscOK
  412. negl %eax
  413. call seterrno
  414. movl $-1,%eax
  415. .LSyscOK:
  416. end;
  417. {No debugging for syslinux include !}
  418. {$IFDEF SYS_LINUX}
  419. {$UNDEF SYSCALL_DEBUG}
  420. {$ENDIF SYS_LINUX}