* commit ACM's fpc.diff, resolves mantis #37220 and FreeBSD 12/13 syscall port

This commit is contained in:
marcoonthegit 2022-06-18 13:58:00 +02:00
parent 4118173e1d
commit 99e3789fa3
5 changed files with 91 additions and 45 deletions

View File

@ -374,38 +374,46 @@ begin
FPutime:=do_syscall(syscall_nr_utimes,TSysParam(path),TSysParam(tvp));
end;
function __pipe_call(sysnr:TSysParam):TSysResult; {$ifdef cpui386}oldfpccall{$endif} external name 'FPC_DOSYS0';
{$if (defined (freebsd))}
function FPpipe(var fildes : tfildes; flags:cint):cint;
{$if (defined(freebsd) or defined (dragonfly)) and (defined(CPUi386) or defined(CPUX86_64))}
{$define PIPE_RESULT_IN_EAX_AND_EDX}
{$endif}
Function FPpipe(var fildes : tfildes):cint;
{$ifndef PIPE_RESULT_IN_EAX_AND_EDX}
begin
fppipe:=do_syscall(syscall_nr_pipe,TSysParam(@fildes));
fppipe:=do_syscall(syscall_nr_pipe2,TSysParam(@fildes), TSysParam(flags));
end;
{$else}
var
a, b: cInt;
begin
asm
{$ifdef CPUi386}
pushl syscall_nr_pipe
call __pipe_call
movl %eax, a
movl %edx, b
{$else}
movq syscall_nr_pipe, %rdi
call __pipe_call
movl %eax, a
movl %edx, b
{$endif}
end;
function __pipe_call(sysnr:TSysParam):TSysResult; {$ifdef cpui386}oldfpccall{$endif} external name 'FPC_DOSYS0';
fpPipe := a; // eax is in a, no matter if it worked or not
fildes[0] := a;
fildes[1] := b;
end;
{$if (defined (dragonfly) and (defined(CPUi386) or defined(CPUX86_64))}
{$define PIPE_RESULT_IN_EAX_AND_EDX}
{$endif}
Function FPpipe(var fildes : tfildes):cint;
{$ifndef PIPE_RESULT_IN_EAX_AND_EDX}
begin
fppipe:=do_syscall(syscall_nr_pipe,TSysParam(@fildes));
end;
{$else}
var
a, b: cInt;
begin
asm
{$ifdef CPUi386}
pushl syscall_nr_pipe
call __pipe_call
movl %eax, a
movl %edx, b
{$else}
movq syscall_nr_pipe, %rdi
call __pipe_call
movl %eax, a
movl %edx, b
{$endif}
end;
fpPipe := a; // eax is in a, no matter if it worked or not
fildes[0] := a;
fildes[1] := b;
end;
{$endif}
{$endif}
function FPfcntl(fildes:cint;Cmd:cint;Arg:cint):cint;
@ -498,8 +506,15 @@ Function fpLstat(path:pchar;Info:pstat):cint;
Get all information on a link (the link itself), and return it in info.
}
const
AT_FDCWD=-100;
AT_SYMLINK_NOFOLLOW=$0200;
begin
fpLStat:=do_syscall(syscall_nr_lstat,TSysParam(path),TSysParam(info));
{$ifdef freebsd}
fpLStat:=do_syscall(syscall_nr_fstatat,AT_FDCWD,TSysParam(path),TSysParam(Info),AT_SYMLINK_NOFOLLOW);
{$else}
fpLStat:=do_syscall(syscall_nr_lstat,TSysParam(path),TSysParam(info));
{$endif}
end;
function fpNice(N:cint):cint;

View File

@ -76,9 +76,9 @@ FreeBSD: same implementation as NetBSD.
begin
{$ifdef CPU64}
Fplseek:=do_syscall(syscall_nr___syscall,syscall_nr_lseek,TSysParam(fd),0,Offset,whence);
Fplseek:=do_syscall(syscall_nr___syscall,syscall_nr_lseek,TSysParam(fd),Offset,whence);
{$else}
Fplseek:=do_syscall(syscall_nr___syscall,syscall_nr_lseek,0,TSysParam(fd),0,
Fplseek:=do_syscall(syscall_nr___syscall,syscall_nr_lseek,0,TSysParam(fd),
{$ifdef ENDIAN_BIG}hi(offset),lo(offset){$endif}
{$ifdef ENDIAN_LITTLE}lo(Offset),hi(offset){$endif},
Whence);
@ -90,9 +90,9 @@ function Fpftruncate(fd : cint; flength : off_t): cint; [public, alias : 'FPC_SY
begin
{$ifdef CPU64}
Fpftruncate:=Do_syscall(syscall_nr___syscall,syscall_nr_ftruncate, fd ,0 ,flength);
Fpftruncate:=Do_syscall(syscall_nr___syscall,syscall_nr_ftruncate, fd ,flength);
{$else}
Fpftruncate:=Do_syscall(syscall_nr___syscall,syscall_nr_ftruncate,0,fd,0,lo(flength),hi(flength));
Fpftruncate:=Do_syscall(syscall_nr___syscall,syscall_nr_ftruncate,0,fd,lo(flength),hi(flength));
{$endif}
end;
@ -102,9 +102,9 @@ Function Fpmmap(start:pointer;len:size_t;prot:cint;flags:cint;fd:cint;offst:off_
begin
{$ifdef CPU64}
Fpmmap:=pointer(ptruint(do_syscall(TSysParam(syscall_nr_mmap),TSysParam(Start),TSysParam(Len),TSysParam(Prot),TSysParam(Flags),TSysParam(fd),0,TSysParam(offst))));
Fpmmap:=pointer(ptruint(do_syscall(TSysParam(syscall_nr_mmap),TSysParam(Start),TSysParam(Len),TSysParam(Prot),TSysParam(Flags),TSysParam(fd),TSysParam(offst))));
{$else}
Fpmmap:=pointer(ptruint(do_syscall(syscall_nr_mmap,TSysParam(Start),Len,Prot,Flags,fd,0,
Fpmmap:=pointer(ptruint(do_syscall(syscall_nr_mmap,TSysParam(Start),Len,Prot,Flags,fd,
{$ifdef FPC_BIG_ENDIAN} hi(offst),lo(offst){$endif}
{$ifdef FPC_LITTLE_ENDIAN} lo(offst),hi(offst){$endif}
)));
@ -138,13 +138,25 @@ begin
Fprename:=do_syscall(syscall_nr_rename,TSysParam(old),TSysParam(newpath));
end;
function Fpstat(const path: pchar; var buf : stat):cint; [public, alias : 'FPC_SYSC_STAT'];
Function fpFstatat(fd: cint; path: pchar; var sb: stat; flag: cint):cint;
begin
Fpstat:=do_syscall(syscall_nr_stat,TSysParam(path),TSysParam(@buf));
fpFStatat:=do_syscall(syscall_nr_fstatat,fd,TSysParam(path),TSysParam(@sb),flag);
end;
function Fpstat(const path: pchar; var buf : stat):cint; [public, alias : 'FPC_SYSC_STAT'];
const
AT_FDCWD=-100;
begin
{$ifdef freebsd}
Fpstat:=FpFstatat(AT_FDCWD, path, buf, 0);
{$else}
Fpstat:=do_syscall(syscall_nr_stat,TSysParam(path),TSysParam(@buf));
{$endif}
end;
{*****************************************************************************
--- Directory:Directory related calls ---
*****************************************************************************}
@ -171,6 +183,13 @@ end;
const DIRBLKSIZ=1024;
{$ifdef freebsd}
function FpGetdirentries(fd : cint; buf : pchar; nbytes : clong) : cint;
begin
FpGetdirentries:=do_syscall(syscall_nr_getdirentries,fd,TSysParam(buf), nbytes);
end;
{$endif}
function Fpfstat(fd : cint; var sb : stat): cint; forward;
@ -247,7 +266,11 @@ function readbuffer:longint;
var retval :longint;
begin
Retval:=do_syscall(syscall_nr_getdents,TSysParam(dirp^.dd_fd),TSysParam(@dirp^.dd_buf^),DIRBLKSIZ {sizeof(getdentsbuffer)});
{$ifdef freebsd}
Retval:=FpGetdirentries(dirp^.dd_fd, @dirp^.dd_buf^, DIRBLKSIZ {sizeof(getdentsbuffer)});
{$else}
Retval:=do_syscall(syscall_nr_getdents,TSysParam(dirp^.dd_fd),TSysParam(@dirp^.dd_buf^),DIRBLKSIZ {sizeof(getdentsbuffer)});
{$endif}
dirp^.dd_rewind:=TSysParam(dirp^.dd_buf);
if retval=0 then
begin

View File

@ -16,8 +16,8 @@ const
{More or less checked/in use FreeBSD syscalls}
syscall_nr_readv = 120;
syscall_nr_writev = 121;
syscall_nr_pread = 173;
syscall_nr_pwrite = 174;
syscall_nr_pread = 475;
syscall_nr_pwrite = 476;
syscall_nr_semsys = 169;
syscall_nr_msgsys = 170;
syscall_nr_shmsys = 171;
@ -48,15 +48,17 @@ const
syscall_nr_fcntl = 92;
syscall_nr_flock = 131;
syscall_nr_fork = 2;
syscall_nr_fstat = 189;
syscall_nr_fstat = 551;
syscall_nr_fstatat = 552;
syscall_nr_statfs4 = 157; // COMPAT4x
syscall_nr_fstatfs4 = 158; // COMPAT4x
syscall_nr_getfsstat = 395;
syscall_nr_getfsstat = 557;
syscall_nr_statfs = 396;
syscall_nr_fstatfs = 397;
syscall_nr_fsync = 95;
syscall_nr_ftruncate = 201;
syscall_nr_ftruncate = 480;
syscall_nr_getdents = 272;
syscall_nr_getdirentries = 554;
syscall_nr_getegid = 43;
syscall_nr_geteuid = 25;
syscall_nr_getgid = 47;
@ -71,13 +73,14 @@ const
syscall_nr_kill = 37;
syscall_nr_link = 9;
syscall_nr_listen = 106;
syscall_nr_lseek = 199;
syscall_nr_lseek = 478;
syscall_nr_lstat = 190;
syscall_nr_mkdir = 136;
syscall_nr_mknod = 14;
syscall_nr_mmap = 197;
syscall_nr_mmap = 477;
syscall_nr_open = 5;
syscall_nr_pipe = 42;
syscall_nr_pipe2 = 542;
syscall_nr_poll = 209;
syscall_nr_read = 3;
syscall_nr_readlink = 58;

View File

@ -49,8 +49,9 @@ Function AssignPipe(var pipe_in,pipe_out:cint):cint; [public, alias : 'FPC_SYSC_
}
var
pip : tfildes;
flags : cint;
begin
assignPipe:=fppipe(pip);
assignPipe:=fppipe(pip, 0);
pipe_in:=pip[0];
pipe_out:=pip[1];
end;

View File

@ -34,7 +34,11 @@ Type TGrpArr = Array [0..0] of TGid; { C style array workarounds}
Function FpChmod (path : pChar; Mode : TMode): cInt;
Function FpChown (path : pChar; owner : TUid; group : TGid): cInt;
Function FpUtime (path : pChar; times : putimbuf): cInt;
{$if defined(freebsd)}
Function FpPipe (var fildes : tfildes; flags : cInt):cInt;
{$else}
Function FpPipe (var fildes : tfildes):cInt;
{$endif}
Function FpDup (fildes : cInt): cInt; external name 'FPC_SYSC_DUP';
Function FpDup2 (fildes, fildes2 : cInt): cInt; external name 'FPC_SYSC_DUP2';
Function FpTimes (var buffer : tms): TClock;