176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman/*
276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * Copyright (c) 1991, 1992 Paul Kranenburg <pk@cs.few.eur.nl>
376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com>
54dc8a2aec63e4fb5ee2688544c4de323ed5de3efWichert Akkerman * Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl>
676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * All rights reserved.
776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman *
876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * Redistribution and use in source and binary forms, with or without
976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * modification, are permitted provided that the following conditions
1076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * are met:
1176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * 1. Redistributions of source code must retain the above copyright
1276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman *    notice, this list of conditions and the following disclaimer.
1376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * 2. Redistributions in binary form must reproduce the above copyright
1476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman *    notice, this list of conditions and the following disclaimer in the
1576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman *    documentation and/or other materials provided with the distribution.
1676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * 3. The name of the author may not be used to endorse or promote products
1776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman *    derived from this software without specific prior written permission.
1876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman *
1976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
2076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
2176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
2276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
2376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman */
3076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
3176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#include "defs.h"
3276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#include <fcntl.h>
331d08dcf46dd4b2cfe3e27723c05b0aec9955c591John Hughes#if HAVE_SYS_UIO_H
34a6d91ded3f2d5401e09a9c2fa442aabfbfe593a8Denys Vlasenko# include <sys/uio.h>
351d08dcf46dd4b2cfe3e27723c05b0aec9955c591John Hughes#endif
3676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
3776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkermanint
383138213bc9a827a372ad9f8009ebcc5d8797ce2dDmitry V. Levinsys_read(struct tcb *tcp)
3976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
4076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (entering(tcp)) {
413138213bc9a827a372ad9f8009ebcc5d8797ce2dDmitry V. Levin		printfd(tcp, tcp->u_arg[0]);
4260fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints(", ");
4376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	} else {
4476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (syserror(tcp))
4576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf("%#lx", tcp->u_arg[1]);
4676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		else
4776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			printstr(tcp, tcp->u_arg[1], tcp->u_rval);
4876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf(", %lu", tcp->u_arg[2]);
4976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
5076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	return 0;
5176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
5276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
5376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkermanint
543138213bc9a827a372ad9f8009ebcc5d8797ce2dDmitry V. Levinsys_write(struct tcb *tcp)
5576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
5676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (entering(tcp)) {
573138213bc9a827a372ad9f8009ebcc5d8797ce2dDmitry V. Levin		printfd(tcp, tcp->u_arg[0]);
5860fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints(", ");
5976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]);
6076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf(", %lu", tcp->u_arg[2]);
6176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
6276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	return 0;
6376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
6476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
651d08dcf46dd4b2cfe3e27723c05b0aec9955c591John Hughes#if HAVE_SYS_UIO_H
66e0bc222263cf47a43e1b26d55edb2ffadc8ccbffDenys Vlasenko/*
67e0bc222263cf47a43e1b26d55edb2ffadc8ccbffDenys Vlasenko * data_size limits the cumulative size of printed data.
68e0bc222263cf47a43e1b26d55edb2ffadc8ccbffDenys Vlasenko * Example: recvmsg returing a short read.
69e0bc222263cf47a43e1b26d55edb2ffadc8ccbffDenys Vlasenko */
70bf79f2e16b090ffe59cd1e1820935680a2da7b78Wichert Akkermanvoid
71e0bc222263cf47a43e1b26d55edb2ffadc8ccbffDenys Vlasenkotprint_iov_upto(struct tcb *tcp, unsigned long len, unsigned long addr, int decode_iov, unsigned long data_size)
72bf79f2e16b090ffe59cd1e1820935680a2da7b78Wichert Akkerman{
738470374cba7df0e70653d95c4f336a4082c68d82Denys Vlasenko#if SUPPORTED_PERSONALITIES > 1
744ebb4e3d312bb8215f4eea9130cce6bb8bdb972fDmitry V. Levin	union {
754ebb4e3d312bb8215f4eea9130cce6bb8bdb972fDmitry V. Levin		struct { u_int32_t base; u_int32_t len; } iov32;
764ebb4e3d312bb8215f4eea9130cce6bb8bdb972fDmitry V. Levin		struct { u_int64_t base; u_int64_t len; } iov64;
774ebb4e3d312bb8215f4eea9130cce6bb8bdb972fDmitry V. Levin	} iov;
784ebb4e3d312bb8215f4eea9130cce6bb8bdb972fDmitry V. Levin#define sizeof_iov \
799fd4f96d2a2527ac7ca90c156bfc11ce10118684Denys Vlasenko	(current_wordsize == 4 ? sizeof(iov.iov32) : sizeof(iov.iov64))
804ebb4e3d312bb8215f4eea9130cce6bb8bdb972fDmitry V. Levin#define iov_iov_base \
819fd4f96d2a2527ac7ca90c156bfc11ce10118684Denys Vlasenko	(current_wordsize == 4 ? (uint64_t) iov.iov32.base : iov.iov64.base)
824ebb4e3d312bb8215f4eea9130cce6bb8bdb972fDmitry V. Levin#define iov_iov_len \
839fd4f96d2a2527ac7ca90c156bfc11ce10118684Denys Vlasenko	(current_wordsize == 4 ? (uint64_t) iov.iov32.len : iov.iov64.len)
844ebb4e3d312bb8215f4eea9130cce6bb8bdb972fDmitry V. Levin#else
85aa524c88c49814863cb7f19e5c8a8eeca6ce22feRoland McGrath	struct iovec iov;
864ebb4e3d312bb8215f4eea9130cce6bb8bdb972fDmitry V. Levin#define sizeof_iov sizeof(iov)
874ebb4e3d312bb8215f4eea9130cce6bb8bdb972fDmitry V. Levin#define iov_iov_base iov.iov_base
884ebb4e3d312bb8215f4eea9130cce6bb8bdb972fDmitry V. Levin#define iov_iov_len iov.iov_len
894ebb4e3d312bb8215f4eea9130cce6bb8bdb972fDmitry V. Levin#endif
90aa524c88c49814863cb7f19e5c8a8eeca6ce22feRoland McGrath	unsigned long size, cur, end, abbrev_end;
91aa524c88c49814863cb7f19e5c8a8eeca6ce22feRoland McGrath	int failed = 0;
92bf79f2e16b090ffe59cd1e1820935680a2da7b78Wichert Akkerman
93bf79f2e16b090ffe59cd1e1820935680a2da7b78Wichert Akkerman	if (!len) {
9460fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints("[]");
95bf79f2e16b090ffe59cd1e1820935680a2da7b78Wichert Akkerman		return;
96bf79f2e16b090ffe59cd1e1820935680a2da7b78Wichert Akkerman	}
974ebb4e3d312bb8215f4eea9130cce6bb8bdb972fDmitry V. Levin	size = len * sizeof_iov;
98aa524c88c49814863cb7f19e5c8a8eeca6ce22feRoland McGrath	end = addr + size;
994ebb4e3d312bb8215f4eea9130cce6bb8bdb972fDmitry V. Levin	if (!verbose(tcp) || size / sizeof_iov != len || end < addr) {
100aa524c88c49814863cb7f19e5c8a8eeca6ce22feRoland McGrath		tprintf("%#lx", addr);
101bf79f2e16b090ffe59cd1e1820935680a2da7b78Wichert Akkerman		return;
102bf79f2e16b090ffe59cd1e1820935680a2da7b78Wichert Akkerman	}
103aa524c88c49814863cb7f19e5c8a8eeca6ce22feRoland McGrath	if (abbrev(tcp)) {
1044ebb4e3d312bb8215f4eea9130cce6bb8bdb972fDmitry V. Levin		abbrev_end = addr + max_strlen * sizeof_iov;
105aa524c88c49814863cb7f19e5c8a8eeca6ce22feRoland McGrath		if (abbrev_end < addr)
106aa524c88c49814863cb7f19e5c8a8eeca6ce22feRoland McGrath			abbrev_end = end;
107bf79f2e16b090ffe59cd1e1820935680a2da7b78Wichert Akkerman	} else {
108aa524c88c49814863cb7f19e5c8a8eeca6ce22feRoland McGrath		abbrev_end = end;
109aa524c88c49814863cb7f19e5c8a8eeca6ce22feRoland McGrath	}
11060fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko	tprints("[");
1114ebb4e3d312bb8215f4eea9130cce6bb8bdb972fDmitry V. Levin	for (cur = addr; cur < end; cur += sizeof_iov) {
112aa524c88c49814863cb7f19e5c8a8eeca6ce22feRoland McGrath		if (cur > addr)
11360fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko			tprints(", ");
114aa524c88c49814863cb7f19e5c8a8eeca6ce22feRoland McGrath		if (cur >= abbrev_end) {
11560fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko			tprints("...");
116aa524c88c49814863cb7f19e5c8a8eeca6ce22feRoland McGrath			break;
117aa524c88c49814863cb7f19e5c8a8eeca6ce22feRoland McGrath		}
1184ebb4e3d312bb8215f4eea9130cce6bb8bdb972fDmitry V. Levin		if (umoven(tcp, cur, sizeof_iov, (char *) &iov) < 0) {
11960fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko			tprints("?");
120aa524c88c49814863cb7f19e5c8a8eeca6ce22feRoland McGrath			failed = 1;
121aa524c88c49814863cb7f19e5c8a8eeca6ce22feRoland McGrath			break;
122bf79f2e16b090ffe59cd1e1820935680a2da7b78Wichert Akkerman		}
12360fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints("{");
124e0bc222263cf47a43e1b26d55edb2ffadc8ccbffDenys Vlasenko		if (decode_iov) {
125e0bc222263cf47a43e1b26d55edb2ffadc8ccbffDenys Vlasenko			unsigned long len = iov_iov_len;
126e0bc222263cf47a43e1b26d55edb2ffadc8ccbffDenys Vlasenko			if (len > data_size)
127e0bc222263cf47a43e1b26d55edb2ffadc8ccbffDenys Vlasenko				len = data_size;
128e0bc222263cf47a43e1b26d55edb2ffadc8ccbffDenys Vlasenko			data_size -= len;
129e0bc222263cf47a43e1b26d55edb2ffadc8ccbffDenys Vlasenko			printstr(tcp, (long) iov_iov_base, len);
130e0bc222263cf47a43e1b26d55edb2ffadc8ccbffDenys Vlasenko		} else
1318884968a46f5413345de7b0085388a367eb9caaeDmitry V. Levin			tprintf("%#lx", (long) iov_iov_base);
1324ebb4e3d312bb8215f4eea9130cce6bb8bdb972fDmitry V. Levin		tprintf(", %lu}", (unsigned long)iov_iov_len);
133bf79f2e16b090ffe59cd1e1820935680a2da7b78Wichert Akkerman	}
13460fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko	tprints("]");
135aa524c88c49814863cb7f19e5c8a8eeca6ce22feRoland McGrath	if (failed)
136aa524c88c49814863cb7f19e5c8a8eeca6ce22feRoland McGrath		tprintf(" %#lx", addr);
1374ebb4e3d312bb8215f4eea9130cce6bb8bdb972fDmitry V. Levin#undef sizeof_iov
1384ebb4e3d312bb8215f4eea9130cce6bb8bdb972fDmitry V. Levin#undef iov_iov_base
1394ebb4e3d312bb8215f4eea9130cce6bb8bdb972fDmitry V. Levin#undef iov_iov_len
140bf79f2e16b090ffe59cd1e1820935680a2da7b78Wichert Akkerman}
141bf79f2e16b090ffe59cd1e1820935680a2da7b78Wichert Akkerman
142e0bc222263cf47a43e1b26d55edb2ffadc8ccbffDenys Vlasenkovoid
143e0bc222263cf47a43e1b26d55edb2ffadc8ccbffDenys Vlasenkotprint_iov(struct tcb *tcp, unsigned long len, unsigned long addr, int decode_iov)
144e0bc222263cf47a43e1b26d55edb2ffadc8ccbffDenys Vlasenko{
145043b5f81429412cf23d578d1dc2b45107a8352e5Dmitry V. Levin	tprint_iov_upto(tcp, len, addr, decode_iov, (unsigned long) -1L);
146e0bc222263cf47a43e1b26d55edb2ffadc8ccbffDenys Vlasenko}
147e0bc222263cf47a43e1b26d55edb2ffadc8ccbffDenys Vlasenko
14876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkermanint
1493138213bc9a827a372ad9f8009ebcc5d8797ce2dDmitry V. Levinsys_readv(struct tcb *tcp)
15076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
15176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (entering(tcp)) {
1523138213bc9a827a372ad9f8009ebcc5d8797ce2dDmitry V. Levin		printfd(tcp, tcp->u_arg[0]);
15360fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints(", ");
15476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	} else {
15576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (syserror(tcp)) {
15676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf("%#lx, %lu",
15776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman					tcp->u_arg[1], tcp->u_arg[2]);
15876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			return 0;
15976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
1608884968a46f5413345de7b0085388a367eb9caaeDmitry V. Levin		tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1], 1);
16176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf(", %lu", tcp->u_arg[2]);
16276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
16376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	return 0;
16476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
16576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
16676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkermanint
1673138213bc9a827a372ad9f8009ebcc5d8797ce2dDmitry V. Levinsys_writev(struct tcb *tcp)
16876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
16976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (entering(tcp)) {
1703138213bc9a827a372ad9f8009ebcc5d8797ce2dDmitry V. Levin		printfd(tcp, tcp->u_arg[0]);
17160fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints(", ");
1728884968a46f5413345de7b0085388a367eb9caaeDmitry V. Levin		tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1], 1);
17376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf(", %lu", tcp->u_arg[2]);
17476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
17576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	return 0;
17676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
1771d08dcf46dd4b2cfe3e27723c05b0aec9955c591John Hughes#endif
17876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
179c0f8bbda62139da801bb761d8c66724e12638087Roland McGrath/* The SH4 ABI does allow long longs in odd-numbered registers, but
180c0f8bbda62139da801bb761d8c66724e12638087Roland McGrath   does not allow them to be split between registers and memory - and
181c0f8bbda62139da801bb761d8c66724e12638087Roland McGrath   there are only four argument registers for normal functions.  As a
182c0f8bbda62139da801bb761d8c66724e12638087Roland McGrath   result pread takes an extra padding argument before the offset.  This
183c0f8bbda62139da801bb761d8c66724e12638087Roland McGrath   was changed late in the 2.4 series (around 2.4.20).  */
184c0f8bbda62139da801bb761d8c66724e12638087Roland McGrath#if defined(SH)
185c0f8bbda62139da801bb761d8c66724e12638087Roland McGrath#define PREAD_OFFSET_ARG 4
186c0f8bbda62139da801bb761d8c66724e12638087Roland McGrath#else
187c0f8bbda62139da801bb761d8c66724e12638087Roland McGrath#define PREAD_OFFSET_ARG 3
188c0f8bbda62139da801bb761d8c66724e12638087Roland McGrath#endif
189c0f8bbda62139da801bb761d8c66724e12638087Roland McGrath
19076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkermanint
1913138213bc9a827a372ad9f8009ebcc5d8797ce2dDmitry V. Levinsys_pread(struct tcb *tcp)
19276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
19376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (entering(tcp)) {
1943138213bc9a827a372ad9f8009ebcc5d8797ce2dDmitry V. Levin		printfd(tcp, tcp->u_arg[0]);
19560fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints(", ");
19676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	} else {
19776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (syserror(tcp))
19876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf("%#lx", tcp->u_arg[1]);
19976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		else
20076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			printstr(tcp, tcp->u_arg[1], tcp->u_rval);
201b5600fc3df0453ba11f254a9b49add3ffbec9733Andreas Schwab		tprintf(", %lu, ", tcp->u_arg[2]);
2027845a42b39e59e904d01e75e21f7bc7eb6462560Dmitry V. Levin		printllval_aligned(tcp, "%llu", PREAD_OFFSET_ARG);
20376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
20476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	return 0;
20576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
20676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
20776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkermanint
2083138213bc9a827a372ad9f8009ebcc5d8797ce2dDmitry V. Levinsys_pwrite(struct tcb *tcp)
20976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
21076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (entering(tcp)) {
2113138213bc9a827a372ad9f8009ebcc5d8797ce2dDmitry V. Levin		printfd(tcp, tcp->u_arg[0]);
21260fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints(", ");
21376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]);
214b5600fc3df0453ba11f254a9b49add3ffbec9733Andreas Schwab		tprintf(", %lu, ", tcp->u_arg[2]);
2157845a42b39e59e904d01e75e21f7bc7eb6462560Dmitry V. Levin		printllval_aligned(tcp, "%llu", PREAD_OFFSET_ARG);
2162e2553a534f532a1546ea2b2f3dc3cd2276d020dWichert Akkerman	}
2172e2553a534f532a1546ea2b2f3dc3cd2276d020dWichert Akkerman	return 0;
2182e2553a534f532a1546ea2b2f3dc3cd2276d020dWichert Akkerman}
2192e2553a534f532a1546ea2b2f3dc3cd2276d020dWichert Akkerman
2203087dd678088754dddc0c801008e22ca2b7b9a37Damir Shayhutdinov#if HAVE_SYS_UIO_H
2213087dd678088754dddc0c801008e22ca2b7b9a37Damir Shayhutdinovint
2223087dd678088754dddc0c801008e22ca2b7b9a37Damir Shayhutdinovsys_preadv(struct tcb *tcp)
2233087dd678088754dddc0c801008e22ca2b7b9a37Damir Shayhutdinov{
2243087dd678088754dddc0c801008e22ca2b7b9a37Damir Shayhutdinov	if (entering(tcp)) {
2253087dd678088754dddc0c801008e22ca2b7b9a37Damir Shayhutdinov		printfd(tcp, tcp->u_arg[0]);
22660fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints(", ");
2273087dd678088754dddc0c801008e22ca2b7b9a37Damir Shayhutdinov	} else {
2283087dd678088754dddc0c801008e22ca2b7b9a37Damir Shayhutdinov		if (syserror(tcp)) {
2293087dd678088754dddc0c801008e22ca2b7b9a37Damir Shayhutdinov			tprintf("%#lx, %lu", tcp->u_arg[1], tcp->u_arg[2]);
2303087dd678088754dddc0c801008e22ca2b7b9a37Damir Shayhutdinov			return 0;
2313087dd678088754dddc0c801008e22ca2b7b9a37Damir Shayhutdinov		}
2328884968a46f5413345de7b0085388a367eb9caaeDmitry V. Levin		tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1], 1);
2333087dd678088754dddc0c801008e22ca2b7b9a37Damir Shayhutdinov		tprintf(", %lu, ", tcp->u_arg[2]);
2347845a42b39e59e904d01e75e21f7bc7eb6462560Dmitry V. Levin		printllval_unaligned(tcp, "%llu", 3);
2353087dd678088754dddc0c801008e22ca2b7b9a37Damir Shayhutdinov	}
2363087dd678088754dddc0c801008e22ca2b7b9a37Damir Shayhutdinov	return 0;
2373087dd678088754dddc0c801008e22ca2b7b9a37Damir Shayhutdinov}
2383087dd678088754dddc0c801008e22ca2b7b9a37Damir Shayhutdinov
2393087dd678088754dddc0c801008e22ca2b7b9a37Damir Shayhutdinovint
2403087dd678088754dddc0c801008e22ca2b7b9a37Damir Shayhutdinovsys_pwritev(struct tcb *tcp)
2413087dd678088754dddc0c801008e22ca2b7b9a37Damir Shayhutdinov{
2423087dd678088754dddc0c801008e22ca2b7b9a37Damir Shayhutdinov	if (entering(tcp)) {
2433087dd678088754dddc0c801008e22ca2b7b9a37Damir Shayhutdinov		printfd(tcp, tcp->u_arg[0]);
24460fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints(", ");
2458884968a46f5413345de7b0085388a367eb9caaeDmitry V. Levin		tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1], 1);
2463087dd678088754dddc0c801008e22ca2b7b9a37Damir Shayhutdinov		tprintf(", %lu, ", tcp->u_arg[2]);
2477845a42b39e59e904d01e75e21f7bc7eb6462560Dmitry V. Levin		printllval_unaligned(tcp, "%llu", 3);
2483087dd678088754dddc0c801008e22ca2b7b9a37Damir Shayhutdinov	}
2493087dd678088754dddc0c801008e22ca2b7b9a37Damir Shayhutdinov	return 0;
2503087dd678088754dddc0c801008e22ca2b7b9a37Damir Shayhutdinov}
2513087dd678088754dddc0c801008e22ca2b7b9a37Damir Shayhutdinov#endif /* HAVE_SYS_UIO_H */
2523087dd678088754dddc0c801008e22ca2b7b9a37Damir Shayhutdinov
2532c42f32518e43b1e5ccb00c19010a799be6858d4Dmitry V. Levinstatic void
2542c42f32518e43b1e5ccb00c19010a799be6858d4Dmitry V. Levinprint_off_t(struct tcb *tcp, long addr)
2552c42f32518e43b1e5ccb00c19010a799be6858d4Dmitry V. Levin{
2562c42f32518e43b1e5ccb00c19010a799be6858d4Dmitry V. Levin	unsigned long offset;
2572c42f32518e43b1e5ccb00c19010a799be6858d4Dmitry V. Levin
2582c42f32518e43b1e5ccb00c19010a799be6858d4Dmitry V. Levin	if (!addr) {
2592c42f32518e43b1e5ccb00c19010a799be6858d4Dmitry V. Levin		tprints("NULL");
2602c42f32518e43b1e5ccb00c19010a799be6858d4Dmitry V. Levin		return;
2612c42f32518e43b1e5ccb00c19010a799be6858d4Dmitry V. Levin	}
2622c42f32518e43b1e5ccb00c19010a799be6858d4Dmitry V. Levin
2632c42f32518e43b1e5ccb00c19010a799be6858d4Dmitry V. Levin#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
2642c42f32518e43b1e5ccb00c19010a799be6858d4Dmitry V. Levin	if (current_wordsize == 4) {
2652c42f32518e43b1e5ccb00c19010a799be6858d4Dmitry V. Levin		uint32_t off;
2662c42f32518e43b1e5ccb00c19010a799be6858d4Dmitry V. Levin
2672c42f32518e43b1e5ccb00c19010a799be6858d4Dmitry V. Levin		if (umove(tcp, addr, &off) < 0)
2682c42f32518e43b1e5ccb00c19010a799be6858d4Dmitry V. Levin			tprintf("%#lx", addr);
2692c42f32518e43b1e5ccb00c19010a799be6858d4Dmitry V. Levin		else
2702c42f32518e43b1e5ccb00c19010a799be6858d4Dmitry V. Levin			tprintf("[%u]", off);
2712c42f32518e43b1e5ccb00c19010a799be6858d4Dmitry V. Levin	} else
2722c42f32518e43b1e5ccb00c19010a799be6858d4Dmitry V. Levin#endif
2732c42f32518e43b1e5ccb00c19010a799be6858d4Dmitry V. Levin	if (umove(tcp, addr, &offset) < 0)
2742c42f32518e43b1e5ccb00c19010a799be6858d4Dmitry V. Levin		tprintf("%#lx", addr);
2752c42f32518e43b1e5ccb00c19010a799be6858d4Dmitry V. Levin	else
2762c42f32518e43b1e5ccb00c19010a799be6858d4Dmitry V. Levin		tprintf("[%lu]", offset);
2772c42f32518e43b1e5ccb00c19010a799be6858d4Dmitry V. Levin}
2782c42f32518e43b1e5ccb00c19010a799be6858d4Dmitry V. Levin
2792e2553a534f532a1546ea2b2f3dc3cd2276d020dWichert Akkermanint
2803138213bc9a827a372ad9f8009ebcc5d8797ce2dDmitry V. Levinsys_sendfile(struct tcb *tcp)
2812e2553a534f532a1546ea2b2f3dc3cd2276d020dWichert Akkerman{
2822e2553a534f532a1546ea2b2f3dc3cd2276d020dWichert Akkerman	if (entering(tcp)) {
2833138213bc9a827a372ad9f8009ebcc5d8797ce2dDmitry V. Levin		printfd(tcp, tcp->u_arg[0]);
28460fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints(", ");
2853138213bc9a827a372ad9f8009ebcc5d8797ce2dDmitry V. Levin		printfd(tcp, tcp->u_arg[1]);
28660fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints(", ");
2872c42f32518e43b1e5ccb00c19010a799be6858d4Dmitry V. Levin		print_off_t(tcp, tcp->u_arg[2]);
2882e2553a534f532a1546ea2b2f3dc3cd2276d020dWichert Akkerman		tprintf(", %lu", tcp->u_arg[3]);
28976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
29076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	return 0;
29176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
29276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
2930cbed357ab749fa0cf58e8d72230c2ed92334932Mike Frysingervoid
294d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levinprint_loff_t(struct tcb *tcp, long addr)
295d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin{
296d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin	loff_t offset;
297d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin
298d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin	if (!addr)
299d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin		tprints("NULL");
300d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin	else if (umove(tcp, addr, &offset) < 0)
301d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin		tprintf("%#lx", addr);
302d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin	else
303d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin		tprintf("[%llu]", (unsigned long long int) offset);
304d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin}
305d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin
306186c5acdb9af627e0844cf82ed68d0da6dbe13deRoland McGrathint
3073138213bc9a827a372ad9f8009ebcc5d8797ce2dDmitry V. Levinsys_sendfile64(struct tcb *tcp)
308186c5acdb9af627e0844cf82ed68d0da6dbe13deRoland McGrath{
309186c5acdb9af627e0844cf82ed68d0da6dbe13deRoland McGrath	if (entering(tcp)) {
3103138213bc9a827a372ad9f8009ebcc5d8797ce2dDmitry V. Levin		printfd(tcp, tcp->u_arg[0]);
31160fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints(", ");
3123138213bc9a827a372ad9f8009ebcc5d8797ce2dDmitry V. Levin		printfd(tcp, tcp->u_arg[1]);
31360fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints(", ");
314d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin		print_loff_t(tcp, tcp->u_arg[2]);
315186c5acdb9af627e0844cf82ed68d0da6dbe13deRoland McGrath		tprintf(", %lu", tcp->u_arg[3]);
316186c5acdb9af627e0844cf82ed68d0da6dbe13deRoland McGrath	}
317186c5acdb9af627e0844cf82ed68d0da6dbe13deRoland McGrath	return 0;
318186c5acdb9af627e0844cf82ed68d0da6dbe13deRoland McGrath}
319186c5acdb9af627e0844cf82ed68d0da6dbe13deRoland McGrath
3200ed617bd66624cec6138102545d73b2e2346f1f6Dmitry V. Levin#include "xlat/splice_flags.h"
321d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin
322d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levinint
323d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levinsys_tee(struct tcb *tcp)
324d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin{
325d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin	if (entering(tcp)) {
326d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin		/* int fd_in */
327d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin		printfd(tcp, tcp->u_arg[0]);
328d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin		tprints(", ");
329d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin		/* int fd_out */
330d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin		printfd(tcp, tcp->u_arg[1]);
331d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin		tprints(", ");
332d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin		/* size_t len */
333d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin		tprintf("%lu, ", tcp->u_arg[2]);
334d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin		/* unsigned int flags */
335d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin		printflags(splice_flags, tcp->u_arg[3], "SPLICE_F_???");
336d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin	}
337d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin	return 0;
338d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin}
339d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin
340d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levinint
341d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levinsys_splice(struct tcb *tcp)
342d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin{
343d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin	if (entering(tcp)) {
344d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin		/* int fd_in */
345d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin		printfd(tcp, tcp->u_arg[0]);
346d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin		tprints(", ");
347d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin		/* loff_t *off_in */
348d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin		print_loff_t(tcp, tcp->u_arg[1]);
349d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin		tprints(", ");
350d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin		/* int fd_out */
351d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin		printfd(tcp, tcp->u_arg[2]);
352d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin		tprints(", ");
353d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin		/* loff_t *off_out */
354d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin		print_loff_t(tcp, tcp->u_arg[3]);
355d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin		tprints(", ");
356d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin		/* size_t len */
357d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin		tprintf("%lu, ", tcp->u_arg[4]);
358d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin		/* unsigned int flags */
359d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin		printflags(splice_flags, tcp->u_arg[5], "SPLICE_F_???");
360d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin	}
361d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin	return 0;
362d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin}
363d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin
364d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levinint
365d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levinsys_vmsplice(struct tcb *tcp)
366d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin{
367d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin	if (entering(tcp)) {
368d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin		/* int fd */
369d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin		printfd(tcp, tcp->u_arg[0]);
370d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin		tprints(", ");
371d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin		/* const struct iovec *iov, unsigned long nr_segs */
372d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin		tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1], 1);
3730bfd74436d3945e915d373364bbed1f08d3d3c38Dmitry V. Levin		tprintf(", %lu, ", tcp->u_arg[2]);
374d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin		/* unsigned int flags */
375d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin		printflags(splice_flags, tcp->u_arg[3], "SPLICE_F_???");
376d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin	}
377d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin	return 0;
378d99e48c0f33f5230a743cd91a986edba176db2f8Dmitry V. Levin}
37976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
38076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkermanint
3813138213bc9a827a372ad9f8009ebcc5d8797ce2dDmitry V. Levinsys_ioctl(struct tcb *tcp)
38276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
383a9fe13c9437707fa132fde4e51a20d88381e7430Denys Vlasenko	const struct_ioctlent *iop;
38476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
38576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (entering(tcp)) {
3863138213bc9a827a372ad9f8009ebcc5d8797ce2dDmitry V. Levin		printfd(tcp, tcp->u_arg[0]);
38760fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints(", ");
3882843a4e1d2fca851be6e47e7ff2413b45903ac9aRoland McGrath		iop = ioctl_lookup(tcp->u_arg[1]);
3892843a4e1d2fca851be6e47e7ff2413b45903ac9aRoland McGrath		if (iop) {
3905940e6593911dcace424c668a1c0934c71fccb9eDenys Vlasenko			tprints(iop->symbol);
3912843a4e1d2fca851be6e47e7ff2413b45903ac9aRoland McGrath			while ((iop = ioctl_next_match(iop)))
3922843a4e1d2fca851be6e47e7ff2413b45903ac9aRoland McGrath				tprintf(" or %s", iop->symbol);
3932843a4e1d2fca851be6e47e7ff2413b45903ac9aRoland McGrath		} else
39476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf("%#lx", tcp->u_arg[1]);
39576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		ioctl_decode(tcp, tcp->u_arg[1], tcp->u_arg[2]);
39676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
39776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	else {
3985d64581e106f47c474707001f924ee15ef22830bDenys Vlasenko		int ret = ioctl_decode(tcp, tcp->u_arg[1], tcp->u_arg[2]);
3995d64581e106f47c474707001f924ee15ef22830bDenys Vlasenko		if (!ret)
40076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf(", %#lx", tcp->u_arg[2]);
40138ae88d332acd9f86a30d58158e306d795d98977John Hughes		else
40238ae88d332acd9f86a30d58158e306d795d98977John Hughes			return ret - 1;
40376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
40476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	return 0;
40576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
406