syscall.inc 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514
  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. while auxv^.a_type <> AT_NULL do
  50. begin
  51. if auxv^.a_type = AT_SYSINFO then begin
  52. psysinfo := auxv^.a_un.a_val;
  53. if psysinfo <> 0 then
  54. sysenter_supported := 1; // descision factor in asm syscall routines
  55. Break;
  56. end;
  57. Inc(auxv);
  58. end;
  59. end;
  60. {***********************SYSENTER CODE END******************************}
  61. Procedure fpc_geteipasebx;[external name 'fpc_geteipasebx'];
  62. {$ifdef FPC_PROFILE}
  63. procedure mcount; external name 'mcount';
  64. {$endif FPC_PROFILE}
  65. function FpSysCall(sysnr:TSysParam):TSysResult; assembler; register; [public,alias:'FPC_SYSCALL0'];
  66. { Var sysnr located in register eax }
  67. asm
  68. {$ifdef FPC_PROFILE}
  69. push %eax
  70. call mcount
  71. pop %eax
  72. {$endif FPC_PROFILE}
  73. push %ebx
  74. push %ecx
  75. {$ifdef FPC_PIC}
  76. call fpc_geteipasebx
  77. addl $_GLOBAL_OFFSET_TABLE_,%ebx
  78. movl sysenter_supported@GOT(%ebx),%ecx
  79. movl (%ecx),%ecx
  80. cmp $0, %ecx
  81. {$else FPC_PIC}
  82. cmp $0, sysenter_supported
  83. {$endif FPC_PIC}
  84. jne .LSysEnter
  85. int $0x80
  86. jmp .LTail
  87. .LSysEnter:
  88. {$ifdef FPC_PIC}
  89. movl psysinfo@GOT(%ebx),%ecx
  90. movl (%ecx),%ecx
  91. call *%ecx
  92. {$else FPC_PIC}
  93. call psysinfo
  94. {$endif FPC_PIC}
  95. .LTail:
  96. pop %ecx
  97. pop %ebx
  98. cmpl $-4095,%eax
  99. jb .LSyscOK
  100. negl %eax
  101. call seterrno
  102. movl $-1,%eax
  103. .LSyscOK:
  104. end;
  105. function FpSysCall(sysnr,param1 : TSysParam):TSysResult; assembler; register; [public,alias:'FPC_SYSCALL1'];
  106. { Var sysnr located in register eax
  107. Var param1 located in register edx }
  108. asm
  109. {$ifdef FPC_PROFILE}
  110. push %eax
  111. push %edx
  112. call mcount
  113. pop %edx
  114. pop %eax
  115. {$endif FPC_PROFILE}
  116. push %ebx
  117. push %ecx
  118. {$ifdef FPC_PIC}
  119. call fpc_geteipasebx
  120. addl $_GLOBAL_OFFSET_TABLE_,%ebx
  121. movl sysenter_supported@GOT(%ebx),%ecx
  122. movl (%ecx),%ecx
  123. cmp $0, %ecx
  124. {$else FPC_PIC}
  125. cmp $0, sysenter_supported
  126. {$endif FPC_PIC}
  127. jne .LSysEnter
  128. movl %edx,%ebx // param1
  129. int $0x80
  130. jmp .LTail
  131. .LSysEnter:
  132. {$ifdef FPC_PIC}
  133. movl psysinfo@GOT(%ebx),%ecx
  134. movl (%ecx),%ecx
  135. movl %edx,%ebx // param1
  136. call *%ecx
  137. {$else FPC_PIC}
  138. movl %edx,%ebx // param1
  139. call psysinfo
  140. {$endif FPC_PIC}
  141. .LTail:
  142. pop %ecx
  143. pop %ebx
  144. cmpl $-4095,%eax
  145. jb .LSyscOK
  146. negl %eax
  147. call seterrno
  148. movl $-1,%eax
  149. .LSyscOK:
  150. end;
  151. function FpSysCall(sysnr,param1,param2 : TSysParam):TSysResult; assembler; register; [public,alias:'FPC_SYSCALL2'];
  152. { Var sysnr located in register eax
  153. Var param1 located in register edx
  154. Var param2 located in register ecx }
  155. asm
  156. {$ifdef FPC_PROFILE}
  157. push %eax
  158. push %edx
  159. push %ecx
  160. call mcount
  161. pop %ecx
  162. pop %edx
  163. pop %eax
  164. {$endif FPC_PROFILE}
  165. push %ebx
  166. push %edx
  167. push %ecx
  168. {$ifdef FPC_PIC}
  169. call fpc_geteipasebx
  170. addl $_GLOBAL_OFFSET_TABLE_,%ebx
  171. movl sysenter_supported@GOT(%ebx),%ecx
  172. movl (%ecx),%ecx
  173. cmp $0, %ecx
  174. {$else FPC_PIC}
  175. cmp $0, sysenter_supported
  176. {$endif FPC_PIC}
  177. jne .LSysEnter
  178. movl %edx,%ebx // param1
  179. pop %ecx // param2
  180. int $0x80
  181. jmp .LTail
  182. .LSysEnter:
  183. {$ifdef FPC_PIC}
  184. movl psysinfo@GOT(%ebx),%ecx
  185. movl %edx,%ebx // param1
  186. movl (%ecx),%edx
  187. pop %ecx // param2
  188. call *%edx
  189. {$else FPC_PIC}
  190. movl %edx,%ebx // param1
  191. pop %ecx // param2
  192. call psysinfo
  193. {$endif FPC_PIC}
  194. .LTail:
  195. pop %edx
  196. pop %ebx
  197. cmpl $-4095,%eax
  198. jb .LSyscOK
  199. negl %eax
  200. call seterrno
  201. movl $-1,%eax
  202. .LSyscOK:
  203. end;
  204. function FpSysCall(sysnr,param1,param2,param3:TSysParam):TSysResult; assembler; register; [public,alias:'FPC_SYSCALL3'];
  205. { Var sysnr located in register eax
  206. Var param1 located in register edx
  207. Var param2 located in register ecx
  208. Var param3 located at ebp+20 }
  209. var
  210. _psysinfo: LongWord;
  211. asm
  212. {$ifdef FPC_PROFILE}
  213. push %eax
  214. push %edx
  215. push %ecx
  216. call mcount
  217. pop %ecx
  218. pop %edx
  219. pop %eax
  220. {$endif FPC_PROFILE}
  221. push %ebx
  222. push %edx
  223. push %ecx
  224. {$ifdef FPC_PIC}
  225. call fpc_geteipasebx
  226. addl $_GLOBAL_OFFSET_TABLE_,%ebx
  227. movl sysenter_supported@GOT(%ebx),%ecx
  228. movl (%ecx),%ecx
  229. cmp $0, %ecx
  230. {$else FPC_PIC}
  231. cmp $0, sysenter_supported
  232. {$endif FPC_PIC}
  233. jne .LSysEnter
  234. movl %edx,%ebx // param1
  235. pop %ecx // param2
  236. movl param3,%edx // param3
  237. int $0x80
  238. jmp .LTail
  239. .LSysEnter:
  240. {$ifdef FPC_PIC}
  241. movl psysinfo@GOT(%ebx),%ecx
  242. movl (%ecx),%ecx
  243. movl %ecx,_psysinfo
  244. movl %edx,%ebx // param1
  245. pop %ecx // param2
  246. movl param3,%edx // param3
  247. call _psysinfo
  248. {$else FPC_PIC}
  249. movl %edx,%ebx // param1
  250. pop %ecx // param2
  251. movl param3,%edx // param3
  252. call psysinfo
  253. {$endif FPC_PIC}
  254. .LTail:
  255. pop %edx
  256. pop %ebx
  257. cmpl $-4095,%eax
  258. jb .LSyscOK
  259. negl %eax
  260. call seterrno
  261. movl $-1,%eax
  262. .LSyscOK:
  263. end;
  264. function FpSysCall(sysnr,param1,param2,param3,param4:TSysParam):TSysResult; assembler; register; [public,alias:'FPC_SYSCALL4'];
  265. { Var sysnr located in register eax
  266. Var param1 located in register edx
  267. Var param2 located in register ecx
  268. Var param3 located at ebp+20
  269. Var param4 located at ebp+16 }
  270. var
  271. _psysinfo: LongWord;
  272. asm
  273. {$ifdef FPC_PROFILE}
  274. push %eax
  275. push %edx
  276. push %ecx
  277. call mcount
  278. pop %ecx
  279. pop %edx
  280. pop %eax
  281. {$endif FPC_PROFILE}
  282. push %ebx
  283. push %esi
  284. push %ecx
  285. {$ifdef FPC_PIC}
  286. call fpc_geteipasebx
  287. addl $_GLOBAL_OFFSET_TABLE_,%ebx
  288. movl sysenter_supported@GOT(%ebx),%ecx
  289. movl (%ecx),%ecx
  290. cmp $0, %ecx
  291. {$else FPC_PIC}
  292. cmp $0, sysenter_supported
  293. {$endif FPC_PIC}
  294. jne .LSysEnter
  295. movl %edx,%ebx // param1
  296. pop %ecx // param2
  297. movl param3,%edx // param3
  298. movl param4,%esi // param4
  299. int $0x80
  300. jmp .LTail
  301. .LSysEnter:
  302. {$ifdef FPC_PIC}
  303. movl psysinfo@GOT(%ebx),%ecx
  304. movl (%ecx),%ecx
  305. movl %ecx,_psysinfo
  306. movl %edx,%ebx // param1
  307. pop %ecx // param2
  308. movl param3,%edx // param3
  309. movl param4,%esi // param4
  310. call _psysinfo
  311. {$else FPC_PIC}
  312. movl %edx,%ebx // param1
  313. pop %ecx // param2
  314. movl param3,%edx // param3
  315. movl param4,%esi // param4
  316. call psysinfo
  317. {$endif FPC_PIC}
  318. .LTail:
  319. pop %esi
  320. pop %ebx
  321. cmpl $-4095,%eax
  322. jb .LSyscOK
  323. negl %eax
  324. call seterrno
  325. movl $-1,%eax
  326. .LSyscOK:
  327. end;
  328. function FpSysCall(sysnr,param1,param2,param3,param4,param5 : TSysParam):TSysResult; assembler; register; [public,alias:'FPC_SYSCALL5'];
  329. { Var sysnr located in register eax
  330. Var param1 located in register edx
  331. Var param2 located in register ecx
  332. Var param3 located at ebp+20
  333. Var param4 located at ebp+16
  334. Var param5 located at ebp+12 }
  335. var
  336. _psysinfo: LongWord;
  337. asm
  338. {$ifdef FPC_PROFILE}
  339. push %eax
  340. push %edx
  341. push %ecx
  342. call mcount
  343. pop %ecx
  344. pop %edx
  345. pop %eax
  346. {$endif FPC_PROFILE}
  347. push %ebx
  348. push %edx
  349. push %esi
  350. push %edi
  351. push %ecx
  352. {$ifdef FPC_PIC}
  353. call fpc_geteipasebx
  354. addl $_GLOBAL_OFFSET_TABLE_,%ebx
  355. movl sysenter_supported@GOT(%ebx),%ecx
  356. movl (%ecx),%ecx
  357. cmp $0, %ecx
  358. {$else FPC_PIC}
  359. cmp $0, sysenter_supported
  360. {$endif FPC_PIC}
  361. jne .LSysEnter
  362. movl %edx,%ebx // param1
  363. pop %ecx // param2
  364. movl param3,%edx // param3
  365. movl param4,%esi // param4
  366. movl param5,%edi // param5
  367. int $0x80
  368. jmp .LTail
  369. .LSysEnter:
  370. {$ifdef FPC_PIC}
  371. movl psysinfo@GOT(%ebx),%ecx
  372. movl (%ecx),%ecx
  373. movl %ecx,_psysinfo
  374. movl %edx,%ebx // param1
  375. pop %ecx // param2
  376. movl param3,%edx // param3
  377. movl param4,%esi // param4
  378. movl param5,%edi // param5
  379. call _psysinfo
  380. {$else FPC_PIC}
  381. movl %edx,%ebx // param1
  382. pop %ecx // param2
  383. movl param3,%edx // param3
  384. movl param4,%esi // param4
  385. movl param5,%edi // param5
  386. call psysinfo
  387. {$endif FPC_PIC}
  388. .LTail:
  389. pop %edi
  390. pop %esi
  391. pop %edx
  392. pop %ebx
  393. cmpl $-4095,%eax
  394. jb .LSyscOK
  395. negl %eax
  396. call seterrno
  397. movl $-1,%eax
  398. .LSyscOK:
  399. end;
  400. function FpSysCall(sysnr,param1,param2,param3,param4,param5,param6: TSysParam):TSysResult; assembler; register; [public,alias:'FPC_SYSCALL6'];
  401. { Var sysnr located in register eax
  402. Var param1 located in register edx
  403. Var param2 located in register ecx
  404. Var param3 located at ebp+20
  405. Var param4 located at ebp+16
  406. Var param5 located at ebp+12
  407. Var param6 located at ebp+8 }
  408. var
  409. _psysinfo: LongWord;
  410. asm
  411. {$ifdef FPC_PROFILE}
  412. push %eax
  413. push %edx
  414. push %ecx
  415. call mcount
  416. pop %ecx
  417. pop %edx
  418. pop %eax
  419. {$endif FPC_PROFILE}
  420. push %ebx
  421. push %edx
  422. push %esi
  423. push %edi
  424. push %ebp
  425. push %ecx
  426. {$ifdef FPC_PIC}
  427. call fpc_geteipasebx
  428. addl $_GLOBAL_OFFSET_TABLE_,%ebx
  429. movl sysenter_supported@GOT(%ebx),%ecx
  430. movl (%ecx),%ecx
  431. cmp $0, %ecx
  432. {$else FPC_PIC}
  433. cmp $0, sysenter_supported
  434. {$endif FPC_PIC}
  435. jne .LSysEnter
  436. movl %edx,%ebx // param1
  437. pop %ecx // param2
  438. movl param3,%edx // param3
  439. movl param4,%esi // param4
  440. movl param5,%edi // param5
  441. movl param6,%ebp // param6
  442. int $0x80
  443. jmp .LTail
  444. .LSysEnter:
  445. {$ifdef FPC_PIC}
  446. movl psysinfo@GOT(%ebx),%ecx
  447. movl (%ecx),%ecx
  448. movl %ecx,_psysinfo
  449. movl %edx,%ebx // param1
  450. pop %ecx // param2
  451. movl param3,%edx // param3
  452. movl param4,%esi // param4
  453. movl param5,%edi // param5
  454. // push address of psysinfo, since ebp will be rewritten below
  455. // and ebp based access to local vars will be unavailable after that
  456. push _psysinfo
  457. movl param6,%ebp // param6
  458. call (%esp)
  459. addl $4,%esp // adjust esp
  460. {$else FPC_PIC}
  461. movl %edx,%ebx // param1
  462. pop %ecx // param2
  463. movl param3,%edx // param3
  464. movl param4,%esi // param4
  465. movl param5,%edi // param5
  466. movl param6,%ebp // param6
  467. call psysinfo
  468. {$endif FPC_PIC}
  469. .LTail:
  470. pop %ebp
  471. pop %edi
  472. pop %esi
  473. pop %edx
  474. pop %ebx
  475. cmpl $-4095,%eax
  476. jb .LSyscOK
  477. negl %eax
  478. call seterrno
  479. movl $-1,%eax
  480. .LSyscOK:
  481. end;
  482. {No debugging for syslinux include !}
  483. {$IFDEF SYS_LINUX}
  484. {$UNDEF SYSCALL_DEBUG}
  485. {$ENDIF SYS_LINUX}