|
From: <sv...@va...> - 2010-02-23 10:49:56
|
Author: tom
Date: 2010-02-23 10:49:48 +0000 (Tue, 23 Feb 2010)
New Revision: 11055
Log:
Add a wrapper for the splice system call and wire it up on
x86 and amd64 systems. Closes #205788.
Modified:
trunk/coregrind/m_syswrap/priv_syswrap-linux.h
trunk/coregrind/m_syswrap/syswrap-amd64-linux.c
trunk/coregrind/m_syswrap/syswrap-linux.c
trunk/coregrind/m_syswrap/syswrap-x86-linux.c
Modified: trunk/coregrind/m_syswrap/priv_syswrap-linux.h
===================================================================
--- trunk/coregrind/m_syswrap/priv_syswrap-linux.h 2010-02-23 10:02:55 UTC (rev 11054)
+++ trunk/coregrind/m_syswrap/priv_syswrap-linux.h 2010-02-23 10:49:48 UTC (rev 11055)
@@ -52,6 +52,7 @@
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);
Modified: trunk/coregrind/m_syswrap/syswrap-amd64-linux.c
===================================================================
--- trunk/coregrind/m_syswrap/syswrap-amd64-linux.c 2010-02-23 10:02:55 UTC (rev 11054)
+++ trunk/coregrind/m_syswrap/syswrap-amd64-linux.c 2010-02-23 10:49:48 UTC (rev 11055)
@@ -1382,7 +1382,7 @@
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
Modified: trunk/coregrind/m_syswrap/syswrap-linux.c
===================================================================
--- trunk/coregrind/m_syswrap/syswrap-linux.c 2010-02-23 10:02:55 UTC (rev 11054)
+++ trunk/coregrind/m_syswrap/syswrap-linux.c 2010-02-23 10:49:48 UTC (rev 11055)
@@ -3497,6 +3497,30 @@
}
/* ---------------------------------------------------------------------
+ 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
------------------------------------------------------------------ */
Modified: trunk/coregrind/m_syswrap/syswrap-x86-linux.c
===================================================================
--- trunk/coregrind/m_syswrap/syswrap-x86-linux.c 2010-02-23 10:02:55 UTC (rev 11054)
+++ trunk/coregrind/m_syswrap/syswrap-x86-linux.c 2010-02-23 10:49:48 UTC (rev 11055)
@@ -2251,7 +2251,7 @@
// 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
|