From: Tom Hughes Date: Thu, 30 Jan 2014 22:33:02 +0000 (+0000) Subject: Add support for the clock_adjtime system call. X-Git-Tag: svn/VALGRIND_3_10_0~651 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6ef2cbe59dbbf130def3546ea4f618da7e7bfb61;p=thirdparty%2Fvalgrind.git Add support for the clock_adjtime system call. Based on a patch from Stefan Sørensen on BZ#330469. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@13785 --- diff --git a/NEWS b/NEWS index cac1d70cf8..44b1887c11 100644 --- a/NEWS +++ b/NEWS @@ -47,6 +47,7 @@ where XXXXXX is the bug number as listed below. 328711 valgrind.1 manpage "memcheck options" section is badly generated 329612 Incorrect handling of AT_BASE for image execution 330459 --track-fds=yes doesn't track eventfds +330469 Add clock_adjtime syscall support Release 3.9.0 (31 October 2013) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/coregrind/m_syswrap/priv_syswrap-linux.h b/coregrind/m_syswrap/priv_syswrap-linux.h index 5db490058c..0bdf660948 100644 --- a/coregrind/m_syswrap/priv_syswrap-linux.h +++ b/coregrind/m_syswrap/priv_syswrap-linux.h @@ -146,6 +146,7 @@ DECL_TEMPLATE(linux, sys_clock_settime); DECL_TEMPLATE(linux, sys_clock_gettime); DECL_TEMPLATE(linux, sys_clock_getres); DECL_TEMPLATE(linux, sys_clock_nanosleep); +DECL_TEMPLATE(linux, sys_clock_adjtime); DECL_TEMPLATE(linux, sys_timer_create); // Linux: varies across archs? DECL_TEMPLATE(linux, sys_timer_settime); diff --git a/coregrind/m_syswrap/syswrap-amd64-linux.c b/coregrind/m_syswrap/syswrap-amd64-linux.c index 82cbb327c7..c4e65d5579 100644 --- a/coregrind/m_syswrap/syswrap-amd64-linux.c +++ b/coregrind/m_syswrap/syswrap-amd64-linux.c @@ -1074,7 +1074,7 @@ static SyscallTableEntry syscall_table[] = { LINXY(__NR_name_to_handle_at, sys_name_to_handle_at),// 303 LINXY(__NR_open_by_handle_at, sys_open_by_handle_at),// 304 -// LINX_(__NR_clock_adjtime, sys_ni_syscall), // 305 + LINXY(__NR_clock_adjtime, sys_clock_adjtime), // 305 // LINX_(__NR_syncfs, sys_ni_syscall), // 306 LINXY(__NR_sendmmsg, sys_sendmmsg), // 307 // LINX_(__NR_setns, sys_ni_syscall), // 308 diff --git a/coregrind/m_syswrap/syswrap-arm-linux.c b/coregrind/m_syswrap/syswrap-arm-linux.c index d6c5530c6c..431c1ca0e8 100644 --- a/coregrind/m_syswrap/syswrap-arm-linux.c +++ b/coregrind/m_syswrap/syswrap-arm-linux.c @@ -1226,7 +1226,8 @@ static SyscallTableEntry syscall_main_table[] = { LINX_(__NR_fanotify_mark, sys_fanotify_mark), // 368 LINXY(__NR_prlimit64, sys_prlimit64), // 369 LINXY(__NR_name_to_handle_at, sys_name_to_handle_at),// 370 - LINXY(__NR_open_by_handle_at, sys_open_by_handle_at) // 371 + LINXY(__NR_open_by_handle_at, sys_open_by_handle_at),// 371 + LINXY(__NR_clock_adjtime, sys_clock_adjtime) // 372 }; diff --git a/coregrind/m_syswrap/syswrap-arm64-linux.c b/coregrind/m_syswrap/syswrap-arm64-linux.c index 94aac68ceb..669bad0171 100644 --- a/coregrind/m_syswrap/syswrap-arm64-linux.c +++ b/coregrind/m_syswrap/syswrap-arm64-linux.c @@ -1295,7 +1295,8 @@ static SyscallTableEntry syscall_main_table[] = { //ZZ LINXY(__NR_accept4, sys_accept4), // 366 //ZZ //ZZ LINXY(__NR_name_to_handle_at, sys_name_to_handle_at),// 370 -//ZZ LINXY(__NR_open_by_handle_at, sys_open_by_handle_at) // 371 +//ZZ LINXY(__NR_open_by_handle_at, sys_open_by_handle_at),// 371 +//ZZ LINXY(__NR_clock_adjtime, sys_clock_adjtime) // 372 }; diff --git a/coregrind/m_syswrap/syswrap-linux.c b/coregrind/m_syswrap/syswrap-linux.c index c0b336782c..b50cdd89db 100644 --- a/coregrind/m_syswrap/syswrap-linux.c +++ b/coregrind/m_syswrap/syswrap-linux.c @@ -814,6 +814,40 @@ POST(sys_adjtimex) POST_MEM_WRITE( ARG1, sizeof(struct vki_timex) ); } +PRE(sys_clock_adjtime) +{ + struct vki_timex *tx = (struct vki_timex *)ARG2; + PRINT("sys_clock_adjtime ( %ld, %#lx )", ARG1,ARG2); + PRE_REG_READ2(long, "clock_adjtime", vki_clockid_t, id, struct timex *, buf); + PRE_MEM_READ( "clock_adjtime(timex->modes)", ARG2, sizeof(tx->modes)); + +#define ADJX(bits,field) \ + if (tx->modes & (bits)) \ + PRE_MEM_READ( "clock_adjtime(timex->"#field")", \ + (Addr)&tx->field, sizeof(tx->field)) + + if (tx->modes & VKI_ADJ_ADJTIME) { + if (!(tx->modes & VKI_ADJ_OFFSET_READONLY)) + PRE_MEM_READ( "clock_adjtime(timex->offset)", (Addr)&tx->offset, sizeof(tx->offset)); + } else { + ADJX(VKI_ADJ_OFFSET, offset); + ADJX(VKI_ADJ_FREQUENCY, freq); + ADJX(VKI_ADJ_MAXERROR, maxerror); + ADJX(VKI_ADJ_ESTERROR, esterror); + ADJX(VKI_ADJ_STATUS, status); + ADJX(VKI_ADJ_TIMECONST|VKI_ADJ_TAI, constant); + ADJX(VKI_ADJ_TICK, tick); + } +#undef ADJX + + PRE_MEM_WRITE( "adjtimex(timex)", ARG2, sizeof(struct vki_timex)); +} + +POST(sys_clock_adjtime) +{ + POST_MEM_WRITE( ARG2, sizeof(struct vki_timex) ); +} + PRE(sys_ioperm) { PRINT("sys_ioperm ( %ld, %ld, %ld )", ARG1, ARG2, ARG3 ); diff --git a/coregrind/m_syswrap/syswrap-mips32-linux.c b/coregrind/m_syswrap/syswrap-mips32-linux.c index e5f4f30c8e..c0cd811bfc 100644 --- a/coregrind/m_syswrap/syswrap-mips32-linux.c +++ b/coregrind/m_syswrap/syswrap-mips32-linux.c @@ -1128,6 +1128,8 @@ static SyscallTableEntry syscall_main_table[] = { //.. LINXY (__NR_prlimit64, sys_prlimit64), // 338 //.. + LINXY (__NR_clock_adjtime, sys_clock_adjtime), // 341 + //.. LINXY (__NR_process_vm_readv, sys_process_vm_readv), // 345 LINX_ (__NR_process_vm_writev, sys_process_vm_writev) // 346 }; diff --git a/coregrind/m_syswrap/syswrap-mips64-linux.c b/coregrind/m_syswrap/syswrap-mips64-linux.c index bab3aaa72f..fb5067c393 100644 --- a/coregrind/m_syswrap/syswrap-mips64-linux.c +++ b/coregrind/m_syswrap/syswrap-mips64-linux.c @@ -921,6 +921,7 @@ static SyscallTableEntry syscall_main_table[] = { LINXY (__NR_timerfd_settime, sys_timerfd_settime), LINXY (__NR_newfstatat, sys_newfstatat), LINXY (__NR_prlimit64, sys_prlimit64), + LINXY (__NR_clock_adjtime, sys_clock_adjtime), LINXY (__NR_process_vm_readv, sys_process_vm_readv), LINX_ (__NR_process_vm_writev, sys_process_vm_writev) }; diff --git a/coregrind/m_syswrap/syswrap-ppc32-linux.c b/coregrind/m_syswrap/syswrap-ppc32-linux.c index e808c42549..c79156c41f 100644 --- a/coregrind/m_syswrap/syswrap-ppc32-linux.c +++ b/coregrind/m_syswrap/syswrap-ppc32-linux.c @@ -1257,6 +1257,8 @@ static SyscallTableEntry syscall_table[] = { LINX_(__NR_pwritev, sys_pwritev), // 321 LINXY(__NR_rt_tgsigqueueinfo, sys_rt_tgsigqueueinfo),// 322 + LINX_(__NR_clock_adjtime, sys_clock_adjtime), // 347 + LINXY(__NR_process_vm_readv, sys_process_vm_readv), // 351 LINX_(__NR_process_vm_writev, sys_process_vm_writev) // 352 }; diff --git a/coregrind/m_syswrap/syswrap-ppc64-linux.c b/coregrind/m_syswrap/syswrap-ppc64-linux.c index 234778cb08..86c67d4be6 100644 --- a/coregrind/m_syswrap/syswrap-ppc64-linux.c +++ b/coregrind/m_syswrap/syswrap-ppc64-linux.c @@ -1050,6 +1050,8 @@ static SyscallTableEntry syscall_table[] = { LINX_(__NR_pwritev, sys_pwritev), // 321 LINXY(__NR_rt_tgsigqueueinfo, sys_rt_tgsigqueueinfo),// 322 + LINXY(__NR_clock_adjtime, sys_clock_adjtime), // 347 + LINXY(__NR_process_vm_readv, sys_process_vm_readv), // 351 LINX_(__NR_process_vm_writev, sys_process_vm_writev) // 352 }; diff --git a/coregrind/m_syswrap/syswrap-s390x-linux.c b/coregrind/m_syswrap/syswrap-s390x-linux.c index 686f7f2d3c..f9bc136136 100644 --- a/coregrind/m_syswrap/syswrap-s390x-linux.c +++ b/coregrind/m_syswrap/syswrap-s390x-linux.c @@ -1056,7 +1056,7 @@ static SyscallTableEntry syscall_table[] = { LINXY(__NR_prlimit64, sys_prlimit64), // 334 // ?????(__NR_name_to_handle_at, ), // 335 // ?????(__NR_open_by_handle_at, ), // 336 -// ?????(__NR_clock_adjtime, ), // 337 + LINXY(__NR_clock_adjtime, sys_clock_adjtime), // 337 // ?????(__NR_syncfs, ), // 338 // ?????(__NR_setns, ), // 339 LINXY(__NR_process_vm_readv, sys_process_vm_readv), // 340 diff --git a/coregrind/m_syswrap/syswrap-x86-linux.c b/coregrind/m_syswrap/syswrap-x86-linux.c index 5e45f0c8e4..e5b78afeb5 100644 --- a/coregrind/m_syswrap/syswrap-x86-linux.c +++ b/coregrind/m_syswrap/syswrap-x86-linux.c @@ -1827,7 +1827,7 @@ static SyscallTableEntry syscall_table[] = { LINXY(__NR_prlimit64, sys_prlimit64), // 340 LINXY(__NR_name_to_handle_at, sys_name_to_handle_at),// 341 LINXY(__NR_open_by_handle_at, sys_open_by_handle_at),// 342 -// LINX_(__NR_clock_adjtime, sys_ni_syscall), // 343 + LINXY(__NR_clock_adjtime, sys_clock_adjtime), // 343 // LINX_(__NR_syncfs, sys_ni_syscall), // 344 LINXY(__NR_sendmmsg, sys_sendmmsg), // 345