syscall.inc 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  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 stil 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. movl sysnr,%eax
  222. movl param1,%ebx
  223. movl param2,%ecx
  224. movl param3,%edx
  225. movl param4,%esi
  226. movl param5,%edi
  227. int $0x80
  228. cmpl $-4095,%eax
  229. jb .LSyscOK
  230. negl %eax
  231. {$ifdef FPC_PIC}
  232. call fpc_geteipasebx
  233. addl $_GLOBAL_OFFSET_TABLE_,%ebx
  234. movl fpc_threadvar_relocate_proc@GOT(%ebx),%ecx
  235. movl (%ecx),%ecx
  236. movl Errno@GOT(%ebx),%edi
  237. {$else FPC_PIC}
  238. leal Errno,%edi
  239. movl fpc_threadvar_relocate_proc,%ecx
  240. {$endif FPC_PIC}
  241. testl %ecx,%ecx
  242. jne .LThread
  243. movl %eax,4(%edi)
  244. jmp .LNoThread
  245. .LThread:
  246. movl %eax,%ebx
  247. movl (%edi),%eax
  248. call *%ecx
  249. movl %ebx,(%eax)
  250. .LNoThread:
  251. movl $-1,%eax
  252. .LSyscOK:
  253. end;
  254. {$endif notsupported}
  255. {No debugging for syslinux include !}
  256. {$IFDEF SYS_LINUX}
  257. {$UNDEF SYSCALL_DEBUG}
  258. {$ENDIF SYS_LINUX}