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