truss.h revision 296571
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 296571 2016-03-09 18:45:41Z 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#define	DISPLAYTIDS		0x00000080
39
40struct procinfo;
41struct trussinfo;
42
43struct procabi {
44	const char *type;
45	enum sysdecode_abi abi;
46	int (*fetch_args)(struct trussinfo *, u_int);
47	int (*fetch_retval)(struct trussinfo *, long *, int *);
48};
49
50#define	PROCABI(abi)	DATA_SET(procabi, abi)
51
52/*
53 * This is confusingly named.  It holds per-thread state about the
54 * currently executing system call.  syscall.h defines a struct
55 * syscall that holds metadata used to format system call arguments.
56 *
57 * NB: args[] stores the raw argument values (e.g. from registers)
58 * passed to the system call.  s_args[] stores a string representation
59 * of a system call's arguments.  These do not necessarily map one to
60 * one.  A system call description may omit individual arguments
61 * (padding) or combine adjacent arguments (e.g. when passing an off_t
62 * argument on a 32-bit system).  The nargs member contains the count
63 * of valid pointers in s_args[], not args[].
64 */
65struct current_syscall {
66	struct syscall *sc;
67	const char *name;
68	int number;
69	unsigned long args[10];
70	unsigned int nargs;
71	char *s_args[10];	/* the printable arguments */
72};
73
74struct threadinfo
75{
76	LIST_ENTRY(threadinfo) entries;
77	struct procinfo *proc;
78	lwpid_t tid;
79	int in_syscall;
80	struct current_syscall cs;
81	struct timespec before;
82	struct timespec after;
83};
84
85struct procinfo {
86	LIST_ENTRY(procinfo) entries;
87	pid_t pid;
88	struct procabi *abi;
89
90	LIST_HEAD(, threadinfo) threadlist;
91};
92
93struct trussinfo
94{
95	int flags;
96	int strsize;
97	FILE *outfile;
98
99	struct timespec start_time;
100
101	struct threadinfo *curthread;
102
103	LIST_HEAD(, procinfo) proclist;
104};
105
106#define	timespecsubt(tvp, uvp, vvp)					\
107	do {								\
108		(vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec;		\
109		(vvp)->tv_nsec = (tvp)->tv_nsec - (uvp)->tv_nsec;	\
110		if ((vvp)->tv_nsec < 0) {				\
111			(vvp)->tv_sec--;				\
112			(vvp)->tv_nsec += 1000000000;			\
113		}							\
114	} while (0)
115
116#define	timespecadd(tvp, uvp, vvp)					\
117	do {								\
118		(vvp)->tv_sec = (tvp)->tv_sec + (uvp)->tv_sec;		\
119		(vvp)->tv_nsec = (tvp)->tv_nsec + (uvp)->tv_nsec;	\
120		if ((vvp)->tv_nsec > 1000000000) {				\
121			(vvp)->tv_sec++;				\
122			(vvp)->tv_nsec -= 1000000000;			\
123		}							\
124	} while (0)
125