syscall.inc 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. {
  2. Copyright (c) 2002 by Marco van de Voort
  3. Syscall functions for i386 *BSD.
  4. This program is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published by
  6. the Free Software Foundation; either version 2 of the License, or
  7. (at your option) any later version.
  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. See the
  11. GNU General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with this program; if not, write to the Free Software
  14. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  15. ****************************************************************************
  16. These functions are the same over all three BSDs, except that some have a
  17. 32-bit Errno, and some a 16-bit}
  18. {$ifdef FPC_USE_SYSCALL}
  19. {$ifdef NetBSD}
  20. {$UNDEF ErrnoWord}
  21. {$endif}
  22. {$ifdef FreeBSD}
  23. {$DEFINE ErrnoWord}
  24. {$endif}
  25. { This variable is needed in syscall.inc assembler code }
  26. var
  27. fpc_threadvar_relocate_proc : TRelocateThreadVarHandler; public name 'FPC_THREADVAR_RELOCATE';
  28. {$define THREADVAR_RELOCATED_ALREADY_DEFINED}
  29. Procedure fpc_geteipasebx;[external name 'fpc_geteipasebx'];
  30. procedure actualsyscall; assembler; {inline requires a dummy push IIRC}
  31. asm
  32. int $0x80
  33. jb .LErrorcode
  34. ret
  35. .LErrorcode:
  36. {$ifdef FPC_PIC}
  37. call fpc_geteipasebx
  38. addl $_GLOBAL_OFFSET_TABLE_,%ebx
  39. movl fpc_threadvar_relocate_proc@GOT(%ebx),%ecx
  40. movl (%ecx),%ecx
  41. movl Errno@GOT(%ebx),%edi
  42. {$else FPC_PIC}
  43. leal Errno,%edi
  44. movl fpc_threadvar_relocate_proc,%ecx
  45. {$endif FPC_PIC}
  46. testl %ecx,%ecx
  47. jne .LThread
  48. {$ifdef ErrnoWord}
  49. movw %ax,4(%edi)
  50. {$else}
  51. movl %eax,4(%edi)
  52. {$endif}
  53. jmp .LNoThread
  54. .LThread:
  55. movl %eax,%ebx
  56. movl (%edi),%eax
  57. call *%ecx
  58. {$ifdef ErrnoWord}
  59. movw %bx,4(%eax)
  60. {$else}
  61. movl %ebx,4(%eax)
  62. {$endif}
  63. .LNoThread:
  64. movl $-1,%eax
  65. end;
  66. function FpSysCall(sysnr:TSysParam):TSysResult; oldfpccall; assembler; [public,alias:'FPC_DOSYS0'];
  67. asm
  68. movl sysnr,%eax
  69. call actualsyscall
  70. end;
  71. function FpSysCall(sysnr,param1:TSysParam):TSysResult; oldfpccall; assembler;[public,alias:'FPC_DOSYS1'];
  72. asm
  73. movl sysnr,%eax
  74. pushl Param1
  75. call actualsyscall
  76. addl $4,%esp
  77. end;
  78. function FpSysCall(sysnr,param1:integer):TSysResult; oldfpccall;assembler;[public,alias:'FPC_DOSYS1w'];
  79. asm
  80. movswl sysnr,%eax
  81. pushw Param1
  82. call actualsyscall
  83. add $2,%esp
  84. end;
  85. function FpSysCall(sysnr,param1,param2:TSysParam):TSysResult; oldfpccall;assembler; [public,alias:'FPC_DOSYS2'];
  86. asm
  87. movl sysnr,%eax
  88. pushl param2
  89. pushl Param1
  90. call actualsyscall
  91. addl $8,%esp
  92. end;
  93. function FpSysCall(sysnr,param1,param2,param3:TSysParam):TSysResult; oldfpccall;assembler;[public,alias:'FPC_DOSYS3'];
  94. asm
  95. movl sysnr,%eax
  96. pushl param3
  97. pushl param2
  98. pushl Param1
  99. call actualsyscall
  100. addl $12,%esp
  101. end;
  102. function FpSysCall(sysnr,param1,param2,param3,param4:TSysParam):TSysResult;oldfpccall; assembler;[public,alias:'FPC_DOSYS4'];
  103. asm
  104. movl sysnr,%eax
  105. pushl param4
  106. pushl param3
  107. pushl param2
  108. pushl Param1
  109. call actualsyscall
  110. addl $16,%esp
  111. end;
  112. function FpSysCall(sysnr,param1,param2,param3,param4,param5:TSysParam):TSysResult;oldfpccall; assembler;[public,alias:'FPC_DOSYS5'];
  113. asm
  114. movl sysnr,%eax
  115. pushl param5
  116. pushl param4
  117. pushl param3
  118. pushl param2
  119. pushl Param1
  120. call actualsyscall
  121. addl $20,%esp
  122. end;
  123. function FpSysCall(sysnr,param1,param2,param3,param4,param5,param6:TSysParam):int64; oldfpccall; assembler;[public,alias:'FPC_DOSYS6'];
  124. asm
  125. movl sysnr,%eax
  126. pushl param6
  127. pushl param5
  128. pushl param4
  129. pushl param3
  130. pushl param2
  131. pushl Param1
  132. call actualsyscall
  133. addl $24,%esp
  134. end;
  135. function FpSysCall(sysnr,param1,param2,param3,param4,param5,param6,param7:TSysParam):int64;oldfpccall; assembler; [public,alias:'FPC_DOSYS7'];
  136. asm
  137. movl sysnr,%eax
  138. pushl param7
  139. pushl param6
  140. pushl param5
  141. pushl param4
  142. pushl param3
  143. pushl param2
  144. pushl Param1
  145. call actualsyscall
  146. addl $28,%esp
  147. end;
  148. function FpSysCall(sysnr,param1,param2,param3,param4,param5,param6,param7,param8:TSysParam):int64;oldfpccall; assembler; [public,alias:'FPC_DOSYS8'];
  149. asm
  150. movl sysnr,%eax
  151. pushl param8
  152. pushl param7
  153. pushl param6
  154. pushl param5
  155. pushl param4
  156. pushl param3
  157. pushl param2
  158. pushl Param1
  159. call actualsyscall
  160. addl $32,%esp
  161. end;
  162. {$endif}