xref: /aosp_15_r20/external/strace/time.c (revision cf84ac9a129d8ea9952db616b4e9b904c4bdde56)
1*cf84ac9aSAndroid Build Coastguard Worker /*
2*cf84ac9aSAndroid Build Coastguard Worker  * Copyright (c) 1991, 1992 Paul Kranenburg <[email protected]>
3*cf84ac9aSAndroid Build Coastguard Worker  * Copyright (c) 1993 Branko Lankester <[email protected]>
4*cf84ac9aSAndroid Build Coastguard Worker  * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <[email protected]>
5*cf84ac9aSAndroid Build Coastguard Worker  * Copyright (c) 1996-2018 The strace developers.
6*cf84ac9aSAndroid Build Coastguard Worker  * All rights reserved.
7*cf84ac9aSAndroid Build Coastguard Worker  *
8*cf84ac9aSAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
9*cf84ac9aSAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions
10*cf84ac9aSAndroid Build Coastguard Worker  * are met:
11*cf84ac9aSAndroid Build Coastguard Worker  * 1. Redistributions of source code must retain the above copyright
12*cf84ac9aSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer.
13*cf84ac9aSAndroid Build Coastguard Worker  * 2. Redistributions in binary form must reproduce the above copyright
14*cf84ac9aSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer in the
15*cf84ac9aSAndroid Build Coastguard Worker  *    documentation and/or other materials provided with the distribution.
16*cf84ac9aSAndroid Build Coastguard Worker  * 3. The name of the author may not be used to endorse or promote products
17*cf84ac9aSAndroid Build Coastguard Worker  *    derived from this software without specific prior written permission.
18*cf84ac9aSAndroid Build Coastguard Worker  *
19*cf84ac9aSAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
20*cf84ac9aSAndroid Build Coastguard Worker  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21*cf84ac9aSAndroid Build Coastguard Worker  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22*cf84ac9aSAndroid Build Coastguard Worker  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
23*cf84ac9aSAndroid Build Coastguard Worker  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
24*cf84ac9aSAndroid Build Coastguard Worker  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25*cf84ac9aSAndroid Build Coastguard Worker  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26*cf84ac9aSAndroid Build Coastguard Worker  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27*cf84ac9aSAndroid Build Coastguard Worker  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28*cf84ac9aSAndroid Build Coastguard Worker  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29*cf84ac9aSAndroid Build Coastguard Worker  */
30*cf84ac9aSAndroid Build Coastguard Worker 
31*cf84ac9aSAndroid Build Coastguard Worker #include "defs.h"
32*cf84ac9aSAndroid Build Coastguard Worker #include <fcntl.h>
33*cf84ac9aSAndroid Build Coastguard Worker #include <signal.h>
34*cf84ac9aSAndroid Build Coastguard Worker #include <sys/timex.h>
35*cf84ac9aSAndroid Build Coastguard Worker 
36*cf84ac9aSAndroid Build Coastguard Worker static void
print_timezone(struct tcb * const tcp,const kernel_ulong_t addr)37*cf84ac9aSAndroid Build Coastguard Worker print_timezone(struct tcb *const tcp, const kernel_ulong_t addr)
38*cf84ac9aSAndroid Build Coastguard Worker {
39*cf84ac9aSAndroid Build Coastguard Worker 	struct timezone tz;
40*cf84ac9aSAndroid Build Coastguard Worker 
41*cf84ac9aSAndroid Build Coastguard Worker 	if (umove_or_printaddr(tcp, addr, &tz))
42*cf84ac9aSAndroid Build Coastguard Worker 		return;
43*cf84ac9aSAndroid Build Coastguard Worker 
44*cf84ac9aSAndroid Build Coastguard Worker 	tprintf("{tz_minuteswest=%d, tz_dsttime=%d}",
45*cf84ac9aSAndroid Build Coastguard Worker 		tz.tz_minuteswest, tz.tz_dsttime);
46*cf84ac9aSAndroid Build Coastguard Worker }
47*cf84ac9aSAndroid Build Coastguard Worker 
SYS_FUNC(gettimeofday)48*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(gettimeofday)
49*cf84ac9aSAndroid Build Coastguard Worker {
50*cf84ac9aSAndroid Build Coastguard Worker 	if (exiting(tcp)) {
51*cf84ac9aSAndroid Build Coastguard Worker 		print_timeval(tcp, tcp->u_arg[0]);
52*cf84ac9aSAndroid Build Coastguard Worker 		tprints(", ");
53*cf84ac9aSAndroid Build Coastguard Worker 		print_timezone(tcp, tcp->u_arg[1]);
54*cf84ac9aSAndroid Build Coastguard Worker 	}
55*cf84ac9aSAndroid Build Coastguard Worker 	return 0;
56*cf84ac9aSAndroid Build Coastguard Worker }
57*cf84ac9aSAndroid Build Coastguard Worker 
58*cf84ac9aSAndroid Build Coastguard Worker #ifdef ALPHA
SYS_FUNC(osf_gettimeofday)59*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(osf_gettimeofday)
60*cf84ac9aSAndroid Build Coastguard Worker {
61*cf84ac9aSAndroid Build Coastguard Worker 	if (exiting(tcp)) {
62*cf84ac9aSAndroid Build Coastguard Worker 		print_timeval32(tcp, tcp->u_arg[0]);
63*cf84ac9aSAndroid Build Coastguard Worker 		tprints(", ");
64*cf84ac9aSAndroid Build Coastguard Worker 		print_timezone(tcp, tcp->u_arg[1]);
65*cf84ac9aSAndroid Build Coastguard Worker 	}
66*cf84ac9aSAndroid Build Coastguard Worker 	return 0;
67*cf84ac9aSAndroid Build Coastguard Worker }
68*cf84ac9aSAndroid Build Coastguard Worker #endif
69*cf84ac9aSAndroid Build Coastguard Worker 
SYS_FUNC(settimeofday)70*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(settimeofday)
71*cf84ac9aSAndroid Build Coastguard Worker {
72*cf84ac9aSAndroid Build Coastguard Worker 	print_timeval(tcp, tcp->u_arg[0]);
73*cf84ac9aSAndroid Build Coastguard Worker 	tprints(", ");
74*cf84ac9aSAndroid Build Coastguard Worker 	print_timezone(tcp, tcp->u_arg[1]);
75*cf84ac9aSAndroid Build Coastguard Worker 
76*cf84ac9aSAndroid Build Coastguard Worker 	return RVAL_DECODED;
77*cf84ac9aSAndroid Build Coastguard Worker }
78*cf84ac9aSAndroid Build Coastguard Worker 
79*cf84ac9aSAndroid Build Coastguard Worker #ifdef ALPHA
SYS_FUNC(osf_settimeofday)80*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(osf_settimeofday)
81*cf84ac9aSAndroid Build Coastguard Worker {
82*cf84ac9aSAndroid Build Coastguard Worker 	print_timeval32(tcp, tcp->u_arg[0]);
83*cf84ac9aSAndroid Build Coastguard Worker 	tprints(", ");
84*cf84ac9aSAndroid Build Coastguard Worker 	print_timezone(tcp, tcp->u_arg[1]);
85*cf84ac9aSAndroid Build Coastguard Worker 
86*cf84ac9aSAndroid Build Coastguard Worker 	return RVAL_DECODED;
87*cf84ac9aSAndroid Build Coastguard Worker }
88*cf84ac9aSAndroid Build Coastguard Worker #endif
89*cf84ac9aSAndroid Build Coastguard Worker 
SYS_FUNC(nanosleep)90*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(nanosleep)
91*cf84ac9aSAndroid Build Coastguard Worker {
92*cf84ac9aSAndroid Build Coastguard Worker 	if (entering(tcp)) {
93*cf84ac9aSAndroid Build Coastguard Worker 		print_timespec(tcp, tcp->u_arg[0]);
94*cf84ac9aSAndroid Build Coastguard Worker 		tprints(", ");
95*cf84ac9aSAndroid Build Coastguard Worker 	} else {
96*cf84ac9aSAndroid Build Coastguard Worker 
97*cf84ac9aSAndroid Build Coastguard Worker 		/*
98*cf84ac9aSAndroid Build Coastguard Worker 		 * Second (returned) timespec is only significant if syscall
99*cf84ac9aSAndroid Build Coastguard Worker 		 * was interrupted.  On success and in case of other errors we
100*cf84ac9aSAndroid Build Coastguard Worker 		 * print only its address, since kernel doesn't modify it,
101*cf84ac9aSAndroid Build Coastguard Worker 		 * and printing the value may show uninitialized data.
102*cf84ac9aSAndroid Build Coastguard Worker 		 */
103*cf84ac9aSAndroid Build Coastguard Worker 		if (is_erestart(tcp)) {
104*cf84ac9aSAndroid Build Coastguard Worker 			temporarily_clear_syserror(tcp);
105*cf84ac9aSAndroid Build Coastguard Worker 			print_timespec(tcp, tcp->u_arg[1]);
106*cf84ac9aSAndroid Build Coastguard Worker 			restore_cleared_syserror(tcp);
107*cf84ac9aSAndroid Build Coastguard Worker 		} else {
108*cf84ac9aSAndroid Build Coastguard Worker 			printaddr(tcp->u_arg[1]);
109*cf84ac9aSAndroid Build Coastguard Worker 		}
110*cf84ac9aSAndroid Build Coastguard Worker 	}
111*cf84ac9aSAndroid Build Coastguard Worker 	return 0;
112*cf84ac9aSAndroid Build Coastguard Worker }
113*cf84ac9aSAndroid Build Coastguard Worker 
114*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/itimer_which.h"
115*cf84ac9aSAndroid Build Coastguard Worker 
SYS_FUNC(getitimer)116*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(getitimer)
117*cf84ac9aSAndroid Build Coastguard Worker {
118*cf84ac9aSAndroid Build Coastguard Worker 	if (entering(tcp)) {
119*cf84ac9aSAndroid Build Coastguard Worker 		printxval_index(itimer_which, (unsigned int) tcp->u_arg[0],
120*cf84ac9aSAndroid Build Coastguard Worker 				"ITIMER_???");
121*cf84ac9aSAndroid Build Coastguard Worker 		tprints(", ");
122*cf84ac9aSAndroid Build Coastguard Worker 	} else {
123*cf84ac9aSAndroid Build Coastguard Worker 		print_itimerval(tcp, tcp->u_arg[1]);
124*cf84ac9aSAndroid Build Coastguard Worker 	}
125*cf84ac9aSAndroid Build Coastguard Worker 	return 0;
126*cf84ac9aSAndroid Build Coastguard Worker }
127*cf84ac9aSAndroid Build Coastguard Worker 
128*cf84ac9aSAndroid Build Coastguard Worker #ifdef ALPHA
SYS_FUNC(osf_getitimer)129*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(osf_getitimer)
130*cf84ac9aSAndroid Build Coastguard Worker {
131*cf84ac9aSAndroid Build Coastguard Worker 	if (entering(tcp)) {
132*cf84ac9aSAndroid Build Coastguard Worker 		printxval_index(itimer_which, (unsigned int) tcp->u_arg[0],
133*cf84ac9aSAndroid Build Coastguard Worker 				"ITIMER_???");
134*cf84ac9aSAndroid Build Coastguard Worker 		tprints(", ");
135*cf84ac9aSAndroid Build Coastguard Worker 	} else {
136*cf84ac9aSAndroid Build Coastguard Worker 		print_itimerval32(tcp, tcp->u_arg[1]);
137*cf84ac9aSAndroid Build Coastguard Worker 	}
138*cf84ac9aSAndroid Build Coastguard Worker 	return 0;
139*cf84ac9aSAndroid Build Coastguard Worker }
140*cf84ac9aSAndroid Build Coastguard Worker #endif
141*cf84ac9aSAndroid Build Coastguard Worker 
SYS_FUNC(setitimer)142*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(setitimer)
143*cf84ac9aSAndroid Build Coastguard Worker {
144*cf84ac9aSAndroid Build Coastguard Worker 	if (entering(tcp)) {
145*cf84ac9aSAndroid Build Coastguard Worker 		printxval_index(itimer_which, (unsigned int) tcp->u_arg[0],
146*cf84ac9aSAndroid Build Coastguard Worker 				"ITIMER_???");
147*cf84ac9aSAndroid Build Coastguard Worker 		tprints(", ");
148*cf84ac9aSAndroid Build Coastguard Worker 		print_itimerval(tcp, tcp->u_arg[1]);
149*cf84ac9aSAndroid Build Coastguard Worker 		tprints(", ");
150*cf84ac9aSAndroid Build Coastguard Worker 	} else {
151*cf84ac9aSAndroid Build Coastguard Worker 		print_itimerval(tcp, tcp->u_arg[2]);
152*cf84ac9aSAndroid Build Coastguard Worker 	}
153*cf84ac9aSAndroid Build Coastguard Worker 	return 0;
154*cf84ac9aSAndroid Build Coastguard Worker }
155*cf84ac9aSAndroid Build Coastguard Worker 
156*cf84ac9aSAndroid Build Coastguard Worker #ifdef ALPHA
SYS_FUNC(osf_setitimer)157*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(osf_setitimer)
158*cf84ac9aSAndroid Build Coastguard Worker {
159*cf84ac9aSAndroid Build Coastguard Worker 	if (entering(tcp)) {
160*cf84ac9aSAndroid Build Coastguard Worker 		printxval_index(itimer_which, (unsigned int) tcp->u_arg[0],
161*cf84ac9aSAndroid Build Coastguard Worker 				"ITIMER_???");
162*cf84ac9aSAndroid Build Coastguard Worker 		tprints(", ");
163*cf84ac9aSAndroid Build Coastguard Worker 		print_itimerval32(tcp, tcp->u_arg[1]);
164*cf84ac9aSAndroid Build Coastguard Worker 		tprints(", ");
165*cf84ac9aSAndroid Build Coastguard Worker 	} else {
166*cf84ac9aSAndroid Build Coastguard Worker 		print_itimerval32(tcp, tcp->u_arg[2]);
167*cf84ac9aSAndroid Build Coastguard Worker 	}
168*cf84ac9aSAndroid Build Coastguard Worker 	return 0;
169*cf84ac9aSAndroid Build Coastguard Worker }
170*cf84ac9aSAndroid Build Coastguard Worker #endif
171*cf84ac9aSAndroid Build Coastguard Worker 
172*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/adjtimex_state.h"
173*cf84ac9aSAndroid Build Coastguard Worker 
174*cf84ac9aSAndroid Build Coastguard Worker static int
do_adjtimex(struct tcb * const tcp,const kernel_ulong_t addr)175*cf84ac9aSAndroid Build Coastguard Worker do_adjtimex(struct tcb *const tcp, const kernel_ulong_t addr)
176*cf84ac9aSAndroid Build Coastguard Worker {
177*cf84ac9aSAndroid Build Coastguard Worker 	if (print_timex(tcp, addr))
178*cf84ac9aSAndroid Build Coastguard Worker 		return 0;
179*cf84ac9aSAndroid Build Coastguard Worker 	tcp->auxstr = xlat_idx(adjtimex_state, ARRAY_SIZE(adjtimex_state) - 1,
180*cf84ac9aSAndroid Build Coastguard Worker 			       (kernel_ulong_t) tcp->u_rval);
181*cf84ac9aSAndroid Build Coastguard Worker 	return RVAL_STR;
182*cf84ac9aSAndroid Build Coastguard Worker }
183*cf84ac9aSAndroid Build Coastguard Worker 
SYS_FUNC(adjtimex)184*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(adjtimex)
185*cf84ac9aSAndroid Build Coastguard Worker {
186*cf84ac9aSAndroid Build Coastguard Worker 	if (exiting(tcp))
187*cf84ac9aSAndroid Build Coastguard Worker 		return do_adjtimex(tcp, tcp->u_arg[0]);
188*cf84ac9aSAndroid Build Coastguard Worker 	return 0;
189*cf84ac9aSAndroid Build Coastguard Worker }
190*cf84ac9aSAndroid Build Coastguard Worker 
191*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/clockflags.h"
192*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/clocknames.h"
193*cf84ac9aSAndroid Build Coastguard Worker 
194*cf84ac9aSAndroid Build Coastguard Worker static void
printclockname(int clockid)195*cf84ac9aSAndroid Build Coastguard Worker printclockname(int clockid)
196*cf84ac9aSAndroid Build Coastguard Worker {
197*cf84ac9aSAndroid Build Coastguard Worker #ifdef CLOCKID_TO_FD
198*cf84ac9aSAndroid Build Coastguard Worker # include "xlat/cpuclocknames.h"
199*cf84ac9aSAndroid Build Coastguard Worker 
200*cf84ac9aSAndroid Build Coastguard Worker 	if (clockid < 0) {
201*cf84ac9aSAndroid Build Coastguard Worker 		if (xlat_verbose(xlat_verbosity) != XLAT_STYLE_ABBREV)
202*cf84ac9aSAndroid Build Coastguard Worker 			tprintf("%d", clockid);
203*cf84ac9aSAndroid Build Coastguard Worker 
204*cf84ac9aSAndroid Build Coastguard Worker 		if (xlat_verbose(xlat_verbosity) == XLAT_STYLE_RAW)
205*cf84ac9aSAndroid Build Coastguard Worker 			return;
206*cf84ac9aSAndroid Build Coastguard Worker 
207*cf84ac9aSAndroid Build Coastguard Worker 		if (xlat_verbose(xlat_verbosity) == XLAT_STYLE_VERBOSE)
208*cf84ac9aSAndroid Build Coastguard Worker 			tprints(" /* ");
209*cf84ac9aSAndroid Build Coastguard Worker 
210*cf84ac9aSAndroid Build Coastguard Worker 		if ((clockid & CLOCKFD_MASK) == CLOCKFD)
211*cf84ac9aSAndroid Build Coastguard Worker 			tprintf("FD_TO_CLOCKID(%d)", CLOCKID_TO_FD(clockid));
212*cf84ac9aSAndroid Build Coastguard Worker 		else {
213*cf84ac9aSAndroid Build Coastguard Worker 			tprintf("%s(%d,",
214*cf84ac9aSAndroid Build Coastguard Worker 				CPUCLOCK_PERTHREAD(clockid) ?
215*cf84ac9aSAndroid Build Coastguard Worker 					"MAKE_THREAD_CPUCLOCK" :
216*cf84ac9aSAndroid Build Coastguard Worker 					"MAKE_PROCESS_CPUCLOCK",
217*cf84ac9aSAndroid Build Coastguard Worker 				CPUCLOCK_PID(clockid));
218*cf84ac9aSAndroid Build Coastguard Worker 			printxval_index(cpuclocknames,
219*cf84ac9aSAndroid Build Coastguard Worker 					(unsigned int) clockid & CLOCKFD_MASK,
220*cf84ac9aSAndroid Build Coastguard Worker 					"CPUCLOCK_???");
221*cf84ac9aSAndroid Build Coastguard Worker 			tprints(")");
222*cf84ac9aSAndroid Build Coastguard Worker 		}
223*cf84ac9aSAndroid Build Coastguard Worker 
224*cf84ac9aSAndroid Build Coastguard Worker 		if (xlat_verbose(xlat_verbosity) == XLAT_STYLE_VERBOSE)
225*cf84ac9aSAndroid Build Coastguard Worker 			tprints(" */");
226*cf84ac9aSAndroid Build Coastguard Worker 	} else
227*cf84ac9aSAndroid Build Coastguard Worker #endif
228*cf84ac9aSAndroid Build Coastguard Worker 		printxval_index(clocknames, clockid, "CLOCK_???");
229*cf84ac9aSAndroid Build Coastguard Worker }
230*cf84ac9aSAndroid Build Coastguard Worker 
SYS_FUNC(clock_settime)231*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(clock_settime)
232*cf84ac9aSAndroid Build Coastguard Worker {
233*cf84ac9aSAndroid Build Coastguard Worker 	printclockname(tcp->u_arg[0]);
234*cf84ac9aSAndroid Build Coastguard Worker 	tprints(", ");
235*cf84ac9aSAndroid Build Coastguard Worker 	print_timespec(tcp, tcp->u_arg[1]);
236*cf84ac9aSAndroid Build Coastguard Worker 
237*cf84ac9aSAndroid Build Coastguard Worker 	return RVAL_DECODED;
238*cf84ac9aSAndroid Build Coastguard Worker }
239*cf84ac9aSAndroid Build Coastguard Worker 
SYS_FUNC(clock_gettime)240*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(clock_gettime)
241*cf84ac9aSAndroid Build Coastguard Worker {
242*cf84ac9aSAndroid Build Coastguard Worker 	if (entering(tcp)) {
243*cf84ac9aSAndroid Build Coastguard Worker 		printclockname(tcp->u_arg[0]);
244*cf84ac9aSAndroid Build Coastguard Worker 		tprints(", ");
245*cf84ac9aSAndroid Build Coastguard Worker 	} else {
246*cf84ac9aSAndroid Build Coastguard Worker 		print_timespec(tcp, tcp->u_arg[1]);
247*cf84ac9aSAndroid Build Coastguard Worker 	}
248*cf84ac9aSAndroid Build Coastguard Worker 	return 0;
249*cf84ac9aSAndroid Build Coastguard Worker }
250*cf84ac9aSAndroid Build Coastguard Worker 
SYS_FUNC(clock_nanosleep)251*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(clock_nanosleep)
252*cf84ac9aSAndroid Build Coastguard Worker {
253*cf84ac9aSAndroid Build Coastguard Worker 	if (entering(tcp)) {
254*cf84ac9aSAndroid Build Coastguard Worker 		printclockname(tcp->u_arg[0]);
255*cf84ac9aSAndroid Build Coastguard Worker 		tprints(", ");
256*cf84ac9aSAndroid Build Coastguard Worker 		printflags(clockflags, tcp->u_arg[1], "TIMER_???");
257*cf84ac9aSAndroid Build Coastguard Worker 		tprints(", ");
258*cf84ac9aSAndroid Build Coastguard Worker 		print_timespec(tcp, tcp->u_arg[2]);
259*cf84ac9aSAndroid Build Coastguard Worker 		tprints(", ");
260*cf84ac9aSAndroid Build Coastguard Worker 	} else {
261*cf84ac9aSAndroid Build Coastguard Worker 		/*
262*cf84ac9aSAndroid Build Coastguard Worker 		 * Second (returned) timespec is only significant
263*cf84ac9aSAndroid Build Coastguard Worker 		 * if syscall was interrupted and flags is not TIMER_ABSTIME.
264*cf84ac9aSAndroid Build Coastguard Worker 		 */
265*cf84ac9aSAndroid Build Coastguard Worker 		if (!tcp->u_arg[1] && is_erestart(tcp)) {
266*cf84ac9aSAndroid Build Coastguard Worker 			temporarily_clear_syserror(tcp);
267*cf84ac9aSAndroid Build Coastguard Worker 			print_timespec(tcp, tcp->u_arg[3]);
268*cf84ac9aSAndroid Build Coastguard Worker 			restore_cleared_syserror(tcp);
269*cf84ac9aSAndroid Build Coastguard Worker 		} else {
270*cf84ac9aSAndroid Build Coastguard Worker 			printaddr(tcp->u_arg[3]);
271*cf84ac9aSAndroid Build Coastguard Worker 		}
272*cf84ac9aSAndroid Build Coastguard Worker 	}
273*cf84ac9aSAndroid Build Coastguard Worker 	return 0;
274*cf84ac9aSAndroid Build Coastguard Worker }
275*cf84ac9aSAndroid Build Coastguard Worker 
SYS_FUNC(clock_adjtime)276*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(clock_adjtime)
277*cf84ac9aSAndroid Build Coastguard Worker {
278*cf84ac9aSAndroid Build Coastguard Worker 	if (exiting(tcp))
279*cf84ac9aSAndroid Build Coastguard Worker 		return do_adjtimex(tcp, tcp->u_arg[1]);
280*cf84ac9aSAndroid Build Coastguard Worker 	printclockname(tcp->u_arg[0]);
281*cf84ac9aSAndroid Build Coastguard Worker 	tprints(", ");
282*cf84ac9aSAndroid Build Coastguard Worker 	return 0;
283*cf84ac9aSAndroid Build Coastguard Worker }
284*cf84ac9aSAndroid Build Coastguard Worker 
SYS_FUNC(timer_create)285*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(timer_create)
286*cf84ac9aSAndroid Build Coastguard Worker {
287*cf84ac9aSAndroid Build Coastguard Worker 	if (entering(tcp)) {
288*cf84ac9aSAndroid Build Coastguard Worker 		printclockname(tcp->u_arg[0]);
289*cf84ac9aSAndroid Build Coastguard Worker 		tprints(", ");
290*cf84ac9aSAndroid Build Coastguard Worker 		print_sigevent(tcp, tcp->u_arg[1]);
291*cf84ac9aSAndroid Build Coastguard Worker 		tprints(", ");
292*cf84ac9aSAndroid Build Coastguard Worker 	} else {
293*cf84ac9aSAndroid Build Coastguard Worker 		printnum_int(tcp, tcp->u_arg[2], "%d");
294*cf84ac9aSAndroid Build Coastguard Worker 	}
295*cf84ac9aSAndroid Build Coastguard Worker 	return 0;
296*cf84ac9aSAndroid Build Coastguard Worker }
297*cf84ac9aSAndroid Build Coastguard Worker 
SYS_FUNC(timer_settime)298*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(timer_settime)
299*cf84ac9aSAndroid Build Coastguard Worker {
300*cf84ac9aSAndroid Build Coastguard Worker 	if (entering(tcp)) {
301*cf84ac9aSAndroid Build Coastguard Worker 		tprintf("%d, ", (int) tcp->u_arg[0]);
302*cf84ac9aSAndroid Build Coastguard Worker 		printflags(clockflags, tcp->u_arg[1], "TIMER_???");
303*cf84ac9aSAndroid Build Coastguard Worker 		tprints(", ");
304*cf84ac9aSAndroid Build Coastguard Worker 		print_itimerspec(tcp, tcp->u_arg[2]);
305*cf84ac9aSAndroid Build Coastguard Worker 		tprints(", ");
306*cf84ac9aSAndroid Build Coastguard Worker 	} else {
307*cf84ac9aSAndroid Build Coastguard Worker 		print_itimerspec(tcp, tcp->u_arg[3]);
308*cf84ac9aSAndroid Build Coastguard Worker 	}
309*cf84ac9aSAndroid Build Coastguard Worker 	return 0;
310*cf84ac9aSAndroid Build Coastguard Worker }
311*cf84ac9aSAndroid Build Coastguard Worker 
SYS_FUNC(timer_gettime)312*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(timer_gettime)
313*cf84ac9aSAndroid Build Coastguard Worker {
314*cf84ac9aSAndroid Build Coastguard Worker 	if (entering(tcp)) {
315*cf84ac9aSAndroid Build Coastguard Worker 		tprintf("%d, ", (int) tcp->u_arg[0]);
316*cf84ac9aSAndroid Build Coastguard Worker 	} else {
317*cf84ac9aSAndroid Build Coastguard Worker 		print_itimerspec(tcp, tcp->u_arg[1]);
318*cf84ac9aSAndroid Build Coastguard Worker 	}
319*cf84ac9aSAndroid Build Coastguard Worker 	return 0;
320*cf84ac9aSAndroid Build Coastguard Worker }
321*cf84ac9aSAndroid Build Coastguard Worker 
322*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/timerfdflags.h"
323*cf84ac9aSAndroid Build Coastguard Worker 
SYS_FUNC(timerfd_create)324*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(timerfd_create)
325*cf84ac9aSAndroid Build Coastguard Worker {
326*cf84ac9aSAndroid Build Coastguard Worker 	printclockname(tcp->u_arg[0]);
327*cf84ac9aSAndroid Build Coastguard Worker 	tprints(", ");
328*cf84ac9aSAndroid Build Coastguard Worker 	printflags(timerfdflags, tcp->u_arg[1], "TFD_???");
329*cf84ac9aSAndroid Build Coastguard Worker 
330*cf84ac9aSAndroid Build Coastguard Worker 	return RVAL_DECODED | RVAL_FD;
331*cf84ac9aSAndroid Build Coastguard Worker }
332*cf84ac9aSAndroid Build Coastguard Worker 
SYS_FUNC(timerfd_settime)333*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(timerfd_settime)
334*cf84ac9aSAndroid Build Coastguard Worker {
335*cf84ac9aSAndroid Build Coastguard Worker 	if (entering(tcp)) {
336*cf84ac9aSAndroid Build Coastguard Worker 		printfd(tcp, tcp->u_arg[0]);
337*cf84ac9aSAndroid Build Coastguard Worker 		tprints(", ");
338*cf84ac9aSAndroid Build Coastguard Worker 		printflags(timerfdflags, tcp->u_arg[1], "TFD_???");
339*cf84ac9aSAndroid Build Coastguard Worker 		tprints(", ");
340*cf84ac9aSAndroid Build Coastguard Worker 		print_itimerspec(tcp, tcp->u_arg[2]);
341*cf84ac9aSAndroid Build Coastguard Worker 		tprints(", ");
342*cf84ac9aSAndroid Build Coastguard Worker 	} else {
343*cf84ac9aSAndroid Build Coastguard Worker 		print_itimerspec(tcp, tcp->u_arg[3]);
344*cf84ac9aSAndroid Build Coastguard Worker 	}
345*cf84ac9aSAndroid Build Coastguard Worker 	return 0;
346*cf84ac9aSAndroid Build Coastguard Worker }
347*cf84ac9aSAndroid Build Coastguard Worker 
SYS_FUNC(timerfd_gettime)348*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(timerfd_gettime)
349*cf84ac9aSAndroid Build Coastguard Worker {
350*cf84ac9aSAndroid Build Coastguard Worker 	if (entering(tcp)) {
351*cf84ac9aSAndroid Build Coastguard Worker 		printfd(tcp, tcp->u_arg[0]);
352*cf84ac9aSAndroid Build Coastguard Worker 		tprints(", ");
353*cf84ac9aSAndroid Build Coastguard Worker 	} else {
354*cf84ac9aSAndroid Build Coastguard Worker 		print_itimerspec(tcp, tcp->u_arg[1]);
355*cf84ac9aSAndroid Build Coastguard Worker 	}
356*cf84ac9aSAndroid Build Coastguard Worker 	return 0;
357*cf84ac9aSAndroid Build Coastguard Worker }
358