Przeglądaj źródła

* update sysnr.inc for x86 and x86_64 to latest kernel
* add splice syscall to linux unit for x86 and x86_64

git-svn-id: trunk@8364 -

Almindor 18 lat temu
rodzic
commit
6fd901181a
3 zmienionych plików z 89 dodań i 182 usunięć
  1. 26 180
      rtl/linux/i386/sysnr.inc
  2. 38 2
      rtl/linux/linux.pp
  3. 25 0
      rtl/linux/x86_64/sysnr.inc

+ 26 - 180
rtl/linux/i386/sysnr.inc

@@ -313,184 +313,30 @@ Const
         syscall_nr_inotify_init          = 291;
         syscall_nr_inotify_add_watch     = 292;
         syscall_nr_inotify_rm_watch      = 293;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+        syscall_nr_migrate_pages         = 294;
+        syscall_nr_openat                = 295;
+        syscall_nr_mkdirat               = 296;
+        syscall_nr_mknodat               = 297;
+        syscall_nr_fchownat              = 298;
+        syscall_nr_futimesat             = 299;
+        syscall_nr_fstatat64             = 300;
+        syscall_nr_unlinkat              = 301;
+        syscall_nr_renameat              = 302;
+        syscall_nr_linkat                = 303;
+        syscall_nr_symlinkat             = 304;
+        syscall_nr_readlinkat            = 305;
+        syscall_nr_fchmodat              = 306;
+        syscall_nr_faccessat             = 307;
+        syscall_nr_pselect6              = 308;
+        syscall_nr_ppoll                 = 309;
+        syscall_nr_unshare               = 310;
+        syscall_nr_set_robust_list       = 311;
+        syscall_nr_get_robust_list       = 312;
+        syscall_nr_splice                = 313;
+        syscall_nr_sync_file_range       = 314;
+        syscall_nr_tee                   = 315;
+        syscall_nr_vmsplice              = 316;
+        syscall_nr_move_pages            = 317;
+        syscall_nr_getcpu                = 318;
+        syscall_nr_epoll_pwait           = 319;
 

+ 38 - 2
rtl/linux/linux.pp

@@ -22,7 +22,7 @@ unit Linux;
 interface
 
 uses
-  ctypes;
+  BaseUnix;//, ctypes;
 
 type
   TSysInfo = record
@@ -295,6 +295,28 @@ const CAP_CHOWN            = 0;
 
       LINUX_CAPABILITY_VERSION = $19980330;
 
+
+//***********************************************SPLICE from kernel 2.6.17+****************************************
+
+const
+{* Flags for SPLICE and VMSPLICE.  *}
+  SPLICE_F_MOVE		= 1;   { Move pages instead of copying.  }
+  SPLICE_F_NONBLOCK	= 2;   {* Don't block on the pipe splicing
+                            (but we may still block on the fd
+                                        we splice from/to).  *}
+  SPLICE_F_MORE	    = 4;   {* Expect more data.  *}
+  SPLICE_F_GIFT	    = 8;   {* Pages passed in are a gift.  *}
+
+{$ifdef x86}
+{* Splice address range into a pipe.  *}
+function vmsplice (fdout: cInt; iov: PIOVec; count: size_t; flags: cuInt): cInt; {$ifdef FPC_USE_LIBC} cdecl; external name 'vmsplice'; {$ENDIF}
+
+{* Splice two files together.  *}
+// NOTE: offin and offout should be "off64_t" but we don't have that type. It's an "always 64 bit offset" so I use cint64
+function splice (fdin: cInt; offin: cInt64; fdout: cInt; offout: cInt64; len: size_t; flags: cuInt): cInt; {$ifdef FPC_USE_LIBC} cdecl; external name 'splice'; {$ENDIF}
+
+{$endif} // x86
+
 implementation
 
 
@@ -416,6 +438,21 @@ begin
   capset:=do_syscall(syscall_nr_capset,Tsysparam(header),Tsysparam(data));
 end;
 
+// TODO: update also on non x86!
+{$ifdef x86} // didn't update syscall_nr on others yet
+
+function vmsplice (fdout: cInt; iov: PIOVec; count: size_t; flags: cuInt): cInt;
+begin
+  vmsplice := do_syscall(syscall_nr_vmsplice, TSysParam(fdout), TSysParam(iov), TSysParam(count), TSysParam(flags));
+end;
+
+function splice (fdin: cInt; offin: cint64; fdout: cInt; offout: cint64; len: size_t; flags: cuInt): cInt; 
+begin
+  splice := do_syscall(syscall_nr_splice, TSysParam(fdin), TSysParam(offin), TSysParam(fdout), TSysParam(offout), 
+                       TSysParam(len), TSysParam(flags));
+end;
+{$endif} // x86
+
 {$endif}
 
 { FUTEX_OP is a macro, doesn't exist in libC as function}
@@ -424,5 +461,4 @@ begin
   FUTEX_OP := ((op and $F) shl 28) or ((cmp and $F) shl 24) or ((oparg and $FFF) shl 12) or (cmparg and $FFF);
 end;
 
-
 end.

+ 25 - 0
rtl/linux/x86_64/sysnr.inc

@@ -316,3 +316,28 @@ const
   syscall_nr_inotify_add_watch  = 254;
   syscall_nr_inotify_rm_watch   = 255;
 
+  syscall_migrate_pages	        = 256;
+  syscall_openat		        = 257;
+  syscall_mkdirat		        = 258;
+  syscall_mknodat		        = 259;
+  syscall_fchownat		        = 260;
+  syscall_futimesat		        = 261;
+  syscall_newfstatat		    = 262;
+  syscall_unlinkat		        = 263;
+  syscall_renameat		        = 264;
+  syscall_linkat		        = 265;
+  syscall_symlinkat		        = 266;
+  syscall_readlinkat		    = 267;
+  syscall_fchmodat		        = 268;
+  syscall_faccessat		        = 269;
+  syscall_pselect6		        = 270;
+  syscall_ppoll		            = 271;
+  syscall_unshare		        = 272;
+  syscall_set_robust_list	    = 273;
+  syscall_get_robust_list	    = 274;
+  syscall_splice		        = 275;
+  syscall_tee		            = 276;
+  syscall_sync_file_range	    = 277;
+  syscall_vmsplice		        = 278;
+  syscall_move_pages		    = 279;
+