syscall.inc 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  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. procedure actualsyscall; assembler; {inline requires a dummy push IIRC}
  26. asm
  27. int $0x80
  28. jb .LErrorcode
  29. ret
  30. .LErrorcode:
  31. {$ifdef REGCALL}
  32. movl fpc_threadvar_relocate_proc,%ecx
  33. testl %ecx,%ecx
  34. jne .LThread
  35. movl %eax,Errno+4
  36. jmp .LNoThread
  37. .LThread:
  38. movl %eax,%ebx
  39. movl Errno,%eax
  40. call *%ecx
  41. movl %ebx,(%eax)
  42. .LNoThread:
  43. {$else}
  44. movl %eax,%edx
  45. movl fpc_threadvar_relocate_proc,%eax
  46. testl %eax,%eax
  47. jne .LThread
  48. movl %edx,Errno+4
  49. jmp .LNoThread
  50. .LThread:
  51. pushl %edx
  52. pushl Errno
  53. call *%eax
  54. popl %edx
  55. {$ifdef ErrnoWord}
  56. movw %dx,(%eax)
  57. {$else}
  58. movl %edx,(%eax)
  59. {$endif}
  60. .LNoThread:
  61. {$endif REGCALL}
  62. mov $-1,%eax
  63. end;
  64. function FpSysCall(sysnr:TSysParam):TSysResult; oldfpccall; assembler; [public,alias:'FPC_DOSYS0'];
  65. asm
  66. movl sysnr,%eax
  67. call actualsyscall
  68. end;
  69. function FpSysCall(sysnr,param1:TSysParam):TSysResult; oldfpccall; assembler;[public,alias:'FPC_DOSYS1'];
  70. asm
  71. movl sysnr,%eax
  72. pushl Param1
  73. call actualsyscall
  74. addl $4,%esp
  75. end;
  76. function FpSysCall(sysnr,param1:integer):TSysResult; oldfpccall;assembler;[public,alias:'FPC_DOSYS1w'];
  77. asm
  78. movl sysnr,%eax
  79. pushw Param1
  80. call actualsyscall
  81. add $2,%esp
  82. end;
  83. function FpSysCall(sysnr,param1,param2:TSysParam):TSysResult; oldfpccall;assembler; [public,alias:'FPC_DOSYS2'];
  84. asm
  85. movl sysnr,%eax
  86. pushl param2
  87. pushl Param1
  88. call actualsyscall
  89. addl $8,%esp
  90. end;
  91. function FpSysCall(sysnr,param1,param2,param3:TSysParam):TSysResult; oldfpccall;assembler;[public,alias:'FPC_DOSYS3'];
  92. asm
  93. movl sysnr,%eax
  94. pushl param3
  95. pushl param2
  96. pushl Param1
  97. call actualsyscall
  98. addl $12,%esp
  99. end;
  100. function FpSysCall(sysnr,param1,param2,param3,param4:TSysParam):TSysResult;oldfpccall; assembler;[public,alias:'FPC_DOSYS4'];
  101. asm
  102. movl sysnr,%eax
  103. pushl param4
  104. pushl param3
  105. pushl param2
  106. pushl Param1
  107. call actualsyscall
  108. addl $16,%esp
  109. end;
  110. function FpSysCall(sysnr,param1,param2,param3,param4,param5:TSysParam):TSysResult;oldfpccall; assembler;[public,alias:'FPC_DOSYS5'];
  111. asm
  112. movl sysnr,%eax
  113. pushl param5
  114. pushl param4
  115. pushl param3
  116. pushl param2
  117. pushl Param1
  118. call actualsyscall
  119. addl $20,%esp
  120. end;
  121. function FpSysCall(sysnr,param1,param2,param3,param4,param5,param6:TSysParam):int64; oldfpccall; assembler;[public,alias:'FPC_DOSYS6'];
  122. asm
  123. movl sysnr,%eax
  124. pushl param6
  125. pushl param5
  126. pushl param4
  127. pushl param3
  128. pushl param2
  129. pushl Param1
  130. call actualsyscall
  131. addl $24,%esp
  132. end;
  133. function FpSysCall(sysnr,param1,param2,param3,param4,param5,param6,param7:TSysParam):int64;oldfpccall; assembler; [public,alias:'FPC_DOSYS7'];
  134. asm
  135. movl sysnr,%eax
  136. pushl param7
  137. pushl param6
  138. pushl param5
  139. pushl param4
  140. pushl param3
  141. pushl param2
  142. pushl Param1
  143. call actualsyscall
  144. addl $28,%esp
  145. end;
  146. function FpSysCall(sysnr,param1,param2,param3,param4,param5,param6,param7,param8:TSysParam):int64;oldfpccall; assembler; [public,alias:'FPC_DOSYS8'];
  147. asm
  148. movl sysnr,%eax
  149. pushl param8
  150. pushl param7
  151. pushl param6
  152. pushl param5
  153. pushl param4
  154. pushl param3
  155. pushl param2
  156. pushl Param1
  157. call actualsyscall
  158. addl $32,%esp
  159. end;
  160. {$endif}