syscall.inc 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  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., 51 Franklin Street, Fifth Floor, Boston,
  15. MA 02110-1301, USA.
  16. ****************************************************************************
  17. These functions are the same over all three BSDs, except that some have a
  18. 32-bit Errno, and some a 16-bit}
  19. {$ifdef FPC_USE_SYSCALL}
  20. {$ifdef NetBSD}
  21. {$UNDEF ErrnoWord}
  22. {$endif}
  23. {$ifdef FreeBSD}
  24. {$DEFINE ErrnoWord}
  25. {$endif}
  26. { This variable is needed in syscall.inc assembler code }
  27. var
  28. fpc_threadvar_relocate_proc : TRelocateThreadVarHandler; public name 'FPC_THREADVAR_RELOCATE';
  29. {$define THREADVAR_RELOCATED_ALREADY_DEFINED}
  30. Procedure fpc_geteipasebx;[external name 'fpc_geteipasebx'];
  31. procedure actualsyscall; assembler; {inline requires a dummy push IIRC}
  32. asm
  33. int $0x80
  34. jb .LErrorcode
  35. ret
  36. .LErrorcode:
  37. {$ifdef FPC_PIC}
  38. call fpc_geteipasebx
  39. addl $_GLOBAL_OFFSET_TABLE_,%ebx
  40. movl fpc_threadvar_relocate_proc@GOT(%ebx),%ecx
  41. movl (%ecx),%ecx
  42. movl Errno@GOT(%ebx),%edi
  43. {$else FPC_PIC}
  44. leal Errno,%edi
  45. movl fpc_threadvar_relocate_proc,%ecx
  46. {$endif FPC_PIC}
  47. testl %ecx,%ecx
  48. jne .LThread
  49. {$ifdef ErrnoWord}
  50. movw %ax,4(%edi)
  51. {$else}
  52. movl %eax,4(%edi)
  53. {$endif}
  54. jmp .LNoThread
  55. .LThread:
  56. movl %eax,%ebx
  57. movl (%edi),%eax
  58. call *%ecx
  59. {$ifdef ErrnoWord}
  60. movw %bx,4(%eax)
  61. {$else}
  62. movl %ebx,4(%eax)
  63. {$endif}
  64. .LNoThread:
  65. movl $-1,%eax
  66. end;
  67. function FpSysCall(sysnr:TSysParam):TSysResult; oldfpccall; assembler; [public,alias:'FPC_DOSYS0'];
  68. asm
  69. movl sysnr,%eax
  70. call actualsyscall
  71. end;
  72. function FpSysCall(sysnr,param1:TSysParam):TSysResult; oldfpccall; assembler;[public,alias:'FPC_DOSYS1'];
  73. asm
  74. movl sysnr,%eax
  75. pushl Param1
  76. call actualsyscall
  77. addl $4,%esp
  78. end;
  79. function FpSysCall(sysnr,param1:integer):TSysResult; oldfpccall;assembler;[public,alias:'FPC_DOSYS1w'];
  80. asm
  81. movswl sysnr,%eax
  82. pushw Param1
  83. call actualsyscall
  84. add $2,%esp
  85. end;
  86. function FpSysCall(sysnr,param1,param2:TSysParam):TSysResult; oldfpccall;assembler; [public,alias:'FPC_DOSYS2'];
  87. asm
  88. movl sysnr,%eax
  89. pushl param2
  90. pushl Param1
  91. call actualsyscall
  92. addl $8,%esp
  93. end;
  94. function FpSysCall(sysnr,param1,param2,param3:TSysParam):TSysResult; oldfpccall;assembler;[public,alias:'FPC_DOSYS3'];
  95. asm
  96. movl sysnr,%eax
  97. pushl param3
  98. pushl param2
  99. pushl Param1
  100. call actualsyscall
  101. addl $12,%esp
  102. end;
  103. function FpSysCall(sysnr,param1,param2,param3,param4:TSysParam):TSysResult;oldfpccall; assembler;[public,alias:'FPC_DOSYS4'];
  104. asm
  105. movl sysnr,%eax
  106. pushl param4
  107. pushl param3
  108. pushl param2
  109. pushl Param1
  110. call actualsyscall
  111. addl $16,%esp
  112. end;
  113. function FpSysCall(sysnr,param1,param2,param3,param4,param5:TSysParam):TSysResult;oldfpccall; assembler;[public,alias:'FPC_DOSYS5'];
  114. asm
  115. movl sysnr,%eax
  116. pushl param5
  117. pushl param4
  118. pushl param3
  119. pushl param2
  120. pushl Param1
  121. call actualsyscall
  122. addl $20,%esp
  123. end;
  124. function FpSysCall(sysnr,param1,param2,param3,param4,param5,param6:TSysParam):int64; oldfpccall; assembler;[public,alias:'FPC_DOSYS6'];
  125. asm
  126. movl sysnr,%eax
  127. pushl param6
  128. pushl param5
  129. pushl param4
  130. pushl param3
  131. pushl param2
  132. pushl Param1
  133. call actualsyscall
  134. addl $24,%esp
  135. end;
  136. function FpSysCall(sysnr,param1,param2,param3,param4,param5,param6,param7:TSysParam):int64;oldfpccall; assembler; [public,alias:'FPC_DOSYS7'];
  137. asm
  138. movl sysnr,%eax
  139. pushl param7
  140. pushl param6
  141. pushl param5
  142. pushl param4
  143. pushl param3
  144. pushl param2
  145. pushl Param1
  146. call actualsyscall
  147. addl $28,%esp
  148. end;
  149. function FpSysCall(sysnr,param1,param2,param3,param4,param5,param6,param7,param8:TSysParam):int64;oldfpccall; assembler; [public,alias:'FPC_DOSYS8'];
  150. asm
  151. movl sysnr,%eax
  152. pushl param8
  153. pushl param7
  154. pushl param6
  155. pushl param5
  156. pushl param4
  157. pushl param3
  158. pushl param2
  159. pushl Param1
  160. call actualsyscall
  161. addl $32,%esp
  162. end;
  163. {$endif}