Skip to content

Commit 5db7a79

Browse files
author
tom
committed
Add support for the tee and vmsplice system calls. BZ#304561.
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@12861 a5019735-40e9-0310-863c-91ae7b9d1cf9
1 parent 768bc7a commit 5db7a79

File tree

4 files changed

+65
-5
lines changed

4 files changed

+65
-5
lines changed

coregrind/m_syswrap/priv_syswrap-linux.h

+2
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ DECL_TEMPLATE(linux, sys_recvmmsg);
5555
DECL_TEMPLATE(linux, sys_dup3);
5656
DECL_TEMPLATE(linux, sys_getcpu);
5757
DECL_TEMPLATE(linux, sys_splice);
58+
DECL_TEMPLATE(linux, sys_tee);
59+
DECL_TEMPLATE(linux, sys_vmsplice);
5860
DECL_TEMPLATE(linux, sys_readahead);
5961
DECL_TEMPLATE(linux, sys_move_pages);
6062

coregrind/m_syswrap/syswrap-amd64-linux.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -1400,9 +1400,9 @@ static SyscallTableEntry syscall_table[] = {
14001400
LINXY(__NR_get_robust_list, sys_get_robust_list), // 274
14011401

14021402
LINX_(__NR_splice, sys_splice), // 275
1403-
// LINX_(__NR_tee, sys_ni_syscall), // 276
1403+
LINX_(__NR_tee, sys_tee), // 276
14041404
LINX_(__NR_sync_file_range, sys_sync_file_range), // 277
1405-
// LINX_(__NR_vmsplice, sys_ni_syscall), // 278
1405+
LINXY(__NR_vmsplice, sys_vmsplice), // 278
14061406
LINXY(__NR_move_pages, sys_move_pages), // 279
14071407

14081408
LINX_(__NR_utimensat, sys_utimensat), // 280

coregrind/m_syswrap/syswrap-linux.c

+59-1
Original file line numberDiff line numberDiff line change
@@ -3940,7 +3940,7 @@ PRE(sys_splice)
39403940
*flags |= SfMayBlock;
39413941
PRINT("sys_splice ( %ld, %#lx, %ld, %#lx, %ld, %ld )",
39423942
ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
3943-
PRE_REG_READ6(int32_t, "splice",
3943+
PRE_REG_READ6(vki_ssize_t, "splice",
39443944
int, fd_in, vki_loff_t *, off_in,
39453945
int, fd_out, vki_loff_t *, off_out,
39463946
vki_size_t, len, unsigned int, flags);
@@ -3955,6 +3955,64 @@ PRE(sys_splice)
39553955
}
39563956
}
39573957

3958+
PRE(sys_tee)
3959+
{
3960+
*flags |= SfMayBlock;
3961+
PRINT("sys_tree ( %ld, %ld, %ld, %ld )", ARG1,ARG2,ARG3,ARG4);
3962+
PRE_REG_READ4(vki_ssize_t, "tee",
3963+
int, fd_in, int, fd_out,
3964+
vki_size_t, len, unsigned int, flags);
3965+
if (!ML_(fd_allowed)(ARG1, "tee(fd_in)", tid, False) ||
3966+
!ML_(fd_allowed)(ARG2, "tee(fd_out)", tid, False)) {
3967+
SET_STATUS_Failure( VKI_EBADF );
3968+
}
3969+
}
3970+
3971+
PRE(sys_vmsplice)
3972+
{
3973+
Int fdfl;
3974+
*flags |= SfMayBlock;
3975+
PRINT("sys_vmsplice ( %ld, %#lx, %ld, %ld )",
3976+
ARG1,ARG2,ARG3,ARG4);
3977+
PRE_REG_READ4(vki_ssize_t, "splice",
3978+
int, fd, struct vki_iovec *, iov,
3979+
unsigned long, nr_segs, unsigned int, flags);
3980+
if (!ML_(fd_allowed)(ARG1, "vmsplice(fd)", tid, False)) {
3981+
SET_STATUS_Failure( VKI_EBADF );
3982+
} else if ((fdfl = VG_(fcntl)(ARG1, VKI_F_GETFL, 0)) < 0) {
3983+
SET_STATUS_Failure( VKI_EBADF );
3984+
} else {
3985+
const struct vki_iovec *iov;
3986+
PRE_MEM_READ( "vmsplice(iov)", ARG2, sizeof(struct vki_iovec) * ARG3 );
3987+
for (iov = (struct vki_iovec *)ARG2;
3988+
iov < (struct vki_iovec *)ARG2 + ARG3; iov++)
3989+
{
3990+
if ((fdfl & (VKI_O_WRONLY|VKI_O_RDWR)) != 0)
3991+
PRE_MEM_READ( "vmsplice(iov[...])", (Addr)iov->iov_base, iov->iov_len );
3992+
else if ((fdfl & VKI_O_RDONLY) != 0)
3993+
PRE_MEM_WRITE( "vmsplice(iov[...])", (Addr)iov->iov_base, iov->iov_len );
3994+
}
3995+
}
3996+
}
3997+
3998+
POST(sys_vmsplice)
3999+
{
4000+
vg_assert(SUCCESS);
4001+
if (RES > 0) {
4002+
Int fdfl = VG_(fcntl)(ARG1, VKI_F_GETFL, 0);
4003+
vg_assert(fdfl >= 0);
4004+
if ((fdfl & VKI_O_RDONLY) != 0)
4005+
{
4006+
const struct vki_iovec *iov;
4007+
for (iov = (struct vki_iovec *)ARG2;
4008+
iov < (struct vki_iovec *)ARG2 + ARG3; iov++)
4009+
{
4010+
POST_MEM_WRITE( (Addr)iov->iov_base, iov->iov_len );
4011+
}
4012+
}
4013+
}
4014+
}
4015+
39584016
/* ---------------------------------------------------------------------
39594017
oprofile-related wrappers
39604018
------------------------------------------------------------------ */

coregrind/m_syswrap/syswrap-x86-linux.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -2195,8 +2195,8 @@ static SyscallTableEntry syscall_table[] = {
21952195
LINX_(__NR_splice, sys_splice), // 313
21962196
LINX_(__NR_sync_file_range, sys_sync_file_range), // 314
21972197

2198-
// LINX_(__NR_tee, sys_ni_syscall), // 315
2199-
// LINX_(__NR_vmsplice, sys_ni_syscall), // 316
2198+
LINX_(__NR_tee, sys_tee), // 315
2199+
LINXY(__NR_vmsplice, sys_vmsplice), // 316
22002200
LINXY(__NR_move_pages, sys_move_pages), // 317
22012201
LINXY(__NR_getcpu, sys_getcpu), // 318
22022202
LINXY(__NR_epoll_pwait, sys_epoll_pwait), // 319

0 commit comments

Comments
 (0)