From 6fd901181ad62f79b91666ab3bffd98d768a4d39 Mon Sep 17 00:00:00 2001 From: Almindor Date: Sun, 2 Sep 2007 22:06:04 +0000 Subject: [PATCH] * 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 - --- rtl/linux/i386/sysnr.inc | 206 +++++-------------------------------- rtl/linux/linux.pp | 40 ++++++- rtl/linux/x86_64/sysnr.inc | 25 +++++ 3 files changed, 89 insertions(+), 182 deletions(-) diff --git a/rtl/linux/i386/sysnr.inc b/rtl/linux/i386/sysnr.inc index 2b688e44ec..cb7c3f62af 100644 --- a/rtl/linux/i386/sysnr.inc +++ b/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; diff --git a/rtl/linux/linux.pp b/rtl/linux/linux.pp index a2635d84bb..a6907a74b0 100644 --- a/rtl/linux/linux.pp +++ b/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. diff --git a/rtl/linux/x86_64/sysnr.inc b/rtl/linux/x86_64/sysnr.inc index 6c5a0057d1..9437676194 100644 --- a/rtl/linux/x86_64/sysnr.inc +++ b/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; +