syscall.inc 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  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. Procedure fpc_geteipasebx;[external name 'fpc_geteipasebx'];
  15. function FpSysCall(sysnr:TSysParam):TSysResult; assembler; oldfpccall;[public,alias:'FPC_SYSCALL0'];
  16. asm
  17. { load the registers... }
  18. movl sysnr,%eax
  19. int $0x80
  20. cmpl $-4095,%eax
  21. jb .LSyscOK
  22. negl %eax
  23. {$ifdef FPC_PIC}
  24. call fpc_geteipasebx
  25. addl $_GLOBAL_OFFSET_TABLE_,%ebx
  26. movl fpc_threadvar_relocate_proc@GOT(%ebx),%ecx
  27. movl (%ecx),%ecx
  28. movl Errno@GOT(%ebx),%edi
  29. {$else FPC_PIC}
  30. leal Errno,%edi
  31. movl fpc_threadvar_relocate_proc,%ecx
  32. {$endif FPC_PIC}
  33. testl %ecx,%ecx
  34. jne .LThread
  35. movl %eax,4(%edi)
  36. jmp .LNoThread
  37. .LThread:
  38. movl %eax,%ebx
  39. movl (%edi),%eax
  40. call *%ecx
  41. movl %ebx,(%eax)
  42. .LNoThread:
  43. movl $-1,%eax
  44. .LSyscOK:
  45. end;
  46. function FpSysCall(sysnr,param1 : TSysParam):TSysResult; assembler; oldfpccall;[public,alias:'FPC_SYSCALL1'];
  47. asm
  48. { load the registers... }
  49. movl sysnr,%eax
  50. movl param1,%ebx
  51. int $0x80
  52. cmpl $-4095,%eax
  53. jb .LSyscOK
  54. negl %eax
  55. {$ifdef FPC_PIC}
  56. call fpc_geteipasebx
  57. addl $_GLOBAL_OFFSET_TABLE_,%ebx
  58. movl fpc_threadvar_relocate_proc@GOT(%ebx),%ecx
  59. movl (%ecx),%ecx
  60. movl Errno@GOT(%ebx),%edi
  61. {$else FPC_PIC}
  62. leal Errno,%edi
  63. movl fpc_threadvar_relocate_proc,%ecx
  64. {$endif FPC_PIC}
  65. testl %ecx,%ecx
  66. jne .LThread
  67. movl %eax,4(%edi)
  68. jmp .LNoThread
  69. .LThread:
  70. movl %eax,%ebx
  71. movl (%edi),%eax
  72. call *%ecx
  73. movl %ebx,(%eax)
  74. .LNoThread:
  75. movl $-1,%eax
  76. .LSyscOK:
  77. end;
  78. function FpSysCall(sysnr,param1,param2 : TSysParam):TSysResult; assembler; oldfpccall; [public,alias:'FPC_SYSCALL2'];
  79. asm
  80. { load the registers... }
  81. movl sysnr,%eax
  82. movl param1,%ebx
  83. movl param2,%ecx
  84. int $0x80
  85. cmpl $-4095,%eax
  86. jb .LSyscOK
  87. negl %eax
  88. {$ifdef FPC_PIC}
  89. call fpc_geteipasebx
  90. addl $_GLOBAL_OFFSET_TABLE_,%ebx
  91. movl fpc_threadvar_relocate_proc@GOT(%ebx),%ecx
  92. movl (%ecx),%ecx
  93. movl Errno@GOT(%ebx),%edi
  94. {$else FPC_PIC}
  95. leal Errno,%edi
  96. movl fpc_threadvar_relocate_proc,%ecx
  97. {$endif FPC_PIC}
  98. testl %ecx,%ecx
  99. jne .LThread
  100. movl %eax,4(%edi)
  101. jmp .LNoThread
  102. .LThread:
  103. movl %eax,%ebx
  104. movl (%edi),%eax
  105. call *%ecx
  106. movl %ebx,(%eax)
  107. .LNoThread:
  108. movl $-1,%eax
  109. .LSyscOK:
  110. end;
  111. function FpSysCall(sysnr,param1,param2,param3:TSysParam):TSysResult; assembler; oldfpccall; [public,alias:'FPC_SYSCALL3'];
  112. asm
  113. { load the registers... }
  114. movl sysnr,%eax
  115. movl param1,%ebx
  116. movl param2,%ecx
  117. movl param3,%edx
  118. int $0x80
  119. cmpl $-4095,%eax
  120. jb .LSyscOK
  121. negl %eax
  122. {$ifdef FPC_PIC}
  123. call fpc_geteipasebx
  124. addl $_GLOBAL_OFFSET_TABLE_,%ebx
  125. movl fpc_threadvar_relocate_proc@GOT(%ebx),%ecx
  126. movl (%ecx),%ecx
  127. movl Errno@GOT(%ebx),%edi
  128. {$else FPC_PIC}
  129. leal Errno,%edi
  130. movl fpc_threadvar_relocate_proc,%ecx
  131. {$endif FPC_PIC}
  132. testl %ecx,%ecx
  133. jne .LThread
  134. movl %eax,4(%edi)
  135. jmp .LNoThread
  136. .LThread:
  137. movl %eax,%ebx
  138. movl (%edi),%eax
  139. call *%ecx
  140. movl %ebx,(%eax)
  141. .LNoThread:
  142. movl $-1,%eax
  143. .LSyscOK:
  144. end;
  145. function FpSysCall(sysnr,param1,param2,param3,param4:TSysParam):TSysResult; assembler; oldfpccall; [public,alias:'FPC_SYSCALL4'];
  146. asm
  147. { load the registers... }
  148. movl sysnr,%eax
  149. movl param1,%ebx
  150. movl param2,%ecx
  151. movl param3,%edx
  152. movl param4,%esi
  153. int $0x80
  154. cmpl $-4095,%eax
  155. jb .LSyscOK
  156. negl %eax
  157. {$ifdef FPC_PIC}
  158. call fpc_geteipasebx
  159. addl $_GLOBAL_OFFSET_TABLE_,%ebx
  160. movl fpc_threadvar_relocate_proc@GOT(%ebx),%ecx
  161. movl (%ecx),%ecx
  162. movl Errno@GOT(%ebx),%edi
  163. {$else FPC_PIC}
  164. leal Errno,%edi
  165. movl fpc_threadvar_relocate_proc,%ecx
  166. {$endif FPC_PIC}
  167. testl %ecx,%ecx
  168. jne .LThread
  169. movl %eax,4(%edi)
  170. jmp .LNoThread
  171. .LThread:
  172. movl %eax,%ebx
  173. movl (%edi),%eax
  174. call *%ecx
  175. movl %ebx,(%eax)
  176. .LNoThread:
  177. movl $-1,%eax
  178. .LSyscOK:
  179. end;
  180. function FpSysCall(sysnr,param1,param2,param3,param4,param5 : TSysParam):TSysResult; assembler; oldfpccall;[public,alias:'FPC_SYSCALL5'];
  181. asm
  182. { load the registers... }
  183. movl sysnr,%eax
  184. movl param1,%ebx
  185. movl param2,%ecx
  186. movl param3,%edx
  187. movl param4,%esi
  188. movl param5,%edi
  189. int $0x80
  190. cmpl $-4095,%eax
  191. jb .LSyscOK
  192. negl %eax
  193. {$ifdef FPC_PIC}
  194. call fpc_geteipasebx
  195. addl $_GLOBAL_OFFSET_TABLE_,%ebx
  196. movl fpc_threadvar_relocate_proc@GOT(%ebx),%ecx
  197. movl (%ecx),%ecx
  198. movl Errno@GOT(%ebx),%edi
  199. {$else FPC_PIC}
  200. leal Errno,%edi
  201. movl fpc_threadvar_relocate_proc,%ecx
  202. {$endif FPC_PIC}
  203. testl %ecx,%ecx
  204. jne .LThread
  205. movl %eax,4(%edi)
  206. jmp .LNoThread
  207. .LThread:
  208. movl %eax,%ebx
  209. movl (%edi),%eax
  210. call *%ecx
  211. movl %ebx,(%eax)
  212. .LNoThread:
  213. movl $-1,%eax
  214. .LSyscOK:
  215. end;
  216. {.$ifdef notsupported}
  217. { Only 5 params are pushed, so it'll not work as expected (PFV) }
  218. function FpSysCall(sysnr,param1,param2,param3,param4,param5,param6 : TSysParam):TSysResult; assembler; oldfpccall;[public,alias:'FPC_SYSCALL6'];
  219. asm
  220. { load the registers... }
  221. push %ebp
  222. movl sysnr,%eax
  223. movl param1,%ebx
  224. movl param2,%ecx
  225. movl param3,%edx
  226. movl param4,%esi
  227. movl param5,%edi
  228. movl param6,%ebp
  229. int $0x80
  230. pop %ebp
  231. cmpl $-4095,%eax
  232. jb .LSyscOK
  233. negl %eax
  234. {$ifdef FPC_PIC}
  235. call fpc_geteipasebx
  236. addl $_GLOBAL_OFFSET_TABLE_,%ebx
  237. movl fpc_threadvar_relocate_proc@GOT(%ebx),%ecx
  238. movl (%ecx),%ecx
  239. movl Errno@GOT(%ebx),%edi
  240. {$else FPC_PIC}
  241. leal Errno,%edi
  242. movl fpc_threadvar_relocate_proc,%ecx
  243. {$endif FPC_PIC}
  244. testl %ecx,%ecx
  245. jne .LThread
  246. movl %eax,4(%edi)
  247. jmp .LNoThread
  248. .LThread:
  249. movl %eax,%ebx
  250. movl (%edi),%eax
  251. call *%ecx
  252. movl %ebx,(%eax)
  253. .LNoThread:
  254. movl $-1,%eax
  255. .LSyscOK:
  256. end;
  257. {.$endif notsupported}
  258. {No debugging for syslinux include !}
  259. {$IFDEF SYS_LINUX}
  260. {$UNDEF SYSCALL_DEBUG}
  261. {$ENDIF SYS_LINUX}