syscall.inc 13 KB

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