xref: /aosp_15_r20/external/strace/io.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-1999 Wichert Akkerman <[email protected]>
6*cf84ac9aSAndroid Build Coastguard Worker  * Copyright (c) 1999-2018 The strace developers.
7*cf84ac9aSAndroid Build Coastguard Worker  * All rights reserved.
8*cf84ac9aSAndroid Build Coastguard Worker  *
9*cf84ac9aSAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
10*cf84ac9aSAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions
11*cf84ac9aSAndroid Build Coastguard Worker  * are met:
12*cf84ac9aSAndroid Build Coastguard Worker  * 1. Redistributions of source code must retain the above copyright
13*cf84ac9aSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer.
14*cf84ac9aSAndroid Build Coastguard Worker  * 2. Redistributions in binary form must reproduce the above copyright
15*cf84ac9aSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer in the
16*cf84ac9aSAndroid Build Coastguard Worker  *    documentation and/or other materials provided with the distribution.
17*cf84ac9aSAndroid Build Coastguard Worker  * 3. The name of the author may not be used to endorse or promote products
18*cf84ac9aSAndroid Build Coastguard Worker  *    derived from this software without specific prior written permission.
19*cf84ac9aSAndroid Build Coastguard Worker  *
20*cf84ac9aSAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21*cf84ac9aSAndroid Build Coastguard Worker  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22*cf84ac9aSAndroid Build Coastguard Worker  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23*cf84ac9aSAndroid Build Coastguard Worker  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24*cf84ac9aSAndroid Build Coastguard Worker  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25*cf84ac9aSAndroid Build Coastguard Worker  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26*cf84ac9aSAndroid Build Coastguard Worker  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27*cf84ac9aSAndroid Build Coastguard Worker  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28*cf84ac9aSAndroid Build Coastguard Worker  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29*cf84ac9aSAndroid Build Coastguard Worker  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30*cf84ac9aSAndroid Build Coastguard Worker  */
31*cf84ac9aSAndroid Build Coastguard Worker 
32*cf84ac9aSAndroid Build Coastguard Worker #include "defs.h"
33*cf84ac9aSAndroid Build Coastguard Worker #include <fcntl.h>
34*cf84ac9aSAndroid Build Coastguard Worker #include <sys/uio.h>
35*cf84ac9aSAndroid Build Coastguard Worker 
SYS_FUNC(read)36*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(read)
37*cf84ac9aSAndroid Build Coastguard Worker {
38*cf84ac9aSAndroid Build Coastguard Worker 	if (entering(tcp)) {
39*cf84ac9aSAndroid Build Coastguard Worker 		printfd(tcp, tcp->u_arg[0]);
40*cf84ac9aSAndroid Build Coastguard Worker 		tprints(", ");
41*cf84ac9aSAndroid Build Coastguard Worker 	} else {
42*cf84ac9aSAndroid Build Coastguard Worker 		if (syserror(tcp))
43*cf84ac9aSAndroid Build Coastguard Worker 			printaddr(tcp->u_arg[1]);
44*cf84ac9aSAndroid Build Coastguard Worker 		else
45*cf84ac9aSAndroid Build Coastguard Worker 			printstrn(tcp, tcp->u_arg[1], tcp->u_rval);
46*cf84ac9aSAndroid Build Coastguard Worker 		tprintf(", %" PRI_klu, tcp->u_arg[2]);
47*cf84ac9aSAndroid Build Coastguard Worker 	}
48*cf84ac9aSAndroid Build Coastguard Worker 	return 0;
49*cf84ac9aSAndroid Build Coastguard Worker }
50*cf84ac9aSAndroid Build Coastguard Worker 
SYS_FUNC(write)51*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(write)
52*cf84ac9aSAndroid Build Coastguard Worker {
53*cf84ac9aSAndroid Build Coastguard Worker 	printfd(tcp, tcp->u_arg[0]);
54*cf84ac9aSAndroid Build Coastguard Worker 	tprints(", ");
55*cf84ac9aSAndroid Build Coastguard Worker 	printstrn(tcp, tcp->u_arg[1], tcp->u_arg[2]);
56*cf84ac9aSAndroid Build Coastguard Worker 	tprintf(", %" PRI_klu, tcp->u_arg[2]);
57*cf84ac9aSAndroid Build Coastguard Worker 
58*cf84ac9aSAndroid Build Coastguard Worker 	return RVAL_DECODED;
59*cf84ac9aSAndroid Build Coastguard Worker }
60*cf84ac9aSAndroid Build Coastguard Worker 
61*cf84ac9aSAndroid Build Coastguard Worker struct print_iovec_config {
62*cf84ac9aSAndroid Build Coastguard Worker 	enum iov_decode decode_iov;
63*cf84ac9aSAndroid Build Coastguard Worker 	kernel_ulong_t data_size;
64*cf84ac9aSAndroid Build Coastguard Worker };
65*cf84ac9aSAndroid Build Coastguard Worker 
66*cf84ac9aSAndroid Build Coastguard Worker static bool
print_iovec(struct tcb * tcp,void * elem_buf,size_t elem_size,void * data)67*cf84ac9aSAndroid Build Coastguard Worker print_iovec(struct tcb *tcp, void *elem_buf, size_t elem_size, void *data)
68*cf84ac9aSAndroid Build Coastguard Worker {
69*cf84ac9aSAndroid Build Coastguard Worker 	const kernel_ulong_t *iov;
70*cf84ac9aSAndroid Build Coastguard Worker 	kernel_ulong_t iov_buf[2], len;
71*cf84ac9aSAndroid Build Coastguard Worker 	struct print_iovec_config *c = data;
72*cf84ac9aSAndroid Build Coastguard Worker 
73*cf84ac9aSAndroid Build Coastguard Worker 	if (elem_size < sizeof(iov_buf)) {
74*cf84ac9aSAndroid Build Coastguard Worker 		iov_buf[0] = ((unsigned int *) elem_buf)[0];
75*cf84ac9aSAndroid Build Coastguard Worker 		iov_buf[1] = ((unsigned int *) elem_buf)[1];
76*cf84ac9aSAndroid Build Coastguard Worker 		iov = iov_buf;
77*cf84ac9aSAndroid Build Coastguard Worker 	} else {
78*cf84ac9aSAndroid Build Coastguard Worker 		iov = elem_buf;
79*cf84ac9aSAndroid Build Coastguard Worker 	}
80*cf84ac9aSAndroid Build Coastguard Worker 
81*cf84ac9aSAndroid Build Coastguard Worker 	tprints("{iov_base=");
82*cf84ac9aSAndroid Build Coastguard Worker 
83*cf84ac9aSAndroid Build Coastguard Worker 	len = iov[1];
84*cf84ac9aSAndroid Build Coastguard Worker 
85*cf84ac9aSAndroid Build Coastguard Worker 	switch (c->decode_iov) {
86*cf84ac9aSAndroid Build Coastguard Worker 		case IOV_DECODE_STR:
87*cf84ac9aSAndroid Build Coastguard Worker 			if (len > c->data_size)
88*cf84ac9aSAndroid Build Coastguard Worker 				len = c->data_size;
89*cf84ac9aSAndroid Build Coastguard Worker 			if (c->data_size != (kernel_ulong_t) -1)
90*cf84ac9aSAndroid Build Coastguard Worker 				c->data_size -= len;
91*cf84ac9aSAndroid Build Coastguard Worker 			printstrn(tcp, iov[0], len);
92*cf84ac9aSAndroid Build Coastguard Worker 			break;
93*cf84ac9aSAndroid Build Coastguard Worker 		case IOV_DECODE_NETLINK:
94*cf84ac9aSAndroid Build Coastguard Worker 			if (len > c->data_size)
95*cf84ac9aSAndroid Build Coastguard Worker 				len = c->data_size;
96*cf84ac9aSAndroid Build Coastguard Worker 			if (c->data_size != (kernel_ulong_t) -1)
97*cf84ac9aSAndroid Build Coastguard Worker 				c->data_size -= len;
98*cf84ac9aSAndroid Build Coastguard Worker 			/* assume that the descriptor is 1st syscall argument */
99*cf84ac9aSAndroid Build Coastguard Worker 			decode_netlink(tcp, tcp->u_arg[0], iov[0], len);
100*cf84ac9aSAndroid Build Coastguard Worker 			break;
101*cf84ac9aSAndroid Build Coastguard Worker 		default:
102*cf84ac9aSAndroid Build Coastguard Worker 			printaddr(iov[0]);
103*cf84ac9aSAndroid Build Coastguard Worker 			break;
104*cf84ac9aSAndroid Build Coastguard Worker 	}
105*cf84ac9aSAndroid Build Coastguard Worker 
106*cf84ac9aSAndroid Build Coastguard Worker 	tprintf(", iov_len=%" PRI_klu "}", iov[1]);
107*cf84ac9aSAndroid Build Coastguard Worker 
108*cf84ac9aSAndroid Build Coastguard Worker 	return true;
109*cf84ac9aSAndroid Build Coastguard Worker }
110*cf84ac9aSAndroid Build Coastguard Worker 
111*cf84ac9aSAndroid Build Coastguard Worker /*
112*cf84ac9aSAndroid Build Coastguard Worker  * data_size limits the cumulative size of printed data.
113*cf84ac9aSAndroid Build Coastguard Worker  * Example: recvmsg returing a short read.
114*cf84ac9aSAndroid Build Coastguard Worker  */
115*cf84ac9aSAndroid Build Coastguard Worker void
tprint_iov_upto(struct tcb * const tcp,const kernel_ulong_t len,const kernel_ulong_t addr,const enum iov_decode decode_iov,const kernel_ulong_t data_size)116*cf84ac9aSAndroid Build Coastguard Worker tprint_iov_upto(struct tcb *const tcp, const kernel_ulong_t len,
117*cf84ac9aSAndroid Build Coastguard Worker 		const kernel_ulong_t addr, const enum iov_decode decode_iov,
118*cf84ac9aSAndroid Build Coastguard Worker 		const kernel_ulong_t data_size)
119*cf84ac9aSAndroid Build Coastguard Worker {
120*cf84ac9aSAndroid Build Coastguard Worker 	kernel_ulong_t iov[2];
121*cf84ac9aSAndroid Build Coastguard Worker 	struct print_iovec_config config = {
122*cf84ac9aSAndroid Build Coastguard Worker 		.decode_iov = decode_iov, .data_size = data_size
123*cf84ac9aSAndroid Build Coastguard Worker 	};
124*cf84ac9aSAndroid Build Coastguard Worker 
125*cf84ac9aSAndroid Build Coastguard Worker 	print_array(tcp, addr, len, iov, current_wordsize * 2,
126*cf84ac9aSAndroid Build Coastguard Worker 		    tfetch_mem_ignore_syserror, print_iovec, &config);
127*cf84ac9aSAndroid Build Coastguard Worker }
128*cf84ac9aSAndroid Build Coastguard Worker 
SYS_FUNC(readv)129*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(readv)
130*cf84ac9aSAndroid Build Coastguard Worker {
131*cf84ac9aSAndroid Build Coastguard Worker 	if (entering(tcp)) {
132*cf84ac9aSAndroid Build Coastguard Worker 		printfd(tcp, tcp->u_arg[0]);
133*cf84ac9aSAndroid Build Coastguard Worker 		tprints(", ");
134*cf84ac9aSAndroid Build Coastguard Worker 	} else {
135*cf84ac9aSAndroid Build Coastguard Worker 		tprint_iov_upto(tcp, tcp->u_arg[2], tcp->u_arg[1],
136*cf84ac9aSAndroid Build Coastguard Worker 				syserror(tcp) ? IOV_DECODE_ADDR :
137*cf84ac9aSAndroid Build Coastguard Worker 				IOV_DECODE_STR, tcp->u_rval);
138*cf84ac9aSAndroid Build Coastguard Worker 		tprintf(", %" PRI_klu, tcp->u_arg[2]);
139*cf84ac9aSAndroid Build Coastguard Worker 	}
140*cf84ac9aSAndroid Build Coastguard Worker 	return 0;
141*cf84ac9aSAndroid Build Coastguard Worker }
142*cf84ac9aSAndroid Build Coastguard Worker 
SYS_FUNC(writev)143*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(writev)
144*cf84ac9aSAndroid Build Coastguard Worker {
145*cf84ac9aSAndroid Build Coastguard Worker 	printfd(tcp, tcp->u_arg[0]);
146*cf84ac9aSAndroid Build Coastguard Worker 	tprints(", ");
147*cf84ac9aSAndroid Build Coastguard Worker 	tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1], IOV_DECODE_STR);
148*cf84ac9aSAndroid Build Coastguard Worker 	tprintf(", %" PRI_klu, tcp->u_arg[2]);
149*cf84ac9aSAndroid Build Coastguard Worker 
150*cf84ac9aSAndroid Build Coastguard Worker 	return RVAL_DECODED;
151*cf84ac9aSAndroid Build Coastguard Worker }
152*cf84ac9aSAndroid Build Coastguard Worker 
SYS_FUNC(pread)153*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(pread)
154*cf84ac9aSAndroid Build Coastguard Worker {
155*cf84ac9aSAndroid Build Coastguard Worker 	if (entering(tcp)) {
156*cf84ac9aSAndroid Build Coastguard Worker 		printfd(tcp, tcp->u_arg[0]);
157*cf84ac9aSAndroid Build Coastguard Worker 		tprints(", ");
158*cf84ac9aSAndroid Build Coastguard Worker 	} else {
159*cf84ac9aSAndroid Build Coastguard Worker 		if (syserror(tcp))
160*cf84ac9aSAndroid Build Coastguard Worker 			printaddr(tcp->u_arg[1]);
161*cf84ac9aSAndroid Build Coastguard Worker 		else
162*cf84ac9aSAndroid Build Coastguard Worker 			printstrn(tcp, tcp->u_arg[1], tcp->u_rval);
163*cf84ac9aSAndroid Build Coastguard Worker 		tprintf(", %" PRI_klu ", ", tcp->u_arg[2]);
164*cf84ac9aSAndroid Build Coastguard Worker 		printllval(tcp, "%lld", 3);
165*cf84ac9aSAndroid Build Coastguard Worker 	}
166*cf84ac9aSAndroid Build Coastguard Worker 	return 0;
167*cf84ac9aSAndroid Build Coastguard Worker }
168*cf84ac9aSAndroid Build Coastguard Worker 
SYS_FUNC(pwrite)169*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(pwrite)
170*cf84ac9aSAndroid Build Coastguard Worker {
171*cf84ac9aSAndroid Build Coastguard Worker 	printfd(tcp, tcp->u_arg[0]);
172*cf84ac9aSAndroid Build Coastguard Worker 	tprints(", ");
173*cf84ac9aSAndroid Build Coastguard Worker 	printstrn(tcp, tcp->u_arg[1], tcp->u_arg[2]);
174*cf84ac9aSAndroid Build Coastguard Worker 	tprintf(", %" PRI_klu ", ", tcp->u_arg[2]);
175*cf84ac9aSAndroid Build Coastguard Worker 	printllval(tcp, "%lld", 3);
176*cf84ac9aSAndroid Build Coastguard Worker 
177*cf84ac9aSAndroid Build Coastguard Worker 	return RVAL_DECODED;
178*cf84ac9aSAndroid Build Coastguard Worker }
179*cf84ac9aSAndroid Build Coastguard Worker 
180*cf84ac9aSAndroid Build Coastguard Worker static void
print_lld_from_low_high_val(struct tcb * tcp,int arg)181*cf84ac9aSAndroid Build Coastguard Worker print_lld_from_low_high_val(struct tcb *tcp, int arg)
182*cf84ac9aSAndroid Build Coastguard Worker {
183*cf84ac9aSAndroid Build Coastguard Worker #if SIZEOF_KERNEL_LONG_T > 4
184*cf84ac9aSAndroid Build Coastguard Worker # ifndef current_klongsize
185*cf84ac9aSAndroid Build Coastguard Worker 	if (current_klongsize < SIZEOF_KERNEL_LONG_T) {
186*cf84ac9aSAndroid Build Coastguard Worker 		tprintf("%" PRI_kld, (tcp->u_arg[arg + 1] << 32)
187*cf84ac9aSAndroid Build Coastguard Worker 			       | tcp->u_arg[arg]);
188*cf84ac9aSAndroid Build Coastguard Worker 	} else
189*cf84ac9aSAndroid Build Coastguard Worker # endif /* !current_klongsize */
190*cf84ac9aSAndroid Build Coastguard Worker 	{
191*cf84ac9aSAndroid Build Coastguard Worker 		tprintf("%" PRI_kld, tcp->u_arg[arg]);
192*cf84ac9aSAndroid Build Coastguard Worker 	}
193*cf84ac9aSAndroid Build Coastguard Worker #else /* SIZEOF_KERNEL_LONG_T == 4 */
194*cf84ac9aSAndroid Build Coastguard Worker 	tprintf("%lld",
195*cf84ac9aSAndroid Build Coastguard Worker 		  ((long long) tcp->u_arg[arg + 1] << 32)
196*cf84ac9aSAndroid Build Coastguard Worker 		| ((long long) tcp->u_arg[arg]));
197*cf84ac9aSAndroid Build Coastguard Worker #endif
198*cf84ac9aSAndroid Build Coastguard Worker }
199*cf84ac9aSAndroid Build Coastguard Worker 
200*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/rwf_flags.h"
201*cf84ac9aSAndroid Build Coastguard Worker 
202*cf84ac9aSAndroid Build Coastguard Worker static int
do_preadv(struct tcb * tcp,const int flags_arg)203*cf84ac9aSAndroid Build Coastguard Worker do_preadv(struct tcb *tcp, const int flags_arg)
204*cf84ac9aSAndroid Build Coastguard Worker {
205*cf84ac9aSAndroid Build Coastguard Worker 	if (entering(tcp)) {
206*cf84ac9aSAndroid Build Coastguard Worker 		printfd(tcp, tcp->u_arg[0]);
207*cf84ac9aSAndroid Build Coastguard Worker 		tprints(", ");
208*cf84ac9aSAndroid Build Coastguard Worker 	} else {
209*cf84ac9aSAndroid Build Coastguard Worker 		kernel_ulong_t len =
210*cf84ac9aSAndroid Build Coastguard Worker 			truncate_kulong_to_current_wordsize(tcp->u_arg[2]);
211*cf84ac9aSAndroid Build Coastguard Worker 
212*cf84ac9aSAndroid Build Coastguard Worker 		tprint_iov_upto(tcp, len, tcp->u_arg[1],
213*cf84ac9aSAndroid Build Coastguard Worker 				syserror(tcp) ? IOV_DECODE_ADDR :
214*cf84ac9aSAndroid Build Coastguard Worker 				IOV_DECODE_STR, tcp->u_rval);
215*cf84ac9aSAndroid Build Coastguard Worker 		tprintf(", %" PRI_klu ", ", len);
216*cf84ac9aSAndroid Build Coastguard Worker 		print_lld_from_low_high_val(tcp, 3);
217*cf84ac9aSAndroid Build Coastguard Worker 		if (flags_arg >= 0) {
218*cf84ac9aSAndroid Build Coastguard Worker 			tprints(", ");
219*cf84ac9aSAndroid Build Coastguard Worker 			printflags(rwf_flags, tcp->u_arg[flags_arg], "RWF_???");
220*cf84ac9aSAndroid Build Coastguard Worker 		}
221*cf84ac9aSAndroid Build Coastguard Worker 	}
222*cf84ac9aSAndroid Build Coastguard Worker 	return 0;
223*cf84ac9aSAndroid Build Coastguard Worker }
224*cf84ac9aSAndroid Build Coastguard Worker 
SYS_FUNC(preadv)225*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(preadv)
226*cf84ac9aSAndroid Build Coastguard Worker {
227*cf84ac9aSAndroid Build Coastguard Worker 	return do_preadv(tcp, -1);
228*cf84ac9aSAndroid Build Coastguard Worker }
229*cf84ac9aSAndroid Build Coastguard Worker 
230*cf84ac9aSAndroid Build Coastguard Worker static int
do_pwritev(struct tcb * tcp,const int flags_arg)231*cf84ac9aSAndroid Build Coastguard Worker do_pwritev(struct tcb *tcp, const int flags_arg)
232*cf84ac9aSAndroid Build Coastguard Worker {
233*cf84ac9aSAndroid Build Coastguard Worker 	kernel_ulong_t len =
234*cf84ac9aSAndroid Build Coastguard Worker 		truncate_kulong_to_current_wordsize(tcp->u_arg[2]);
235*cf84ac9aSAndroid Build Coastguard Worker 
236*cf84ac9aSAndroid Build Coastguard Worker 	printfd(tcp, tcp->u_arg[0]);
237*cf84ac9aSAndroid Build Coastguard Worker 	tprints(", ");
238*cf84ac9aSAndroid Build Coastguard Worker 	tprint_iov(tcp, len, tcp->u_arg[1], IOV_DECODE_STR);
239*cf84ac9aSAndroid Build Coastguard Worker 	tprintf(", %" PRI_klu ", ", len);
240*cf84ac9aSAndroid Build Coastguard Worker 	print_lld_from_low_high_val(tcp, 3);
241*cf84ac9aSAndroid Build Coastguard Worker 	if (flags_arg >= 0) {
242*cf84ac9aSAndroid Build Coastguard Worker 		tprints(", ");
243*cf84ac9aSAndroid Build Coastguard Worker 		printflags(rwf_flags, tcp->u_arg[flags_arg], "RWF_???");
244*cf84ac9aSAndroid Build Coastguard Worker 	}
245*cf84ac9aSAndroid Build Coastguard Worker 
246*cf84ac9aSAndroid Build Coastguard Worker 	return RVAL_DECODED;
247*cf84ac9aSAndroid Build Coastguard Worker }
248*cf84ac9aSAndroid Build Coastguard Worker 
SYS_FUNC(pwritev)249*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(pwritev)
250*cf84ac9aSAndroid Build Coastguard Worker {
251*cf84ac9aSAndroid Build Coastguard Worker 	return do_pwritev(tcp, -1);
252*cf84ac9aSAndroid Build Coastguard Worker }
253*cf84ac9aSAndroid Build Coastguard Worker 
254*cf84ac9aSAndroid Build Coastguard Worker /*
255*cf84ac9aSAndroid Build Coastguard Worker  * x32 is the only architecture where preadv2 takes 5 arguments
256*cf84ac9aSAndroid Build Coastguard Worker  * instead of 6, see preadv64v2 in kernel sources.
257*cf84ac9aSAndroid Build Coastguard Worker  * Likewise, x32 is the only architecture where pwritev2 takes 5 arguments
258*cf84ac9aSAndroid Build Coastguard Worker  * instead of 6, see pwritev64v2 in kernel sources.
259*cf84ac9aSAndroid Build Coastguard Worker  */
260*cf84ac9aSAndroid Build Coastguard Worker 
261*cf84ac9aSAndroid Build Coastguard Worker #if defined X86_64
262*cf84ac9aSAndroid Build Coastguard Worker # define PREADV2_PWRITEV2_FLAGS_ARG_NO (current_personality == 2 ? 4 : 5)
263*cf84ac9aSAndroid Build Coastguard Worker #elif defined X32
264*cf84ac9aSAndroid Build Coastguard Worker # define PREADV2_PWRITEV2_FLAGS_ARG_NO (current_personality == 0 ? 4 : 5)
265*cf84ac9aSAndroid Build Coastguard Worker #else
266*cf84ac9aSAndroid Build Coastguard Worker # define PREADV2_PWRITEV2_FLAGS_ARG_NO 5
267*cf84ac9aSAndroid Build Coastguard Worker #endif
268*cf84ac9aSAndroid Build Coastguard Worker 
SYS_FUNC(preadv2)269*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(preadv2)
270*cf84ac9aSAndroid Build Coastguard Worker {
271*cf84ac9aSAndroid Build Coastguard Worker 	return do_preadv(tcp, PREADV2_PWRITEV2_FLAGS_ARG_NO);
272*cf84ac9aSAndroid Build Coastguard Worker }
273*cf84ac9aSAndroid Build Coastguard Worker 
SYS_FUNC(pwritev2)274*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(pwritev2)
275*cf84ac9aSAndroid Build Coastguard Worker {
276*cf84ac9aSAndroid Build Coastguard Worker 	return do_pwritev(tcp, PREADV2_PWRITEV2_FLAGS_ARG_NO);
277*cf84ac9aSAndroid Build Coastguard Worker }
278*cf84ac9aSAndroid Build Coastguard Worker 
279*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/splice_flags.h"
280*cf84ac9aSAndroid Build Coastguard Worker 
SYS_FUNC(tee)281*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(tee)
282*cf84ac9aSAndroid Build Coastguard Worker {
283*cf84ac9aSAndroid Build Coastguard Worker 	/* int fd_in */
284*cf84ac9aSAndroid Build Coastguard Worker 	printfd(tcp, tcp->u_arg[0]);
285*cf84ac9aSAndroid Build Coastguard Worker 	tprints(", ");
286*cf84ac9aSAndroid Build Coastguard Worker 	/* int fd_out */
287*cf84ac9aSAndroid Build Coastguard Worker 	printfd(tcp, tcp->u_arg[1]);
288*cf84ac9aSAndroid Build Coastguard Worker 	tprints(", ");
289*cf84ac9aSAndroid Build Coastguard Worker 	/* size_t len */
290*cf84ac9aSAndroid Build Coastguard Worker 	tprintf("%" PRI_klu ", ", tcp->u_arg[2]);
291*cf84ac9aSAndroid Build Coastguard Worker 	/* unsigned int flags */
292*cf84ac9aSAndroid Build Coastguard Worker 	printflags(splice_flags, tcp->u_arg[3], "SPLICE_F_???");
293*cf84ac9aSAndroid Build Coastguard Worker 
294*cf84ac9aSAndroid Build Coastguard Worker 	return RVAL_DECODED;
295*cf84ac9aSAndroid Build Coastguard Worker }
296*cf84ac9aSAndroid Build Coastguard Worker 
SYS_FUNC(splice)297*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(splice)
298*cf84ac9aSAndroid Build Coastguard Worker {
299*cf84ac9aSAndroid Build Coastguard Worker 	/* int fd_in */
300*cf84ac9aSAndroid Build Coastguard Worker 	printfd(tcp, tcp->u_arg[0]);
301*cf84ac9aSAndroid Build Coastguard Worker 	tprints(", ");
302*cf84ac9aSAndroid Build Coastguard Worker 	/* loff_t *off_in */
303*cf84ac9aSAndroid Build Coastguard Worker 	printnum_int64(tcp, tcp->u_arg[1], "%" PRId64);
304*cf84ac9aSAndroid Build Coastguard Worker 	tprints(", ");
305*cf84ac9aSAndroid Build Coastguard Worker 	/* int fd_out */
306*cf84ac9aSAndroid Build Coastguard Worker 	printfd(tcp, tcp->u_arg[2]);
307*cf84ac9aSAndroid Build Coastguard Worker 	tprints(", ");
308*cf84ac9aSAndroid Build Coastguard Worker 	/* loff_t *off_out */
309*cf84ac9aSAndroid Build Coastguard Worker 	printnum_int64(tcp, tcp->u_arg[3], "%" PRId64);
310*cf84ac9aSAndroid Build Coastguard Worker 	tprints(", ");
311*cf84ac9aSAndroid Build Coastguard Worker 	/* size_t len */
312*cf84ac9aSAndroid Build Coastguard Worker 	tprintf("%" PRI_klu ", ", tcp->u_arg[4]);
313*cf84ac9aSAndroid Build Coastguard Worker 	/* unsigned int flags */
314*cf84ac9aSAndroid Build Coastguard Worker 	printflags(splice_flags, tcp->u_arg[5], "SPLICE_F_???");
315*cf84ac9aSAndroid Build Coastguard Worker 
316*cf84ac9aSAndroid Build Coastguard Worker 	return RVAL_DECODED;
317*cf84ac9aSAndroid Build Coastguard Worker }
318*cf84ac9aSAndroid Build Coastguard Worker 
SYS_FUNC(vmsplice)319*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(vmsplice)
320*cf84ac9aSAndroid Build Coastguard Worker {
321*cf84ac9aSAndroid Build Coastguard Worker 	/* int fd */
322*cf84ac9aSAndroid Build Coastguard Worker 	printfd(tcp, tcp->u_arg[0]);
323*cf84ac9aSAndroid Build Coastguard Worker 	tprints(", ");
324*cf84ac9aSAndroid Build Coastguard Worker 	/* const struct iovec *iov, unsigned long nr_segs */
325*cf84ac9aSAndroid Build Coastguard Worker 	tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1], IOV_DECODE_STR);
326*cf84ac9aSAndroid Build Coastguard Worker 	tprintf(", %" PRI_klu ", ", tcp->u_arg[2]);
327*cf84ac9aSAndroid Build Coastguard Worker 	/* unsigned int flags */
328*cf84ac9aSAndroid Build Coastguard Worker 	printflags(splice_flags, tcp->u_arg[3], "SPLICE_F_???");
329*cf84ac9aSAndroid Build Coastguard Worker 
330*cf84ac9aSAndroid Build Coastguard Worker 	return RVAL_DECODED;
331*cf84ac9aSAndroid Build Coastguard Worker }
332