xref: /aosp_15_r20/external/strace/print_timeval.c (revision cf84ac9a129d8ea9952db616b4e9b904c4bdde56)
1*cf84ac9aSAndroid Build Coastguard Worker /*
2*cf84ac9aSAndroid Build Coastguard Worker  * Copyright (c) 2015-2017 Dmitry V. Levin <[email protected]>
3*cf84ac9aSAndroid Build Coastguard Worker  * Copyright (c) 2016-2018 The strace developers.
4*cf84ac9aSAndroid Build Coastguard Worker  * All rights reserved.
5*cf84ac9aSAndroid Build Coastguard Worker  *
6*cf84ac9aSAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
7*cf84ac9aSAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions
8*cf84ac9aSAndroid Build Coastguard Worker  * are met:
9*cf84ac9aSAndroid Build Coastguard Worker  * 1. Redistributions of source code must retain the above copyright
10*cf84ac9aSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer.
11*cf84ac9aSAndroid Build Coastguard Worker  * 2. Redistributions in binary form must reproduce the above copyright
12*cf84ac9aSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer in the
13*cf84ac9aSAndroid Build Coastguard Worker  *    documentation and/or other materials provided with the distribution.
14*cf84ac9aSAndroid Build Coastguard Worker  * 3. The name of the author may not be used to endorse or promote products
15*cf84ac9aSAndroid Build Coastguard Worker  *    derived from this software without specific prior written permission.
16*cf84ac9aSAndroid Build Coastguard Worker  *
17*cf84ac9aSAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18*cf84ac9aSAndroid Build Coastguard Worker  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19*cf84ac9aSAndroid Build Coastguard Worker  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20*cf84ac9aSAndroid Build Coastguard Worker  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21*cf84ac9aSAndroid Build Coastguard Worker  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22*cf84ac9aSAndroid Build Coastguard Worker  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23*cf84ac9aSAndroid Build Coastguard Worker  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24*cf84ac9aSAndroid Build Coastguard Worker  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25*cf84ac9aSAndroid Build Coastguard Worker  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26*cf84ac9aSAndroid Build Coastguard Worker  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27*cf84ac9aSAndroid Build Coastguard Worker  */
28*cf84ac9aSAndroid Build Coastguard Worker 
29*cf84ac9aSAndroid Build Coastguard Worker #include "defs.h"
30*cf84ac9aSAndroid Build Coastguard Worker 
31*cf84ac9aSAndroid Build Coastguard Worker #include DEF_MPERS_TYPE(timeval_t)
32*cf84ac9aSAndroid Build Coastguard Worker 
33*cf84ac9aSAndroid Build Coastguard Worker typedef struct timeval timeval_t;
34*cf84ac9aSAndroid Build Coastguard Worker 
35*cf84ac9aSAndroid Build Coastguard Worker #include MPERS_DEFS
36*cf84ac9aSAndroid Build Coastguard Worker 
37*cf84ac9aSAndroid Build Coastguard Worker #include "xstring.h"
38*cf84ac9aSAndroid Build Coastguard Worker 
39*cf84ac9aSAndroid Build Coastguard Worker static const char timeval_fmt[]  = "{tv_sec=%lld, tv_usec=%llu}";
40*cf84ac9aSAndroid Build Coastguard Worker 
41*cf84ac9aSAndroid Build Coastguard Worker static void
print_timeval_t(const timeval_t * t)42*cf84ac9aSAndroid Build Coastguard Worker print_timeval_t(const timeval_t *t)
43*cf84ac9aSAndroid Build Coastguard Worker {
44*cf84ac9aSAndroid Build Coastguard Worker 	tprintf(timeval_fmt, (long long) t->tv_sec,
45*cf84ac9aSAndroid Build Coastguard Worker 		zero_extend_signed_to_ull(t->tv_usec));
46*cf84ac9aSAndroid Build Coastguard Worker }
47*cf84ac9aSAndroid Build Coastguard Worker 
48*cf84ac9aSAndroid Build Coastguard Worker static void
print_timeval_t_utime(const timeval_t * t)49*cf84ac9aSAndroid Build Coastguard Worker print_timeval_t_utime(const timeval_t *t)
50*cf84ac9aSAndroid Build Coastguard Worker {
51*cf84ac9aSAndroid Build Coastguard Worker 	print_timeval_t(t);
52*cf84ac9aSAndroid Build Coastguard Worker 	tprints_comment(sprinttime_usec(t->tv_sec,
53*cf84ac9aSAndroid Build Coastguard Worker 		zero_extend_signed_to_ull(t->tv_usec)));
54*cf84ac9aSAndroid Build Coastguard Worker }
55*cf84ac9aSAndroid Build Coastguard Worker 
MPERS_PRINTER_DECL(void,print_struct_timeval,const void * arg)56*cf84ac9aSAndroid Build Coastguard Worker MPERS_PRINTER_DECL(void, print_struct_timeval, const void *arg)
57*cf84ac9aSAndroid Build Coastguard Worker {
58*cf84ac9aSAndroid Build Coastguard Worker 	print_timeval_t(arg);
59*cf84ac9aSAndroid Build Coastguard Worker }
60*cf84ac9aSAndroid Build Coastguard Worker 
MPERS_PRINTER_DECL(bool,print_struct_timeval_data_size,const void * arg,const size_t size)61*cf84ac9aSAndroid Build Coastguard Worker MPERS_PRINTER_DECL(bool, print_struct_timeval_data_size,
62*cf84ac9aSAndroid Build Coastguard Worker 		   const void *arg, const size_t size)
63*cf84ac9aSAndroid Build Coastguard Worker {
64*cf84ac9aSAndroid Build Coastguard Worker 	if (size < sizeof(timeval_t)) {
65*cf84ac9aSAndroid Build Coastguard Worker 		tprints("?");
66*cf84ac9aSAndroid Build Coastguard Worker 		return false;
67*cf84ac9aSAndroid Build Coastguard Worker 	}
68*cf84ac9aSAndroid Build Coastguard Worker 
69*cf84ac9aSAndroid Build Coastguard Worker 	print_timeval_t(arg);
70*cf84ac9aSAndroid Build Coastguard Worker 	return true;
71*cf84ac9aSAndroid Build Coastguard Worker }
72*cf84ac9aSAndroid Build Coastguard Worker 
MPERS_PRINTER_DECL(void,print_timeval,struct tcb * const tcp,const kernel_ulong_t addr)73*cf84ac9aSAndroid Build Coastguard Worker MPERS_PRINTER_DECL(void, print_timeval,
74*cf84ac9aSAndroid Build Coastguard Worker 		   struct tcb *const tcp, const kernel_ulong_t addr)
75*cf84ac9aSAndroid Build Coastguard Worker {
76*cf84ac9aSAndroid Build Coastguard Worker 	timeval_t t;
77*cf84ac9aSAndroid Build Coastguard Worker 
78*cf84ac9aSAndroid Build Coastguard Worker 	if (umove_or_printaddr(tcp, addr, &t))
79*cf84ac9aSAndroid Build Coastguard Worker 		return;
80*cf84ac9aSAndroid Build Coastguard Worker 
81*cf84ac9aSAndroid Build Coastguard Worker 	print_timeval_t(&t);
82*cf84ac9aSAndroid Build Coastguard Worker }
83*cf84ac9aSAndroid Build Coastguard Worker 
MPERS_PRINTER_DECL(void,print_timeval_utimes,struct tcb * const tcp,const kernel_ulong_t addr)84*cf84ac9aSAndroid Build Coastguard Worker MPERS_PRINTER_DECL(void, print_timeval_utimes,
85*cf84ac9aSAndroid Build Coastguard Worker 		   struct tcb *const tcp, const kernel_ulong_t addr)
86*cf84ac9aSAndroid Build Coastguard Worker {
87*cf84ac9aSAndroid Build Coastguard Worker 	timeval_t t[2];
88*cf84ac9aSAndroid Build Coastguard Worker 
89*cf84ac9aSAndroid Build Coastguard Worker 	if (umove_or_printaddr(tcp, addr, &t))
90*cf84ac9aSAndroid Build Coastguard Worker 		return;
91*cf84ac9aSAndroid Build Coastguard Worker 
92*cf84ac9aSAndroid Build Coastguard Worker 	tprints("[");
93*cf84ac9aSAndroid Build Coastguard Worker 	print_timeval_t_utime(&t[0]);
94*cf84ac9aSAndroid Build Coastguard Worker 	tprints(", ");
95*cf84ac9aSAndroid Build Coastguard Worker 	print_timeval_t_utime(&t[1]);
96*cf84ac9aSAndroid Build Coastguard Worker 	tprints("]");
97*cf84ac9aSAndroid Build Coastguard Worker }
98*cf84ac9aSAndroid Build Coastguard Worker 
MPERS_PRINTER_DECL(const char *,sprint_timeval,struct tcb * const tcp,const kernel_ulong_t addr)99*cf84ac9aSAndroid Build Coastguard Worker MPERS_PRINTER_DECL(const char *, sprint_timeval,
100*cf84ac9aSAndroid Build Coastguard Worker 		   struct tcb *const tcp, const kernel_ulong_t addr)
101*cf84ac9aSAndroid Build Coastguard Worker {
102*cf84ac9aSAndroid Build Coastguard Worker 	timeval_t t;
103*cf84ac9aSAndroid Build Coastguard Worker 	static char buf[sizeof(timeval_fmt) + 3 * sizeof(t)];
104*cf84ac9aSAndroid Build Coastguard Worker 
105*cf84ac9aSAndroid Build Coastguard Worker 	if (!addr) {
106*cf84ac9aSAndroid Build Coastguard Worker 		strcpy(buf, "NULL");
107*cf84ac9aSAndroid Build Coastguard Worker 	} else if (!verbose(tcp) || (exiting(tcp) && syserror(tcp)) ||
108*cf84ac9aSAndroid Build Coastguard Worker 		   umove(tcp, addr, &t)) {
109*cf84ac9aSAndroid Build Coastguard Worker 		xsprintf(buf, "%#" PRI_klx, addr);
110*cf84ac9aSAndroid Build Coastguard Worker 	} else {
111*cf84ac9aSAndroid Build Coastguard Worker 		xsprintf(buf, timeval_fmt,
112*cf84ac9aSAndroid Build Coastguard Worker 			 (long long) t.tv_sec,
113*cf84ac9aSAndroid Build Coastguard Worker 			 zero_extend_signed_to_ull(t.tv_usec));
114*cf84ac9aSAndroid Build Coastguard Worker 	}
115*cf84ac9aSAndroid Build Coastguard Worker 
116*cf84ac9aSAndroid Build Coastguard Worker 	return buf;
117*cf84ac9aSAndroid Build Coastguard Worker }
118*cf84ac9aSAndroid Build Coastguard Worker 
MPERS_PRINTER_DECL(void,print_itimerval,struct tcb * const tcp,const kernel_ulong_t addr)119*cf84ac9aSAndroid Build Coastguard Worker MPERS_PRINTER_DECL(void, print_itimerval,
120*cf84ac9aSAndroid Build Coastguard Worker 		   struct tcb *const tcp, const kernel_ulong_t addr)
121*cf84ac9aSAndroid Build Coastguard Worker {
122*cf84ac9aSAndroid Build Coastguard Worker 	timeval_t t[2];
123*cf84ac9aSAndroid Build Coastguard Worker 
124*cf84ac9aSAndroid Build Coastguard Worker 	if (umove_or_printaddr(tcp, addr, &t))
125*cf84ac9aSAndroid Build Coastguard Worker 		return;
126*cf84ac9aSAndroid Build Coastguard Worker 
127*cf84ac9aSAndroid Build Coastguard Worker 	tprints("{it_interval=");
128*cf84ac9aSAndroid Build Coastguard Worker 	print_timeval_t(&t[0]);
129*cf84ac9aSAndroid Build Coastguard Worker 	tprints(", it_value=");
130*cf84ac9aSAndroid Build Coastguard Worker 	print_timeval_t(&t[1]);
131*cf84ac9aSAndroid Build Coastguard Worker 	tprints("}");
132*cf84ac9aSAndroid Build Coastguard Worker }
133*cf84ac9aSAndroid Build Coastguard Worker 
134*cf84ac9aSAndroid Build Coastguard Worker #ifdef ALPHA
135*cf84ac9aSAndroid Build Coastguard Worker 
136*cf84ac9aSAndroid Build Coastguard Worker void
print_timeval32_t(const timeval32_t * t)137*cf84ac9aSAndroid Build Coastguard Worker print_timeval32_t(const timeval32_t *t)
138*cf84ac9aSAndroid Build Coastguard Worker {
139*cf84ac9aSAndroid Build Coastguard Worker 	tprintf(timeval_fmt, (long long) t->tv_sec,
140*cf84ac9aSAndroid Build Coastguard Worker 		zero_extend_signed_to_ull(t->tv_usec));
141*cf84ac9aSAndroid Build Coastguard Worker }
142*cf84ac9aSAndroid Build Coastguard Worker 
143*cf84ac9aSAndroid Build Coastguard Worker static void
print_timeval32_t_utime(const timeval32_t * t)144*cf84ac9aSAndroid Build Coastguard Worker print_timeval32_t_utime(const timeval32_t *t)
145*cf84ac9aSAndroid Build Coastguard Worker {
146*cf84ac9aSAndroid Build Coastguard Worker 	print_timeval32_t(t);
147*cf84ac9aSAndroid Build Coastguard Worker 	tprints_comment(sprinttime_usec(t->tv_sec,
148*cf84ac9aSAndroid Build Coastguard Worker 		zero_extend_signed_to_ull(t->tv_usec)));
149*cf84ac9aSAndroid Build Coastguard Worker }
150*cf84ac9aSAndroid Build Coastguard Worker 
151*cf84ac9aSAndroid Build Coastguard Worker void
print_timeval32(struct tcb * const tcp,const kernel_ulong_t addr)152*cf84ac9aSAndroid Build Coastguard Worker print_timeval32(struct tcb *const tcp, const kernel_ulong_t addr)
153*cf84ac9aSAndroid Build Coastguard Worker {
154*cf84ac9aSAndroid Build Coastguard Worker 	timeval32_t t;
155*cf84ac9aSAndroid Build Coastguard Worker 
156*cf84ac9aSAndroid Build Coastguard Worker 	if (umove_or_printaddr(tcp, addr, &t))
157*cf84ac9aSAndroid Build Coastguard Worker 		return;
158*cf84ac9aSAndroid Build Coastguard Worker 
159*cf84ac9aSAndroid Build Coastguard Worker 	print_timeval32_t(&t);
160*cf84ac9aSAndroid Build Coastguard Worker }
161*cf84ac9aSAndroid Build Coastguard Worker 
162*cf84ac9aSAndroid Build Coastguard Worker void
print_timeval32_utimes(struct tcb * const tcp,const kernel_ulong_t addr)163*cf84ac9aSAndroid Build Coastguard Worker print_timeval32_utimes(struct tcb *const tcp, const kernel_ulong_t addr)
164*cf84ac9aSAndroid Build Coastguard Worker {
165*cf84ac9aSAndroid Build Coastguard Worker 	timeval32_t t[2];
166*cf84ac9aSAndroid Build Coastguard Worker 
167*cf84ac9aSAndroid Build Coastguard Worker 	if (umove_or_printaddr(tcp, addr, &t))
168*cf84ac9aSAndroid Build Coastguard Worker 		return;
169*cf84ac9aSAndroid Build Coastguard Worker 
170*cf84ac9aSAndroid Build Coastguard Worker 	tprints("[");
171*cf84ac9aSAndroid Build Coastguard Worker 	print_timeval32_t_utime(&t[0]);
172*cf84ac9aSAndroid Build Coastguard Worker 	tprints(", ");
173*cf84ac9aSAndroid Build Coastguard Worker 	print_timeval32_t_utime(&t[1]);
174*cf84ac9aSAndroid Build Coastguard Worker 	tprints("]");
175*cf84ac9aSAndroid Build Coastguard Worker }
176*cf84ac9aSAndroid Build Coastguard Worker 
177*cf84ac9aSAndroid Build Coastguard Worker void
print_itimerval32(struct tcb * const tcp,const kernel_ulong_t addr)178*cf84ac9aSAndroid Build Coastguard Worker print_itimerval32(struct tcb *const tcp, const kernel_ulong_t addr)
179*cf84ac9aSAndroid Build Coastguard Worker {
180*cf84ac9aSAndroid Build Coastguard Worker 	timeval32_t t[2];
181*cf84ac9aSAndroid Build Coastguard Worker 
182*cf84ac9aSAndroid Build Coastguard Worker 	if (umove_or_printaddr(tcp, addr, &t))
183*cf84ac9aSAndroid Build Coastguard Worker 		return;
184*cf84ac9aSAndroid Build Coastguard Worker 
185*cf84ac9aSAndroid Build Coastguard Worker 	tprints("{it_interval=");
186*cf84ac9aSAndroid Build Coastguard Worker 	print_timeval32_t(&t[0]);
187*cf84ac9aSAndroid Build Coastguard Worker 	tprints(", it_value=");
188*cf84ac9aSAndroid Build Coastguard Worker 	print_timeval32_t(&t[1]);
189*cf84ac9aSAndroid Build Coastguard Worker 	tprints("}");
190*cf84ac9aSAndroid Build Coastguard Worker }
191*cf84ac9aSAndroid Build Coastguard Worker 
192*cf84ac9aSAndroid Build Coastguard Worker const char *
sprint_timeval32(struct tcb * const tcp,const kernel_ulong_t addr)193*cf84ac9aSAndroid Build Coastguard Worker sprint_timeval32(struct tcb *const tcp, const kernel_ulong_t addr)
194*cf84ac9aSAndroid Build Coastguard Worker {
195*cf84ac9aSAndroid Build Coastguard Worker 	timeval32_t t;
196*cf84ac9aSAndroid Build Coastguard Worker 	static char buf[sizeof(timeval_fmt) + 3 * sizeof(t)];
197*cf84ac9aSAndroid Build Coastguard Worker 
198*cf84ac9aSAndroid Build Coastguard Worker 	if (!addr) {
199*cf84ac9aSAndroid Build Coastguard Worker 		strcpy(buf, "NULL");
200*cf84ac9aSAndroid Build Coastguard Worker 	} else if (!verbose(tcp) || (exiting(tcp) && syserror(tcp)) ||
201*cf84ac9aSAndroid Build Coastguard Worker 		   umove(tcp, addr, &t)) {
202*cf84ac9aSAndroid Build Coastguard Worker 		xsprintf(buf, "%#" PRI_klx, addr);
203*cf84ac9aSAndroid Build Coastguard Worker 	} else {
204*cf84ac9aSAndroid Build Coastguard Worker 		xsprintf(buf, timeval_fmt,
205*cf84ac9aSAndroid Build Coastguard Worker 			 (long long) t.tv_sec,
206*cf84ac9aSAndroid Build Coastguard Worker 			 zero_extend_signed_to_ull(t.tv_usec));
207*cf84ac9aSAndroid Build Coastguard Worker 	}
208*cf84ac9aSAndroid Build Coastguard Worker 
209*cf84ac9aSAndroid Build Coastguard Worker 	return buf;
210*cf84ac9aSAndroid Build Coastguard Worker }
211*cf84ac9aSAndroid Build Coastguard Worker 
212*cf84ac9aSAndroid Build Coastguard Worker #endif /* ALPHA */
213