syscalls.inc 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  1. {
  2. $Id$
  3. This file is part of the Free Pascal run time library.
  4. Copyright (c) 1993,97 by Michael Van Canneyt,
  5. member of the Free Pascal development team.
  6. See the file COPYING.FPC, included in this distribution,
  7. for details about the copyright.
  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.
  11. **********************************************************************}
  12. {No debugging for syslinux include !}
  13. {$IFDEF SYS_LINUX}
  14. {$UNDEF SYSCALL_DEBUG}
  15. {$ENDIF SYS_LINUX}
  16. {*****************************************************************************
  17. --- Main:The System Call Self ---
  18. *****************************************************************************}
  19. Procedure Do_SysCall( callnr:longint;var regs : SysCallregs );assembler;
  20. {
  21. This function puts the registers in place, does the call, and then
  22. copies back the registers as they are after the SysCall.
  23. }
  24. {$ifdef i386}
  25. asm
  26. # load the registers...
  27. movl 12(%ebp),%eax
  28. movl 4(%eax),%ebx
  29. movl 8(%eax),%ecx
  30. movl 12(%eax),%edx
  31. movl 16(%eax),%esi
  32. movl 20(%eax),%edi
  33. # set the call number
  34. movl 8(%ebp),%eax
  35. # Go !
  36. int $0x80
  37. # Put back the registers...
  38. pushl %eax
  39. movl 12(%ebp),%eax
  40. movl %edi,20(%eax)
  41. movl %esi,16(%eax)
  42. movl %edx,12(%eax)
  43. movl %ecx,8(%eax)
  44. movl %ebx,4(%eax)
  45. popl %ebx
  46. movl %ebx,(%eax)
  47. end;
  48. {$else}
  49. {$ifdef m68k}
  50. asm
  51. { load the registers... }
  52. move.l 12(a6),a0
  53. move.l 4(a0),d1
  54. move.l 8(a0),d2
  55. move.l 12(a0),d3
  56. move.l 16(a0),d4
  57. move.l 20(a0),d5
  58. { set the call number }
  59. move.l 8(a6),d0
  60. { Go ! }
  61. trap #0
  62. { Put back the registers... }
  63. move.l d0,-(sp)
  64. move.l 12(a6),a0
  65. move.l d5,20(a0)
  66. move.l d4,16(a0)
  67. move.l d3,12(a0)
  68. move.l d2,8(a0)
  69. move.l d1,4(a0)
  70. move.l (sp)+,d1
  71. move.l d1,(a0)
  72. end;
  73. {$else}
  74. {$error Cannot decide which processor you have ! define i386 or m68k }
  75. {$endif}
  76. {$endif}
  77. {$IFDEF SYSCALL_DEBUG}
  78. Const
  79. DoSysCallDebug : Boolean = False;
  80. var
  81. LastCnt,
  82. LastEax,
  83. LastCall : longint;
  84. DebugTxt : string[20];
  85. {$ENDIF}
  86. Function SysCall( callnr:longint;var regs : SysCallregs ):longint;
  87. {
  88. This function serves as an interface to do_SysCall.
  89. If the SysCall returned a negative number, it returns -1, and puts the
  90. SysCall result in errno. Otherwise, it returns the SysCall return value
  91. }
  92. begin
  93. do_SysCall(callnr,regs);
  94. if regs.reg1<0 then
  95. begin
  96. {$IFDEF SYSCALL_DEBUG}
  97. If DoSysCallDebug then
  98. debugtxt:=' syscall error: ';
  99. {$endif}
  100. ErrNo:=-regs.reg1;
  101. SysCall:=-1;
  102. end
  103. else
  104. begin
  105. {$IFDEF SYSCALL_DEBUG}
  106. if DoSysCallDebug then
  107. debugtxt:=' syscall returned: ';
  108. {$endif}
  109. SysCall:=regs.reg1;
  110. errno:=0
  111. end;
  112. {$IFDEF SYSCALL_DEBUG}
  113. if DoSysCallDebug then
  114. begin
  115. inc(lastcnt);
  116. if (callnr<>lastcall) or (regs.reg1<>lasteax) then
  117. begin
  118. if lastcnt>1 then
  119. writeln(sys_nr_txt[lastcall],debugtxt,lasteax,' (',lastcnt,'x)');
  120. lastcall:=callnr;
  121. lasteax:=regs.reg1;
  122. lastcnt:=0;
  123. writeln(sys_nr_txt[lastcall],debugtxt,lasteax);
  124. end;
  125. end;
  126. {$endif}
  127. end;
  128. Function Sys_Time:longint;
  129. var
  130. regs : SysCallregs;
  131. begin
  132. regs.reg2:=0;
  133. Sys_Time:=SysCall(SysCall_nr_time,regs);
  134. end;
  135. {*****************************************************************************
  136. --- File:File handling related calls ---
  137. *****************************************************************************}
  138. Function Sys_Open(f:pchar;flags:longint;mode:integer):longint;
  139. var
  140. regs : SysCallregs;
  141. Begin
  142. regs.reg2:=longint(f);
  143. regs.reg3:=flags;
  144. regs.reg4:=mode;
  145. Sys_Open:=SysCall(SysCall_nr_open,regs);
  146. End;
  147. Function Sys_Close(f:longint):longint;
  148. var
  149. regs : SysCallregs;
  150. begin
  151. regs.reg2:=f;
  152. Sys_Close:=SysCall(SysCall_nr_close,regs);
  153. end;
  154. Function Sys_Lseek(F:longint;Off:longint;Whence:longint):longint;
  155. var
  156. regs : SysCallregs;
  157. begin
  158. regs.reg2:=f;
  159. regs.reg3:=off;
  160. regs.reg4:=Whence;
  161. Sys_lseek:=SysCall(SysCall_nr_lseek,regs);
  162. end;
  163. Function Sys_Read(f:longint;buffer:pchar;count:longint):longint;
  164. var
  165. regs : SysCallregs;
  166. begin
  167. regs.reg2:=f;
  168. regs.reg3:=longint(buffer);
  169. regs.reg4:=count;
  170. Sys_Read:=SysCall(SysCall_nr_read,regs);
  171. end;
  172. Function Sys_Write(f:longint;buffer:pchar;count:longint):longint;
  173. var
  174. regs : SysCallregs;
  175. begin
  176. regs.reg2:=f;
  177. regs.reg3:=longint(buffer);
  178. regs.reg4:=count;
  179. Sys_Write:=SysCall(SysCall_nr_write,regs);
  180. end;
  181. Function Sys_Unlink(Filename:pchar):longint;
  182. var
  183. regs : SysCallregs;
  184. begin
  185. regs.reg2:=longint(filename);
  186. Sys_Unlink:=SysCall(SysCall_nr_unlink,regs);
  187. end;
  188. Function Sys_Rename(Oldname,Newname:pchar):longint;
  189. var
  190. regs : SysCallregs;
  191. begin
  192. regs.reg2:=longint(oldname);
  193. regs.reg3:=longint(newname);
  194. Sys_Rename:=SysCall(SysCall_nr_rename,regs);
  195. end;
  196. Function Sys_Stat(Filename:pchar;var Buffer: stat):longint;
  197. {
  198. We need this for getcwd
  199. }
  200. var
  201. regs : SysCallregs;
  202. begin
  203. regs.reg2:=longint(filename);
  204. regs.reg3:=longint(@buffer);
  205. Sys_Stat:=SysCall(SysCall_nr_stat,regs);
  206. end;
  207. Function Sys_Symlink(oldname,newname:pchar):longint;
  208. {
  209. We need this for erase
  210. }
  211. var
  212. regs : SysCallregs;
  213. begin
  214. regs.reg2:=longint(oldname);
  215. regs.reg3:=longint(newname);
  216. Sys_symlink:=SysCall(SysCall_nr_symlink,regs);
  217. end;
  218. {*****************************************************************************
  219. --- Directory:Directory related calls ---
  220. *****************************************************************************}
  221. Function Sys_Chdir(Filename:pchar):longint;
  222. var
  223. regs : SysCallregs;
  224. begin
  225. regs.reg2:=longint(filename);
  226. Sys_ChDir:=SysCall(SysCall_nr_chdir,regs);
  227. end;
  228. Function Sys_Mkdir(Filename:pchar;mode:longint):longint;
  229. var
  230. regs : SysCallregs;
  231. begin
  232. regs.reg2:=longint(filename);
  233. regs.reg3:=mode;
  234. Sys_MkDir:=SysCall(SysCall_nr_mkdir,regs);
  235. end;
  236. Function Sys_Rmdir(Filename:pchar):longint;
  237. var
  238. regs : SysCallregs;
  239. begin
  240. regs.reg2:=longint(filename);
  241. Sys_Rmdir:=SysCall(SysCall_nr_rmdir,regs);
  242. end;
  243. { we need this for getcwd }
  244. Function OpenDir(f:pchar):pdir;
  245. var
  246. fd:integer;
  247. st:stat;
  248. ptr:pdir;
  249. begin
  250. opendir:=nil;
  251. if sys_stat(f,st)<0 then
  252. exit;
  253. { Is it a dir ? }
  254. if not((st.mode and $f000)=$4000)then
  255. begin
  256. errno:=sys_enotdir;
  257. exit
  258. end;
  259. { Open it}
  260. fd:=sys_open(f,OPEN_RDONLY,438);
  261. if fd<0 then
  262. exit;
  263. new(ptr);
  264. if ptr=nil then
  265. exit;
  266. new(ptr^.buf);
  267. if ptr^.buf=nil then
  268. exit;
  269. ptr^.fd:=fd;
  270. ptr^.loc:=0;
  271. ptr^.size:=0;
  272. ptr^.dd_max:=sizeof(ptr^.buf^);
  273. opendir:=ptr;
  274. end;
  275. function CloseDir(p:pdir):integer;
  276. begin
  277. closedir:=sys_close(p^.fd)
  278. end;
  279. Function Sys_ReadDir(p:pdir):pdirent;
  280. var
  281. regs :SysCallregs;
  282. dummy:longint;
  283. begin
  284. regs.reg3:=longint(p^.buf);
  285. regs.reg2:=p^.fd;
  286. regs.reg4:=1;
  287. dummy:=SysCall(SysCall_nr_readdir,regs);
  288. { the readdir system call returns the number of bytes written }
  289. if dummy=0 then
  290. sys_readdir:=nil
  291. else
  292. sys_readdir:=p^.buf
  293. end;
  294. {*****************************************************************************
  295. --- Process:Process & program handling - related calls ---
  296. *****************************************************************************}
  297. Procedure Sys_Exit(ExitCode:Integer);
  298. var
  299. regs : SysCallregs;
  300. begin
  301. regs.reg2:=exitcode;
  302. SysCall(SysCall_nr_exit,regs)
  303. end;
  304. {
  305. $Log$
  306. Revision 1.2 1998-05-06 12:38:22 michael
  307. + Removed log from before restored version.
  308. Revision 1.1.1.1 1998/03/25 11:18:43 root
  309. * Restored version
  310. }