2 * Copyright (c) 1991, 1992 Paul Kranenburg <pk@cs.few.eur.nl>
3 * Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
4 * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com>
5 * Copyright (c) 1996-2019 The strace developers.
8 * SPDX-License-Identifier: LGPL-2.1-or-later
14 #include <sys/timex.h>
17 print_timezone(struct tcb *const tcp, const kernel_ulong_t addr)
21 if (umove_or_printaddr(tcp, addr, &tz))
24 tprintf("{tz_minuteswest=%d, tz_dsttime=%d}",
25 tz.tz_minuteswest, tz.tz_dsttime);
28 SYS_FUNC(gettimeofday)
31 print_timeval(tcp, tcp->u_arg[0]);
33 print_timezone(tcp, tcp->u_arg[1]);
39 SYS_FUNC(osf_gettimeofday)
42 print_timeval32(tcp, tcp->u_arg[0]);
44 print_timezone(tcp, tcp->u_arg[1]);
50 SYS_FUNC(settimeofday)
52 print_timeval(tcp, tcp->u_arg[0]);
54 print_timezone(tcp, tcp->u_arg[1]);
60 SYS_FUNC(osf_settimeofday)
62 print_timeval32(tcp, tcp->u_arg[0]);
64 print_timezone(tcp, tcp->u_arg[1]);
70 #if HAVE_ARCH_TIME32_SYSCALLS || HAVE_ARCH_OLD_TIME64_SYSCALLS
72 do_nanosleep(struct tcb *const tcp, const print_obj_by_addr_fn print_ts)
75 print_ts(tcp, tcp->u_arg[0]);
80 * Second (returned) timespec is only significant if syscall
81 * was interrupted. On success and in case of other errors we
82 * print only its address, since kernel doesn't modify it,
83 * and printing the value may show uninitialized data.
85 if (is_erestart(tcp)) {
86 temporarily_clear_syserror(tcp);
87 print_ts(tcp, tcp->u_arg[1]);
88 restore_cleared_syserror(tcp);
90 printaddr(tcp->u_arg[1]);
95 #endif /* HAVE_ARCH_TIME32_SYSCALLS || HAVE_ARCH_OLD_TIME64_SYSCALLS */
97 #if HAVE_ARCH_TIME32_SYSCALLS
98 SYS_FUNC(nanosleep_time32)
100 return do_nanosleep(tcp, print_timespec32);
104 #if HAVE_ARCH_OLD_TIME64_SYSCALLS
105 SYS_FUNC(nanosleep_time64)
107 return do_nanosleep(tcp, print_timespec64);
111 #include "xlat/itimer_which.h"
116 printxval(itimer_which, tcp->u_arg[0], "ITIMER_???");
119 print_itimerval(tcp, tcp->u_arg[1]);
125 SYS_FUNC(osf_getitimer)
128 printxval(itimer_which, tcp->u_arg[0], "ITIMER_???");
131 print_itimerval32(tcp, tcp->u_arg[1]);
140 printxval(itimer_which, tcp->u_arg[0], "ITIMER_???");
142 print_itimerval(tcp, tcp->u_arg[1]);
145 print_itimerval(tcp, tcp->u_arg[2]);
151 SYS_FUNC(osf_setitimer)
154 printxval(itimer_which, tcp->u_arg[0], "ITIMER_???");
156 print_itimerval32(tcp, tcp->u_arg[1]);
159 print_itimerval32(tcp, tcp->u_arg[2]);
165 #include "xlat/adjtimex_state.h"
168 do_adjtimex(struct tcb *const tcp, const print_obj_by_addr_fn print_tx,
169 const kernel_ulong_t addr)
171 if (print_tx(tcp, addr))
173 tcp->auxstr = xlookup(adjtimex_state, (kernel_ulong_t) tcp->u_rval);
177 #if HAVE_ARCH_TIME32_SYSCALLS
181 return do_adjtimex(tcp, print_timex32, tcp->u_arg[0]);
186 #if HAVE_ARCH_OLD_TIME64_SYSCALLS
191 return do_adjtimex(tcp, print_timex64, tcp->u_arg[0]);
193 return do_adjtimex(tcp, print_sparc64_timex, tcp->u_arg[0]);
199 #include "xlat/clockflags.h"
200 #include "xlat/clocknames.h"
203 printclockname(int clockid)
206 # include "xlat/cpuclocknames.h"
209 if (xlat_verbose(xlat_verbosity) != XLAT_STYLE_ABBREV)
210 tprintf("%d", clockid);
212 if (xlat_verbose(xlat_verbosity) == XLAT_STYLE_RAW)
215 if (xlat_verbose(xlat_verbosity) == XLAT_STYLE_VERBOSE)
218 if ((clockid & CLOCKFD_MASK) == CLOCKFD)
219 tprintf("FD_TO_CLOCKID(%d)", CLOCKID_TO_FD(clockid));
222 CPUCLOCK_PERTHREAD(clockid) ?
223 "MAKE_THREAD_CPUCLOCK" :
224 "MAKE_PROCESS_CPUCLOCK",
225 CPUCLOCK_PID(clockid));
226 printxval(cpuclocknames, clockid & CLOCKFD_MASK,
231 if (xlat_verbose(xlat_verbosity) == XLAT_STYLE_VERBOSE)
235 printxval(clocknames, clockid, "CLOCK_???");
239 do_clock_settime(struct tcb *const tcp, const print_obj_by_addr_fn print_ts)
241 printclockname(tcp->u_arg[0]);
243 print_ts(tcp, tcp->u_arg[1]);
248 #if HAVE_ARCH_TIME32_SYSCALLS
249 SYS_FUNC(clock_settime32)
251 return do_clock_settime(tcp, print_timespec32);
255 SYS_FUNC(clock_settime64)
257 return do_clock_settime(tcp, print_timespec64);
261 do_clock_gettime(struct tcb *const tcp, const print_obj_by_addr_fn print_ts)
264 printclockname(tcp->u_arg[0]);
267 print_ts(tcp, tcp->u_arg[1]);
272 #if HAVE_ARCH_TIME32_SYSCALLS
273 SYS_FUNC(clock_gettime32)
275 return do_clock_gettime(tcp, print_timespec32);
279 SYS_FUNC(clock_gettime64)
281 return do_clock_gettime(tcp, print_timespec64);
285 do_clock_nanosleep(struct tcb *const tcp, const print_obj_by_addr_fn print_ts)
288 printclockname(tcp->u_arg[0]);
290 printflags(clockflags, tcp->u_arg[1], "TIMER_???");
292 print_ts(tcp, tcp->u_arg[2]);
296 * Second (returned) timespec is only significant
297 * if syscall was interrupted and flags is not TIMER_ABSTIME.
299 if (!tcp->u_arg[1] && is_erestart(tcp)) {
300 temporarily_clear_syserror(tcp);
301 print_ts(tcp, tcp->u_arg[3]);
302 restore_cleared_syserror(tcp);
304 printaddr(tcp->u_arg[3]);
310 #if HAVE_ARCH_TIME32_SYSCALLS
311 SYS_FUNC(clock_nanosleep_time32)
313 return do_clock_nanosleep(tcp, print_timespec32);
317 SYS_FUNC(clock_nanosleep_time64)
319 return do_clock_nanosleep(tcp, print_timespec64);
323 do_clock_adjtime(struct tcb *const tcp, const print_obj_by_addr_fn print_tx)
326 return do_adjtimex(tcp, print_tx, tcp->u_arg[1]);
327 printclockname(tcp->u_arg[0]);
332 #if HAVE_ARCH_TIME32_SYSCALLS
333 SYS_FUNC(clock_adjtime32)
335 return do_clock_adjtime(tcp, print_timex32);
339 SYS_FUNC(clock_adjtime64)
341 return do_clock_adjtime(tcp, print_timex64);
345 SYS_FUNC(clock_sparc64_adjtime)
347 return do_clock_adjtime(tcp, print_sparc64_timex);
351 SYS_FUNC(timer_create)
354 printclockname(tcp->u_arg[0]);
356 print_sigevent(tcp, tcp->u_arg[1]);
359 printnum_int(tcp, tcp->u_arg[2], "%d");
365 do_timer_settime(struct tcb *const tcp, const print_obj_by_addr_fn print_its)
368 tprintf("%d, ", (int) tcp->u_arg[0]);
369 printflags(clockflags, tcp->u_arg[1], "TIMER_???");
371 print_its(tcp, tcp->u_arg[2]);
374 print_its(tcp, tcp->u_arg[3]);
379 #if HAVE_ARCH_TIME32_SYSCALLS
380 SYS_FUNC(timer_settime32)
382 return do_timer_settime(tcp, print_itimerspec32);
386 SYS_FUNC(timer_settime64)
388 return do_timer_settime(tcp, print_itimerspec64);
392 do_timer_gettime(struct tcb *const tcp, const print_obj_by_addr_fn print_its)
395 tprintf("%d, ", (int) tcp->u_arg[0]);
397 print_its(tcp, tcp->u_arg[1]);
402 #if HAVE_ARCH_TIME32_SYSCALLS
403 SYS_FUNC(timer_gettime32)
405 return do_timer_gettime(tcp, print_itimerspec32);
409 SYS_FUNC(timer_gettime64)
411 return do_timer_gettime(tcp, print_itimerspec64);
414 #include "xlat/timerfdflags.h"
416 SYS_FUNC(timerfd_create)
418 printclockname(tcp->u_arg[0]);
420 printflags(timerfdflags, tcp->u_arg[1], "TFD_???");
422 return RVAL_DECODED | RVAL_FD;
426 do_timerfd_settime(struct tcb *const tcp, const print_obj_by_addr_fn print_its)
429 printfd(tcp, tcp->u_arg[0]);
431 printflags(timerfdflags, tcp->u_arg[1], "TFD_???");
433 print_its(tcp, tcp->u_arg[2]);
436 print_its(tcp, tcp->u_arg[3]);
441 #if HAVE_ARCH_TIME32_SYSCALLS
442 SYS_FUNC(timerfd_settime32)
444 return do_timerfd_settime(tcp, print_itimerspec32);
448 SYS_FUNC(timerfd_settime64)
450 return do_timerfd_settime(tcp, print_itimerspec64);
454 do_timerfd_gettime(struct tcb *const tcp, const print_obj_by_addr_fn print_its)
457 printfd(tcp, tcp->u_arg[0]);
460 print_its(tcp, tcp->u_arg[1]);
465 #if HAVE_ARCH_TIME32_SYSCALLS
466 SYS_FUNC(timerfd_gettime32)
468 return do_timerfd_gettime(tcp, print_itimerspec32);
472 SYS_FUNC(timerfd_gettime64)
474 return do_timerfd_gettime(tcp, print_itimerspec64);