2 * Copyright (c) 1991, 1992 Paul Kranenburg <pk@cs.few.eur.nl>
3 * Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
4 * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com>
5 * Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl>
6 * Copyright (c) 1999-2018 The strace developers.
9 * SPDX-License-Identifier: LGPL-2.1-or-later
19 printfd(tcp, tcp->u_arg[0]);
23 printaddr(tcp->u_arg[1]);
25 printstrn(tcp, tcp->u_arg[1], tcp->u_rval);
26 tprintf(", %" PRI_klu, tcp->u_arg[2]);
33 printfd(tcp, tcp->u_arg[0]);
35 printstrn(tcp, tcp->u_arg[1], tcp->u_arg[2]);
36 tprintf(", %" PRI_klu, tcp->u_arg[2]);
41 struct print_iovec_config {
42 enum iov_decode decode_iov;
43 kernel_ulong_t data_size;
47 print_iovec(struct tcb *tcp, void *elem_buf, size_t elem_size, void *data)
49 const kernel_ulong_t *iov;
50 kernel_ulong_t iov_buf[2], len;
51 struct print_iovec_config *c = data;
53 if (elem_size < sizeof(iov_buf)) {
54 iov_buf[0] = ((unsigned int *) elem_buf)[0];
55 iov_buf[1] = ((unsigned int *) elem_buf)[1];
61 tprints("{iov_base=");
65 switch (c->decode_iov) {
67 if (len > c->data_size)
69 if (c->data_size != (kernel_ulong_t) -1)
71 printstrn(tcp, iov[0], len);
73 case IOV_DECODE_NETLINK:
74 if (len > c->data_size)
76 if (c->data_size != (kernel_ulong_t) -1)
78 /* assume that the descriptor is 1st syscall argument */
79 decode_netlink(tcp, tcp->u_arg[0], iov[0], len);
86 tprintf(", iov_len=%" PRI_klu "}", iov[1]);
92 * data_size limits the cumulative size of printed data.
93 * Example: recvmsg returing a short read.
96 tprint_iov_upto(struct tcb *const tcp, const kernel_ulong_t len,
97 const kernel_ulong_t addr, const enum iov_decode decode_iov,
98 const kernel_ulong_t data_size)
100 kernel_ulong_t iov[2];
101 struct print_iovec_config config = {
102 .decode_iov = decode_iov, .data_size = data_size
105 print_array(tcp, addr, len, iov, current_wordsize * 2,
106 tfetch_mem_ignore_syserror, print_iovec, &config);
112 printfd(tcp, tcp->u_arg[0]);
115 tprint_iov_upto(tcp, tcp->u_arg[2], tcp->u_arg[1],
116 syserror(tcp) ? IOV_DECODE_ADDR :
117 IOV_DECODE_STR, tcp->u_rval);
118 tprintf(", %" PRI_klu, tcp->u_arg[2]);
125 printfd(tcp, tcp->u_arg[0]);
127 tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1], IOV_DECODE_STR);
128 tprintf(", %" PRI_klu, tcp->u_arg[2]);
136 printfd(tcp, tcp->u_arg[0]);
140 printaddr(tcp->u_arg[1]);
142 printstrn(tcp, tcp->u_arg[1], tcp->u_rval);
143 tprintf(", %" PRI_klu ", ", tcp->u_arg[2]);
144 printllval(tcp, "%lld", 3);
151 printfd(tcp, tcp->u_arg[0]);
153 printstrn(tcp, tcp->u_arg[1], tcp->u_arg[2]);
154 tprintf(", %" PRI_klu ", ", tcp->u_arg[2]);
155 printllval(tcp, "%lld", 3);
161 print_lld_from_low_high_val(struct tcb *tcp, int arg)
163 #if SIZEOF_KERNEL_LONG_T > 4
164 # ifndef current_klongsize
165 if (current_klongsize < SIZEOF_KERNEL_LONG_T) {
166 tprintf("%" PRI_kld, (tcp->u_arg[arg + 1] << 32)
169 # endif /* !current_klongsize */
171 tprintf("%" PRI_kld, tcp->u_arg[arg]);
173 #else /* SIZEOF_KERNEL_LONG_T == 4 */
175 ((long long) tcp->u_arg[arg + 1] << 32)
176 | ((long long) tcp->u_arg[arg]));
180 #include "xlat/rwf_flags.h"
183 do_preadv(struct tcb *tcp, const int flags_arg)
186 printfd(tcp, tcp->u_arg[0]);
190 truncate_kulong_to_current_wordsize(tcp->u_arg[2]);
192 tprint_iov_upto(tcp, len, tcp->u_arg[1],
193 syserror(tcp) ? IOV_DECODE_ADDR :
194 IOV_DECODE_STR, tcp->u_rval);
195 tprintf(", %" PRI_klu ", ", len);
196 print_lld_from_low_high_val(tcp, 3);
197 if (flags_arg >= 0) {
199 printflags(rwf_flags, tcp->u_arg[flags_arg], "RWF_???");
207 return do_preadv(tcp, -1);
211 do_pwritev(struct tcb *tcp, const int flags_arg)
214 truncate_kulong_to_current_wordsize(tcp->u_arg[2]);
216 printfd(tcp, tcp->u_arg[0]);
218 tprint_iov(tcp, len, tcp->u_arg[1], IOV_DECODE_STR);
219 tprintf(", %" PRI_klu ", ", len);
220 print_lld_from_low_high_val(tcp, 3);
221 if (flags_arg >= 0) {
223 printflags(rwf_flags, tcp->u_arg[flags_arg], "RWF_???");
231 return do_pwritev(tcp, -1);
235 * x32 is the only architecture where preadv2 takes 5 arguments
236 * instead of 6, see preadv64v2 in kernel sources.
237 * Likewise, x32 is the only architecture where pwritev2 takes 5 arguments
238 * instead of 6, see pwritev64v2 in kernel sources.
242 # define PREADV2_PWRITEV2_FLAGS_ARG_NO (current_personality == 2 ? 4 : 5)
244 # define PREADV2_PWRITEV2_FLAGS_ARG_NO (current_personality == 0 ? 4 : 5)
246 # define PREADV2_PWRITEV2_FLAGS_ARG_NO 5
251 return do_preadv(tcp, PREADV2_PWRITEV2_FLAGS_ARG_NO);
256 return do_pwritev(tcp, PREADV2_PWRITEV2_FLAGS_ARG_NO);
259 #include "xlat/splice_flags.h"
264 printfd(tcp, tcp->u_arg[0]);
267 printfd(tcp, tcp->u_arg[1]);
270 tprintf("%" PRI_klu ", ", tcp->u_arg[2]);
271 /* unsigned int flags */
272 printflags(splice_flags, tcp->u_arg[3], "SPLICE_F_???");
280 printfd(tcp, tcp->u_arg[0]);
283 printnum_int64(tcp, tcp->u_arg[1], "%" PRId64);
286 printfd(tcp, tcp->u_arg[2]);
288 /* loff_t *off_out */
289 printnum_int64(tcp, tcp->u_arg[3], "%" PRId64);
292 tprintf("%" PRI_klu ", ", tcp->u_arg[4]);
293 /* unsigned int flags */
294 printflags(splice_flags, tcp->u_arg[5], "SPLICE_F_???");
302 printfd(tcp, tcp->u_arg[0]);
304 /* const struct iovec *iov, unsigned long nr_segs */
305 tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1], IOV_DECODE_STR);
306 tprintf(", %" PRI_klu ", ", tcp->u_arg[2]);
307 /* unsigned int flags */
308 printflags(splice_flags, tcp->u_arg[3], "SPLICE_F_???");