xref: /minix3/minix/usr.bin/trace/proc.h (revision e4e21ee1b2710f3d411514741ce10d80156f4b5d)
1521fa314SDavid van Moolenbroek 
2521fa314SDavid van Moolenbroek #include <sys/queue.h>
3521fa314SDavid van Moolenbroek 
4521fa314SDavid van Moolenbroek /*
5521fa314SDavid van Moolenbroek  * The maximum nesting depth of parentheses/brackets.  The current maximum
6521fa314SDavid van Moolenbroek  * depth is something like six, for UDS control messages.  This constant can be
7521fa314SDavid van Moolenbroek  * increased as necessary without any problem.
8521fa314SDavid van Moolenbroek  */
9521fa314SDavid van Moolenbroek #define MAX_DEPTH	10
10521fa314SDavid van Moolenbroek 
11521fa314SDavid van Moolenbroek /*
12521fa314SDavid van Moolenbroek  * The maximum size of text that may be recorded, including null terminator.
13521fa314SDavid van Moolenbroek  * Increasing this allows longer lines to be recorded and replayed without
14521fa314SDavid van Moolenbroek  * being cut short (see call_replay), but also increases memory usage.
15521fa314SDavid van Moolenbroek  */
16521fa314SDavid van Moolenbroek #define RECORD_BUFSZ	256
17521fa314SDavid van Moolenbroek 
18521fa314SDavid van Moolenbroek struct trace_proc {
19521fa314SDavid van Moolenbroek 	/* identity (public) */
20521fa314SDavid van Moolenbroek 	pid_t pid;
21521fa314SDavid van Moolenbroek 
22521fa314SDavid van Moolenbroek 	/* data structure management (proc.c) */
23521fa314SDavid van Moolenbroek 	TAILQ_ENTRY(trace_proc) next;
24521fa314SDavid van Moolenbroek 
25521fa314SDavid van Moolenbroek 	/* general process state (trace.c) */
26521fa314SDavid van Moolenbroek 	char name[PROC_NAME_LEN];
27521fa314SDavid van Moolenbroek 	unsigned int trace_flags;
28521fa314SDavid van Moolenbroek 	reg_t last_pc;
29521fa314SDavid van Moolenbroek 	reg_t last_sp;
30521fa314SDavid van Moolenbroek 
31521fa314SDavid van Moolenbroek 	/* call enter-to-leave state (call.c) */
32521fa314SDavid van Moolenbroek 	int call_type;
33521fa314SDavid van Moolenbroek 	vir_bytes m_addr;
34521fa314SDavid van Moolenbroek 	message m_out;
35521fa314SDavid van Moolenbroek 	const char *call_name;
36521fa314SDavid van Moolenbroek 	unsigned int call_flags;
37521fa314SDavid van Moolenbroek 	const struct call_handler *call_handler;
38521fa314SDavid van Moolenbroek 	int call_result;
39521fa314SDavid van Moolenbroek 
40521fa314SDavid van Moolenbroek 	/* output state (output.c) */
41521fa314SDavid van Moolenbroek 	int recording;
42521fa314SDavid van Moolenbroek 	char outbuf[RECORD_BUFSZ];
43521fa314SDavid van Moolenbroek 	size_t outlen;
44521fa314SDavid van Moolenbroek 
45521fa314SDavid van Moolenbroek 	/* formatting state (format.c) */
46521fa314SDavid van Moolenbroek 	const char *next_sep;
47521fa314SDavid van Moolenbroek 	int depth;
48521fa314SDavid van Moolenbroek 	struct {
49521fa314SDavid van Moolenbroek 		const char *sep;
50521fa314SDavid van Moolenbroek 		int name;
51521fa314SDavid van Moolenbroek 	} depths[MAX_DEPTH];
52521fa314SDavid van Moolenbroek 
53521fa314SDavid van Moolenbroek 	/* ioctl state (ioctl.c) */
54521fa314SDavid van Moolenbroek 	int ioctl_index;
55521fa314SDavid van Moolenbroek 	unsigned int ioctl_flags;
56*e4e21ee1SDavid van Moolenbroek 
57*e4e21ee1SDavid van Moolenbroek 	/* sysctl state (service/mib.c) */
58*e4e21ee1SDavid van Moolenbroek 	uint32_t sctl_flags;
59*e4e21ee1SDavid van Moolenbroek 	size_t sctl_size;
60*e4e21ee1SDavid van Moolenbroek 	int (*sctl_proc)(struct trace_proc *, const char *, int, const void *,
61*e4e21ee1SDavid van Moolenbroek 	    vir_bytes, size_t);
62*e4e21ee1SDavid van Moolenbroek 	int sctl_arg;
63521fa314SDavid van Moolenbroek };
64521fa314SDavid van Moolenbroek 
65521fa314SDavid van Moolenbroek /* Trace flags. */
66521fa314SDavid van Moolenbroek #define TF_INCALL	0x01	/* the process has entered a system call */
67521fa314SDavid van Moolenbroek #define TF_SKIP		0x02	/* the system call result is to be skipped */
68521fa314SDavid van Moolenbroek #define TF_CTX_SKIP	0x04	/* skip call result only if context changes */
69521fa314SDavid van Moolenbroek #define TF_STOPPING	0x08	/* the process is expecting a SIGSTOP */
70521fa314SDavid van Moolenbroek #define TF_ATTACH	0x10	/* we have not started this process */
71521fa314SDavid van Moolenbroek #define TF_DETACH	0x20	/* detach from the process as soon as we can */
72521fa314SDavid van Moolenbroek #define TF_EXEC		0x40	/* the process may be performing an execve() */
73521fa314SDavid van Moolenbroek #define TF_NOCALL	0x80	/* no system call seen yet (for info only) */
74521fa314SDavid van Moolenbroek 
75521fa314SDavid van Moolenbroek /* Trace classes, determining how the tracer engine should handle a call. */
76521fa314SDavid van Moolenbroek #define TC_NORMAL	0	/* normal call, no exceptions required */
77521fa314SDavid van Moolenbroek #define TC_EXEC		1	/* exec call, success on subsequent SIGSTOP */
78521fa314SDavid van Moolenbroek #define TC_SIGRET	2	/* sigreturn call, success on context change */
79521fa314SDavid van Moolenbroek 
80521fa314SDavid van Moolenbroek /* Call flags. */
81521fa314SDavid van Moolenbroek #define CF_DONE		0x01	/* printing the call parameters is done */
82521fa314SDavid van Moolenbroek #define CF_NORETURN	0x02	/* the call does not return on success */
83521fa314SDavid van Moolenbroek #define CF_HIDE		0x04	/* do not print the current call */
84521fa314SDavid van Moolenbroek #define CF_IPC_ERR	0x08	/* a failure occurred at the IPC level */
85521fa314SDavid van Moolenbroek #define CF_REG_ERR	0x10	/* unable to retrieve the result register */
86521fa314SDavid van Moolenbroek #define CF_MSG_ERR	0x20	/* unable to copy in the reply message */
87521fa314SDavid van Moolenbroek 
88521fa314SDavid van Moolenbroek /* Call types, determining how much has been printed up to the call split. */
89521fa314SDavid van Moolenbroek #define CT_NOTDONE	(0)	/* not all parameters have been printed yet */
90521fa314SDavid van Moolenbroek #define CT_DONE		(CF_DONE)	/* all parameters have been printed */
91521fa314SDavid van Moolenbroek #define CT_NORETURN	(CF_DONE | CF_NORETURN)	/* the no-return call type */
92521fa314SDavid van Moolenbroek 
93521fa314SDavid van Moolenbroek /* Put flags. */
94521fa314SDavid van Moolenbroek #define PF_FAILED	0x01	/* call failed, results may be invalid */
95521fa314SDavid van Moolenbroek #define PF_LOCADDR	0x02	/* pointer is into local address space */
96521fa314SDavid van Moolenbroek /* Yes, PF_LOCAL would conflict with the packet family definition.  Bah. */
97521fa314SDavid van Moolenbroek #define PF_ALT		0x04	/* alternative output (callee specific) */
98521fa314SDavid van Moolenbroek #define PF_STRING	PF_ALT	/* buffer is string (put_buf only) */
99521fa314SDavid van Moolenbroek #define PF_FULL		0x08	/* print full format (callee specific) */
100521fa314SDavid van Moolenbroek #define PF_PATH		(PF_STRING | PF_FULL)	/* flags for path names */
101521fa314SDavid van Moolenbroek #define PF_NONAME	0x10	/* default to no field names at this depth */
102521fa314SDavid van Moolenbroek 
103521fa314SDavid van Moolenbroek /* I/O control flags. */
104521fa314SDavid van Moolenbroek #define IF_OUT		0x1	/* call to print outgoing (written) data */
105521fa314SDavid van Moolenbroek #define IF_IN		0x2	/* call to print incoming (read) data */
106521fa314SDavid van Moolenbroek #define IF_ALL		0x4	/* all fields printed (not really a bit) */
107*e4e21ee1SDavid van Moolenbroek 
108*e4e21ee1SDavid van Moolenbroek /* Sysctl processing types, determining what the callback function is to do. */
109*e4e21ee1SDavid van Moolenbroek #define ST_NAME		0	/* print the rest of the name */
110*e4e21ee1SDavid van Moolenbroek #define ST_OLDP		1	/* print the data pointed to by oldp */
111*e4e21ee1SDavid van Moolenbroek #define ST_NEWP		2	/* print the data pointed to by newp */
112