From: Tom Hughes Date: Tue, 23 Feb 2010 10:49:48 +0000 (+0000) Subject: Add a wrapper for the splice system call and wire it up on X-Git-Tag: svn/VALGRIND_3_6_0~369 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0e953082598366277166ce8709b02ff3d1fdefbf;p=thirdparty%2Fvalgrind.git Add a wrapper for the splice system call and wire it up on x86 and amd64 systems. Closes #205788. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@11055 --- diff --git a/coregrind/m_syswrap/priv_syswrap-linux.h b/coregrind/m_syswrap/priv_syswrap-linux.h index 01e087ec61..4c6d2be4dc 100644 --- a/coregrind/m_syswrap/priv_syswrap-linux.h +++ b/coregrind/m_syswrap/priv_syswrap-linux.h @@ -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); diff --git a/coregrind/m_syswrap/syswrap-amd64-linux.c b/coregrind/m_syswrap/syswrap-amd64-linux.c index dd7d1454b8..9ad963d95f 100644 --- a/coregrind/m_syswrap/syswrap-amd64-linux.c +++ b/coregrind/m_syswrap/syswrap-amd64-linux.c @@ -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 diff --git a/coregrind/m_syswrap/syswrap-linux.c b/coregrind/m_syswrap/syswrap-linux.c index cc52e1cfa4..e6ee2e7d17 100644 --- a/coregrind/m_syswrap/syswrap-linux.c +++ b/coregrind/m_syswrap/syswrap-linux.c @@ -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 ------------------------------------------------------------------ */ diff --git a/coregrind/m_syswrap/syswrap-x86-linux.c b/coregrind/m_syswrap/syswrap-x86-linux.c index 8459f2f262..ae4846dc6c 100644 --- a/coregrind/m_syswrap/syswrap-x86-linux.c +++ b/coregrind/m_syswrap/syswrap-x86-linux.c @@ -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