1d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes/*
239bac055674d23770b9a724221b728e443196ea7Elliott Hughes * Copyright (c) 2015-2017 Dmitry V. Levin <ldv@altlinux.org>
3b755614143ce6aab5265ed32c1bb6c8f748e7898Elliott Hughes * Copyright (c) 2016-2018 The strace developers.
4d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * All rights reserved.
5d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes *
6d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Redistribution and use in source and binary forms, with or without
7d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * modification, are permitted provided that the following conditions
8d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * are met:
9d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * 1. Redistributions of source code must retain the above copyright
10d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes *    notice, this list of conditions and the following disclaimer.
11d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * 2. Redistributions in binary form must reproduce the above copyright
12d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes *    notice, this list of conditions and the following disclaimer in the
13d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes *    documentation and/or other materials provided with the distribution.
14d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * 3. The name of the author may not be used to endorse or promote products
15d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes *    derived from this software without specific prior written permission.
16d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes *
17d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes */
28d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
29d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include "defs.h"
30d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
31d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include DEF_MPERS_TYPE(timeval_t)
32d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
33d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughestypedef struct timeval timeval_t;
34d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
35d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include MPERS_DEFS
36d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
37b755614143ce6aab5265ed32c1bb6c8f748e7898Elliott Hughes#include "xstring.h"
38b755614143ce6aab5265ed32c1bb6c8f748e7898Elliott Hughes
3939bac055674d23770b9a724221b728e443196ea7Elliott Hughesstatic const char timeval_fmt[]  = "{tv_sec=%lld, tv_usec=%llu}";
40d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
41d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void
42d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesprint_timeval_t(const timeval_t *t)
43d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
4439bac055674d23770b9a724221b728e443196ea7Elliott Hughes	tprintf(timeval_fmt, (long long) t->tv_sec,
4539bac055674d23770b9a724221b728e443196ea7Elliott Hughes		zero_extend_signed_to_ull(t->tv_usec));
4639bac055674d23770b9a724221b728e443196ea7Elliott Hughes}
4739bac055674d23770b9a724221b728e443196ea7Elliott Hughes
4839bac055674d23770b9a724221b728e443196ea7Elliott Hughesstatic void
4939bac055674d23770b9a724221b728e443196ea7Elliott Hughesprint_timeval_t_utime(const timeval_t *t)
5039bac055674d23770b9a724221b728e443196ea7Elliott Hughes{
5139bac055674d23770b9a724221b728e443196ea7Elliott Hughes	print_timeval_t(t);
5239bac055674d23770b9a724221b728e443196ea7Elliott Hughes	tprints_comment(sprinttime_usec(t->tv_sec,
5339bac055674d23770b9a724221b728e443196ea7Elliott Hughes		zero_extend_signed_to_ull(t->tv_usec)));
54d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
55d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
56d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott HughesMPERS_PRINTER_DECL(void, print_struct_timeval, const void *arg)
57d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
58d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	print_timeval_t(arg);
59d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
60d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
61dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott HughesMPERS_PRINTER_DECL(bool, print_struct_timeval_data_size,
62dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes		   const void *arg, const size_t size)
63dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes{
64dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes	if (size < sizeof(timeval_t)) {
65dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes		tprints("?");
66dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes		return false;
67dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes	}
68dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes
69dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes	print_timeval_t(arg);
70dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes	return true;
71dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes}
72dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes
73d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott HughesMPERS_PRINTER_DECL(void, print_timeval,
74d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		   struct tcb *const tcp, const kernel_ulong_t addr)
75d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
76d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	timeval_t t;
77d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
78d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	if (umove_or_printaddr(tcp, addr, &t))
79d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		return;
80d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
81d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	print_timeval_t(&t);
82d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
83d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
8439bac055674d23770b9a724221b728e443196ea7Elliott HughesMPERS_PRINTER_DECL(void, print_timeval_utimes,
85d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		   struct tcb *const tcp, const kernel_ulong_t addr)
86d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
8739bac055674d23770b9a724221b728e443196ea7Elliott Hughes	timeval_t t[2];
88d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
8939bac055674d23770b9a724221b728e443196ea7Elliott Hughes	if (umove_or_printaddr(tcp, addr, &t))
9039bac055674d23770b9a724221b728e443196ea7Elliott Hughes		return;
9139bac055674d23770b9a724221b728e443196ea7Elliott Hughes
9239bac055674d23770b9a724221b728e443196ea7Elliott Hughes	tprints("[");
9339bac055674d23770b9a724221b728e443196ea7Elliott Hughes	print_timeval_t_utime(&t[0]);
9439bac055674d23770b9a724221b728e443196ea7Elliott Hughes	tprints(", ");
9539bac055674d23770b9a724221b728e443196ea7Elliott Hughes	print_timeval_t_utime(&t[1]);
9639bac055674d23770b9a724221b728e443196ea7Elliott Hughes	tprints("]");
97d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
98d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
99d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott HughesMPERS_PRINTER_DECL(const char *, sprint_timeval,
100d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		   struct tcb *const tcp, const kernel_ulong_t addr)
101d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
102d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	timeval_t t;
103d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	static char buf[sizeof(timeval_fmt) + 3 * sizeof(t)];
104d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
105d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	if (!addr) {
106d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		strcpy(buf, "NULL");
107d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	} else if (!verbose(tcp) || (exiting(tcp) && syserror(tcp)) ||
108d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		   umove(tcp, addr, &t)) {
109b755614143ce6aab5265ed32c1bb6c8f748e7898Elliott Hughes		xsprintf(buf, "%#" PRI_klx, addr);
110d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	} else {
111b755614143ce6aab5265ed32c1bb6c8f748e7898Elliott Hughes		xsprintf(buf, timeval_fmt,
11239bac055674d23770b9a724221b728e443196ea7Elliott Hughes			 (long long) t.tv_sec,
11339bac055674d23770b9a724221b728e443196ea7Elliott Hughes			 zero_extend_signed_to_ull(t.tv_usec));
114d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	}
115d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
116d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	return buf;
117d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
118d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
119d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott HughesMPERS_PRINTER_DECL(void, print_itimerval,
120d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		   struct tcb *const tcp, const kernel_ulong_t addr)
121d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
122d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	timeval_t t[2];
123d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
124d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	if (umove_or_printaddr(tcp, addr, &t))
125d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		return;
126d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
127d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	tprints("{it_interval=");
128d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	print_timeval_t(&t[0]);
129d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	tprints(", it_value=");
130d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	print_timeval_t(&t[1]);
131d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	tprints("}");
132d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
133d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
134d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#ifdef ALPHA
135d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
136d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesvoid
137d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesprint_timeval32_t(const timeval32_t *t)
138d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
13939bac055674d23770b9a724221b728e443196ea7Elliott Hughes	tprintf(timeval_fmt, (long long) t->tv_sec,
14039bac055674d23770b9a724221b728e443196ea7Elliott Hughes		zero_extend_signed_to_ull(t->tv_usec));
14139bac055674d23770b9a724221b728e443196ea7Elliott Hughes}
14239bac055674d23770b9a724221b728e443196ea7Elliott Hughes
14339bac055674d23770b9a724221b728e443196ea7Elliott Hughesstatic void
14439bac055674d23770b9a724221b728e443196ea7Elliott Hughesprint_timeval32_t_utime(const timeval32_t *t)
14539bac055674d23770b9a724221b728e443196ea7Elliott Hughes{
14639bac055674d23770b9a724221b728e443196ea7Elliott Hughes	print_timeval32_t(t);
14739bac055674d23770b9a724221b728e443196ea7Elliott Hughes	tprints_comment(sprinttime_usec(t->tv_sec,
14839bac055674d23770b9a724221b728e443196ea7Elliott Hughes		zero_extend_signed_to_ull(t->tv_usec)));
149d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
150d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
151d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesvoid
152d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesprint_timeval32(struct tcb *const tcp, const kernel_ulong_t addr)
153d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
154d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	timeval32_t t;
155d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
156d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	if (umove_or_printaddr(tcp, addr, &t))
157d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		return;
158d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
159d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	print_timeval32_t(&t);
160d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
161d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
162d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesvoid
16339bac055674d23770b9a724221b728e443196ea7Elliott Hughesprint_timeval32_utimes(struct tcb *const tcp, const kernel_ulong_t addr)
164d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
165d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	timeval32_t t[2];
166d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
167d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	if (umove_or_printaddr(tcp, addr, &t))
168d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		return;
169d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
170d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	tprints("[");
17139bac055674d23770b9a724221b728e443196ea7Elliott Hughes	print_timeval32_t_utime(&t[0]);
172d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	tprints(", ");
17339bac055674d23770b9a724221b728e443196ea7Elliott Hughes	print_timeval32_t_utime(&t[1]);
174d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	tprints("]");
175d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
176d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
177d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesvoid
178d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesprint_itimerval32(struct tcb *const tcp, const kernel_ulong_t addr)
179d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
180d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	timeval32_t t[2];
181d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
182d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	if (umove_or_printaddr(tcp, addr, &t))
183d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		return;
184d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
185d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	tprints("{it_interval=");
186d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	print_timeval32_t(&t[0]);
187d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	tprints(", it_value=");
188d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	print_timeval32_t(&t[1]);
189d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	tprints("}");
190d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
191d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
192d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesconst char *
193d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughessprint_timeval32(struct tcb *const tcp, const kernel_ulong_t addr)
194d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
195d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	timeval32_t t;
196d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	static char buf[sizeof(timeval_fmt) + 3 * sizeof(t)];
197d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
198d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	if (!addr) {
199d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		strcpy(buf, "NULL");
200d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	} else if (!verbose(tcp) || (exiting(tcp) && syserror(tcp)) ||
201d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		   umove(tcp, addr, &t)) {
202b755614143ce6aab5265ed32c1bb6c8f748e7898Elliott Hughes		xsprintf(buf, "%#" PRI_klx, addr);
203d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	} else {
204b755614143ce6aab5265ed32c1bb6c8f748e7898Elliott Hughes		xsprintf(buf, timeval_fmt,
20539bac055674d23770b9a724221b728e443196ea7Elliott Hughes			 (long long) t.tv_sec,
20639bac055674d23770b9a724221b728e443196ea7Elliott Hughes			 zero_extend_signed_to_ull(t.tv_usec));
207d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	}
208d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
209d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	return buf;
210d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
211d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
212d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#endif /* ALPHA */
213