]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Add a wrapper for the splice system call and wire it up on
authorTom Hughes <tom@compton.nu>
Tue, 23 Feb 2010 10:49:48 +0000 (10:49 +0000)
committerTom Hughes <tom@compton.nu>
Tue, 23 Feb 2010 10:49:48 +0000 (10:49 +0000)
x86 and amd64 systems. Closes #205788.

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@11055

coregrind/m_syswrap/priv_syswrap-linux.h
coregrind/m_syswrap/syswrap-amd64-linux.c
coregrind/m_syswrap/syswrap-linux.c
coregrind/m_syswrap/syswrap-x86-linux.c

index 01e087ec6132475401857bd28850063796bed9d7..4c6d2be4dc6609f23eb78de3277c55f2038e241d 100644 (file)
@@ -52,6 +52,7 @@ DECL_TEMPLATE(linux, sys_preadv);
 DECL_TEMPLATE(linux, sys_pwritev);
 DECL_TEMPLATE(linux, sys_dup3);
 DECL_TEMPLATE(linux, sys_getcpu);
+DECL_TEMPLATE(linux, sys_splice);
 
 // POSIX, but various sub-cases differ between Linux and Darwin.
 DECL_TEMPLATE(linux, sys_fcntl);
index dd7d1454b80be3f4b3511f51d0e85c692ebc8fd6..9ad963d95f95df8da97037a6707dd6dc6b40d1e9 100644 (file)
@@ -1382,7 +1382,7 @@ static SyscallTableEntry syscall_table[] = {
    LINX_(__NR_set_robust_list,  sys_set_robust_list),  // 273
    LINXY(__NR_get_robust_list,  sys_get_robust_list),  // 274
 
-//   LINX_(__NR_splice,            sys_ni_syscall),       // 275
+   LINX_(__NR_splice,            sys_splice),           // 275
 //   LINX_(__NR_tee,               sys_ni_syscall),       // 276
    LINX_(__NR_sync_file_range,   sys_sync_file_range),  // 277
 //   LINX_(__NR_vmsplice,          sys_ni_syscall),       // 278
index cc52e1cfa49474538f4480943d36e91ff87b5d99..e6ee2e7d170b0fe892e897dd53ca2c2b534ab142 100644 (file)
@@ -3496,6 +3496,30 @@ PRE(sys_delete_module)
    PRE_MEM_RASCIIZ("delete_module(name_user)", ARG1);
 }
 
+/* ---------------------------------------------------------------------
+   splice wrappers
+   ------------------------------------------------------------------ */
+
+PRE(sys_splice)
+{
+   *flags |= SfMayBlock;
+   PRINT("sys_splice ( %ld, %#lx, %ld, %#lx, %ld, %ld )",
+         ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
+   PRE_REG_READ6(int32_t, "splice",
+                 int, fd_in, vki_loff_t *, off_in,
+                 int, fd_out, vki_loff_t *, off_out,
+                 vki_size_t, len, unsigned int, flags);
+   if (!ML_(fd_allowed)(ARG1, "splice(fd_in)", tid, False) ||
+       !ML_(fd_allowed)(ARG3, "splice(fd_out)", tid, False)) {
+      SET_STATUS_Failure( VKI_EBADF );
+   } else {
+      if (ARG2 != 0)
+         PRE_MEM_READ( "splice(off_in)", ARG2, sizeof(vki_loff_t));
+      if (ARG4 != 0)
+         PRE_MEM_READ( "splice(off_out)", ARG4, sizeof(vki_loff_t));
+   }
+}
+
 /* ---------------------------------------------------------------------
    oprofile-related wrappers
    ------------------------------------------------------------------ */
index 8459f2f262ff7222a795e98a7da7ca98349b21f9..ae4846dc6c4f40c646f66cd1b8e171e34801e567 100644 (file)
@@ -2251,7 +2251,7 @@ static SyscallTableEntry syscall_table[] = {
 //   LINX_(__NR_unshare,                sys_unshare),          // 310
    LINX_(__NR_set_robust_list,  sys_set_robust_list),  // 311
    LINXY(__NR_get_robust_list,  sys_get_robust_list),  // 312
-//   LINX_(__NR_splice,            sys_ni_syscall),       // 313
+   LINX_(__NR_splice,            sys_splice),           // 313
    LINX_(__NR_sync_file_range,   sys_sync_file_range),  // 314
 
 //   LINX_(__NR_tee,               sys_ni_syscall),       // 315