mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-16 08:59:26 +02:00
* Finished Linux (and rest syscalls) roughly. Some things still need to be
tested, and checked (off_t calls specially)
This commit is contained in:
parent
7109bed98d
commit
d2efb9cfae
104
rtl/bsd/linux.pp
104
rtl/bsd/linux.pp
@ -578,8 +578,10 @@ Function Dup(var oldfile,newfile:file):Boolean;
|
||||
Function Dup2(oldfile,newfile:longint):Boolean;
|
||||
Function Dup2(var oldfile,newfile:text):Boolean;
|
||||
Function Dup2(var oldfile,newfile:file):Boolean;
|
||||
{
|
||||
Function Select(N:longint;readfds,writefds,exceptfds:PFDSet;TimeOut:PTimeVal):longint;
|
||||
Function Select(N:longint;readfds,writefds,exceptfds:PFDSet;TimeOut:Longint):longint;
|
||||
}
|
||||
Function SelectText(var T:Text;TimeOut :PTimeVal):Longint;
|
||||
|
||||
{**************************
|
||||
@ -633,9 +635,9 @@ Procedure SigSuspend(Mask:Sigset);
|
||||
//Function Signal(Signum:Integer;Handler:SignalHandler):SignalHandler;
|
||||
Function Kill(Pid:longint;Sig:integer):integer;
|
||||
Procedure SigRaise(Sig:integer);
|
||||
Function Alarm(Sec : Longint) : longint;
|
||||
{Function Alarm(Sec : Longint) : longint;
|
||||
Procedure Pause;
|
||||
|
||||
}
|
||||
{**************************
|
||||
IOCtl/Termios Functions
|
||||
***************************}
|
||||
@ -696,7 +698,9 @@ function MMap(const m:tmmapargs):longint;
|
||||
Port IO functions
|
||||
***************************}
|
||||
|
||||
{
|
||||
Function IOperm (From,Num : Cardinal; Value : Longint) : boolean;
|
||||
}
|
||||
{$IFDEF I386}
|
||||
Procedure WritePort (Port : Longint; Value : Byte);
|
||||
Procedure WritePort (Port : Longint; Value : Word);
|
||||
@ -2127,24 +2131,28 @@ begin
|
||||
Dup2:=Dup2(filerec(oldfile).handle,filerec(newfile).handle);
|
||||
end;
|
||||
|
||||
{
|
||||
|
||||
Function Select(N:longint;readfds,writefds,exceptfds:PFDSet;TimeOut:PTimeVal):longint;
|
||||
{
|
||||
Select checks whether the file descriptor sets in readfs/writefs/exceptfs
|
||||
have changed.
|
||||
}
|
||||
Var
|
||||
SelectArray : Array[1..5] of longint;
|
||||
Sr : Syscallregs;
|
||||
Retval : LONGINT;
|
||||
begin
|
||||
SelectArray[1]:=n;
|
||||
SelectArray[2]:=longint(Readfds);
|
||||
Selectarray[3]:=longint(Writefds);
|
||||
selectarray[4]:=longint(exceptfds);
|
||||
Selectarray[5]:=longint(TimeOut);
|
||||
sr.reg2:=longint(@selectarray);
|
||||
Select:=SysCall(Syscall_nr_select,sr);
|
||||
LinuxError:=Errno;
|
||||
asm
|
||||
pushl TimeOut
|
||||
pushl exceptfds
|
||||
pushl writefds
|
||||
pushl readfds
|
||||
pushl n
|
||||
mov $93,%eax
|
||||
int $0x80
|
||||
addl $20,%esp
|
||||
mov %eax,retval
|
||||
end;
|
||||
Select:=checkreturnvalue(retval,retval);
|
||||
LinuxError:=Errno;
|
||||
end;
|
||||
|
||||
Function Select(N:longint;readfds,writefds,exceptfds:PFDSet;TimeOut:Longint):longint;
|
||||
@ -2167,7 +2175,7 @@ begin
|
||||
end;
|
||||
Select:=Select(N,Readfds,WriteFds,ExceptFds,p);
|
||||
end;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Function SelectText(var T:Text;TimeOut :PTimeval):Longint;
|
||||
@ -2603,7 +2611,7 @@ begin
|
||||
or STAT_IFIFO,%ebx
|
||||
push %ebx
|
||||
push %ecx
|
||||
mov $14,$eax
|
||||
mov $14,%eax
|
||||
int $0x80
|
||||
addl $12,%esp
|
||||
mov %eax,retval
|
||||
@ -2887,7 +2895,7 @@ begin
|
||||
asm
|
||||
push Sig
|
||||
push Pid
|
||||
mov $37,$eax
|
||||
mov $37,%eax
|
||||
int $0x80
|
||||
addl $8,%esp
|
||||
mov %eax,retval
|
||||
@ -2912,14 +2920,12 @@ begin
|
||||
push oldact
|
||||
push act
|
||||
push signum
|
||||
mov $46,$eax
|
||||
mov $46,%eax
|
||||
int $0x80
|
||||
addl $12,%esp
|
||||
mov %eax,retval
|
||||
end;
|
||||
SigAction:=checkreturnvalue(retval,retval);
|
||||
if kill<0 THEN
|
||||
Kill:=0;
|
||||
checkreturnvalue(retval,retval);
|
||||
LinuxError:=Errno;
|
||||
end;
|
||||
|
||||
@ -2944,7 +2950,7 @@ begin
|
||||
addl $12,%esp
|
||||
mov %eax,retval
|
||||
end;
|
||||
SigProcMask:=checkreturnvalue(retval,retval);
|
||||
checkreturnvalue(retval,retval);
|
||||
LinuxError:=Errno;
|
||||
end;
|
||||
|
||||
@ -2962,6 +2968,7 @@ begin
|
||||
mov $52,%eax
|
||||
int $0x80
|
||||
addl $4,%esp
|
||||
mov %eax,retval
|
||||
end;
|
||||
sigpending:=checkreturnvalue(retval,dummy);
|
||||
LinuxError:=Errno;
|
||||
@ -3016,6 +3023,7 @@ begin
|
||||
Kill(GetPid,Sig);
|
||||
end;
|
||||
|
||||
{
|
||||
Function Alarm(Sec : Longint) : longint;
|
||||
|
||||
Var Sr : Syscallregs;
|
||||
@ -3032,7 +3040,7 @@ Var Sr : Syscallregs;
|
||||
begin
|
||||
syscall(syscall_nr_pause,sr);
|
||||
end;
|
||||
|
||||
}
|
||||
{******************************************************************************
|
||||
IOCtl and Termios calls
|
||||
******************************************************************************}
|
||||
@ -3046,13 +3054,19 @@ Function IOCtl(Handle,Ndx: Longint;Data: Pointer):boolean;
|
||||
data is function-dependent.
|
||||
}
|
||||
var
|
||||
sr: SysCallRegs;
|
||||
retval : longint;
|
||||
begin
|
||||
sr.reg2:=Handle;
|
||||
sr.reg3:=Ndx;
|
||||
sr.reg4:=Longint(Data);
|
||||
IOCtl:=(SysCall(Syscall_nr_ioctl,sr)=0);
|
||||
LinuxError:=Errno;
|
||||
asm
|
||||
push data
|
||||
push ndx
|
||||
push handle
|
||||
mov $54,%eax
|
||||
int $0x80
|
||||
addl $12,%esp
|
||||
mov %eax,retval
|
||||
end;
|
||||
IOctl:=checkreturnvalue(retval,retval)=0;
|
||||
LinuxError:=Errno;
|
||||
end;
|
||||
|
||||
|
||||
@ -3671,8 +3685,6 @@ begin
|
||||
FillChar(fds,sizeof(fdSet),0);
|
||||
end;
|
||||
|
||||
|
||||
|
||||
Procedure FD_Clr(fd:longint;var fds:fdSet);
|
||||
{
|
||||
Remove fd from the set of filedescriptors
|
||||
@ -3809,18 +3821,31 @@ end;
|
||||
|
||||
function MMap(const m:tmmapargs):longint;
|
||||
Var
|
||||
Sr : Syscallregs;
|
||||
Retval : longint;
|
||||
begin
|
||||
Sr.reg2:=longint(@m);
|
||||
MMap:=syscall(syscall_nr_mmap,sr);
|
||||
LinuxError:=Errno;
|
||||
asm
|
||||
push $0
|
||||
mov m,%esi
|
||||
push tmmapargs.offset(%esi)
|
||||
push tmmapargs.fd(%esi)
|
||||
push tmmapargs.flags(%esi)
|
||||
push tmmapargs.prot(%esi)
|
||||
push tmmapargs.size(%esi)
|
||||
push tmmapargs.address(%esi)
|
||||
mov $197,%eax
|
||||
int $0x80
|
||||
addl $28,%esp
|
||||
mov %eax,retval
|
||||
end;
|
||||
checkreturnvalue(retval,retval);
|
||||
LinuxError:=Errno;
|
||||
end;
|
||||
|
||||
|
||||
{--------------------------------
|
||||
Port IO functions
|
||||
--------------------------------}
|
||||
|
||||
{
|
||||
Function IOperm (From,Num : Cardinal; Value : Longint) : boolean;
|
||||
{
|
||||
Set permissions on NUM ports starting with port FROM to VALUE
|
||||
@ -3836,8 +3861,7 @@ begin
|
||||
IOPerm:=Syscall(Syscall_nr_ioperm,sr)=0;
|
||||
LinuxError:=Errno;
|
||||
end;
|
||||
|
||||
|
||||
}
|
||||
{$IFDEF I386}
|
||||
|
||||
{$asmmode direct}
|
||||
@ -4039,7 +4063,11 @@ End.
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.2 2000-02-04 12:05:04 marco
|
||||
Revision 1.3 2000-02-04 16:53:26 marco
|
||||
* Finished Linux (and rest syscalls) roughly. Some things still need to be
|
||||
tested, and checked (off_t calls specially)
|
||||
|
||||
Revision 1.2 2000/02/04 12:05:04 marco
|
||||
* a few functions added.
|
||||
|
||||
Revision 1.1 2000/02/03 17:03:36 marco
|
||||
|
@ -1,5 +1,10 @@
|
||||
FreeBSD status and notes. (kept on CVS because I work on several places)
|
||||
|
||||
At the moment that you are reading this, FPC for FreeBSD is still a dream.
|
||||
We are currently working actively on FreeBSD support.
|
||||
|
||||
|
||||
|
||||
NI=not implemented yet
|
||||
req=required for compiler
|
||||
noreq? = probably not required, but not checked.
|
||||
@ -8,14 +13,13 @@ syscall status comment
|
||||
|
||||
------------------------------------------------------------------------
|
||||
|
||||
Readdir NI req Three pages code in the linux emulator which uses calls
|
||||
we probably can't access :-) GetDents uses the
|
||||
same calls tho.
|
||||
Readdir implemented
|
||||
from
|
||||
scratch,
|
||||
untested.
|
||||
|
||||
Clone() NI noreq Looks awfully complicated. Should be based on RFork.
|
||||
|
||||
Select NI noreq? See maillist. Doesn't seem to comply to manpage.
|
||||
|
||||
sysinfo NI noreq Not supported under BSD, not even by emulator
|
||||
uname NI noreq " " " " " " " "
|
||||
(procedure based on this call are also commented
|
||||
@ -23,3 +27,7 @@ uname NI noreq " " " " " " " "
|
||||
|
||||
signal NI noreq? A *lot* of emulation code.
|
||||
alarm NI noreq? Could be possible to port.
|
||||
pause NI noreq? Also possible I think. Uses process information
|
||||
in linux-emu, that is why I didn't port directly.
|
||||
|
||||
IOPERM NI noreq? Concept doesn't exist.
|
@ -374,21 +374,26 @@ end;
|
||||
|
||||
Function Sys_ReadDir(p:pdir):pdirent;
|
||||
var
|
||||
regs :SysCallregs;
|
||||
dummy:longint;
|
||||
retval : longint;
|
||||
begin
|
||||
regs.reg3:=longint(p^.buf);
|
||||
regs.reg2:=p^.fd;
|
||||
regs.reg4:=1;
|
||||
dummy:=SysCall(SysCall_nr_readdir,regs);
|
||||
{ the readdir system call returns the number of bytes written }
|
||||
if dummy=0 then
|
||||
retval:=SIZEOF(dirent) ;
|
||||
asm
|
||||
mov p,%esi
|
||||
push retval
|
||||
push tdir.buf(%esi)
|
||||
push tdir.fd(%esi)
|
||||
mov $272,%eax
|
||||
int $0x80
|
||||
addl $12,%esp
|
||||
mov %eax,retval
|
||||
end;
|
||||
retval:=checkreturnvalue(retval,retval);
|
||||
if retval=0 then
|
||||
sys_readdir:=nil
|
||||
else
|
||||
sys_readdir:=p^.buf
|
||||
end;
|
||||
|
||||
|
||||
{*****************************************************************************
|
||||
--- Process:Process & program handling - related calls ---
|
||||
*****************************************************************************}
|
||||
@ -410,7 +415,11 @@ end;
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.4 2000-02-03 17:04:47 marco
|
||||
Revision 1.5 2000-02-04 16:53:26 marco
|
||||
* Finished Linux (and rest syscalls) roughly. Some things still need to be
|
||||
tested, and checked (off_t calls specially)
|
||||
|
||||
Revision 1.4 2000/02/03 17:04:47 marco
|
||||
* additions fixes due to port linux
|
||||
|
||||
Revision 1.3 2000/02/02 18:07:27 marco
|
||||
|
Loading…
Reference in New Issue
Block a user