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