truss.h revision 294849
1/*
2 * Copyright 2001 Jamey Wood
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 *    notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 *    notice, this list of conditions and the following disclaimer in the
11 *    documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23 * SUCH DAMAGE.
24 *
25 * $FreeBSD: head/usr.bin/truss/truss.h 294849 2016-01-26 19:07:09Z jhb $
26 */
27
28#include <sys/linker_set.h>
29#include <sys/queue.h>
30
31#define	FOLLOWFORKS		0x00000001
32#define	RELATIVETIMESTAMPS	0x00000002
33#define	ABSOLUTETIMESTAMPS	0x00000004
34#define	NOSIGS			0x00000008
35#define	EXECVEARGS		0x00000010
36#define	EXECVEENVS		0x00000020
37#define	COUNTONLY		0x00000040
38
39struct procinfo;
40struct trussinfo;
41
42struct procabi {
43	const char *type;
44	enum sysdecode_abi abi;
45	int (*fetch_args)(struct trussinfo *, u_int);
46	int (*fetch_retval)(struct trussinfo *, long *, int *);
47};
48
49#define	PROCABI(abi)	DATA_SET(procabi, abi)
50
51/*
52 * This is confusingly named.  It holds per-thread state about the
53 * currently executing system call.  syscall.h defines a struct
54 * syscall that holds metadata used to format system call arguments.
55 *
56 * NB: args[] stores the raw argument values (e.g. from registers)
57 * passed to the system call.  s_args[] stores a string representation
58 * of a system call's arguments.  These do not necessarily map one to
59 * one.  A system call description may omit individual arguments
60 * (padding) or combine adjacent arguments (e.g. when passing an off_t
61 * argument on a 32-bit system).  The nargs member contains the count
62 * of valid pointers in s_args[], not args[].
63 */
64struct current_syscall {
65	struct syscall *sc;
66	const char *name;
67	int number;
68	unsigned long args[10];
69	unsigned int nargs;
70	char *s_args[10];	/* the printable arguments */
71};
72
73struct threadinfo
74{
75	SLIST_ENTRY(threadinfo) entries;
76	struct procinfo *proc;
77	lwpid_t tid;
78	int in_syscall;
79	struct current_syscall cs;
80	struct timespec before;
81	struct timespec after;
82};
83
84struct procinfo {
85	LIST_ENTRY(procinfo) entries;
86	pid_t pid;
87	struct procabi *abi;
88
89	SLIST_HEAD(, threadinfo) threadlist;
90};
91
92struct trussinfo
93{
94	int flags;
95	int strsize;
96	FILE *outfile;
97
98	struct timespec start_time;
99
100	struct threadinfo *curthread;
101
102	LIST_HEAD(, procinfo) proclist;
103};
104
105#define	timespecsubt(tvp, uvp, vvp)					\
106	do {								\
107		(vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec;		\
108		(vvp)->tv_nsec = (tvp)->tv_nsec - (uvp)->tv_nsec;	\
109		if ((vvp)->tv_nsec < 0) {				\
110			(vvp)->tv_sec--;				\
111			(vvp)->tv_nsec += 1000000000;			\
112		}							\
113	} while (0)
114
115#define	timespecadd(tvp, uvp, vvp)					\
116	do {								\
117		(vvp)->tv_sec = (tvp)->tv_sec + (uvp)->tv_sec;		\
118		(vvp)->tv_nsec = (tvp)->tv_nsec + (uvp)->tv_nsec;	\
119		if ((vvp)->tv_nsec > 1000000000) {				\
120			(vvp)->tv_sec++;				\
121			(vvp)->tv_nsec -= 1000000000;			\
122		}							\
123	} while (0)
124