Browse Source

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

marcoonthegit 3 years ago
parent
commit
99e3789fa3
5 changed files with 90 additions and 44 deletions
  1. 42 27
      rtl/bsd/bunxsysc.inc
  2. 32 9
      rtl/bsd/ossysc.inc
  3. 10 7
      rtl/freebsd/sysnr.inc
  4. 2 1
      rtl/freebsd/unxfunc.inc
  5. 4 0
      rtl/unix/bunxh.inc

+ 42 - 27
rtl/bsd/bunxsysc.inc

@@ -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
+function __pipe_call(sysnr:TSysParam):TSysResult; {$ifdef cpui386}oldfpccall{$endif} external name 'FPC_DOSYS0';
+
+  {$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;
-
-  fpPipe := a; // eax is in a, no matter if it worked or not
-  fildes[0] := a;
-  fildes[1] := b;
-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;

+ 32 - 9
rtl/bsd/ossysc.inc

@@ -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

+ 10 - 7
rtl/freebsd/sysnr.inc

@@ -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;

+ 2 - 1
rtl/freebsd/unxfunc.inc

@@ -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;

+ 4 - 0
rtl/unix/bunxh.inc

@@ -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;