]> CyberLeo.Net >> Repos - FreeBSD/releng/10.3.git/blob - usr.bin/truss/truss.h
- Copy stable/10@296371 to releng/10.3 in preparation for 10.3-RC1
[FreeBSD/releng/10.3.git] / usr.bin / truss / truss.h
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$
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
39 struct procinfo;
40 struct trussinfo;
41
42 struct procabi {
43         const char *type;
44         const char **syscallnames;
45         int nsyscalls;
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  */
65 struct 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
74 struct threadinfo
75 {
76         SLIST_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
85 struct procinfo {
86         LIST_ENTRY(procinfo) entries;
87         pid_t pid;
88         struct procabi *abi;
89
90         SLIST_HEAD(, threadinfo) threadlist;
91 };
92
93 struct 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)