root / lab4 / .minix-src / include / sys / ktrace.h @ 14
History | View | Annotate | Download (9.83 KB)
1 | 13 | up20180614 | /* $NetBSD: ktrace.h,v 1.61 2013/12/09 17:43:58 pooka Exp $ */
|
---|---|---|---|
2 | |||
3 | /*
|
||
4 | * Copyright (c) 1988, 1993
|
||
5 | * The Regents of the University of California. All rights reserved.
|
||
6 | *
|
||
7 | * Redistribution and use in source and binary forms, with or without
|
||
8 | * modification, are permitted provided that the following conditions
|
||
9 | * are met:
|
||
10 | * 1. Redistributions of source code must retain the above copyright
|
||
11 | * notice, this list of conditions and the following disclaimer.
|
||
12 | * 2. Redistributions in binary form must reproduce the above copyright
|
||
13 | * notice, this list of conditions and the following disclaimer in the
|
||
14 | * documentation and/or other materials provided with the distribution.
|
||
15 | * 3. Neither the name of the University nor the names of its contributors
|
||
16 | * may be used to endorse or promote products derived from this software
|
||
17 | * without specific prior written permission.
|
||
18 | *
|
||
19 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||
20 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||
21 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||
22 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||
23 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||
24 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||
25 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||
26 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||
27 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||
28 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||
29 | * SUCH DAMAGE.
|
||
30 | *
|
||
31 | * @(#)ktrace.h 8.2 (Berkeley) 2/19/95
|
||
32 | */
|
||
33 | |||
34 | #ifndef _SYS_KTRACE_H_
|
||
35 | #define _SYS_KTRACE_H_
|
||
36 | |||
37 | #include <sys/mutex.h> |
||
38 | #include <sys/lwp.h> |
||
39 | |||
40 | /*
|
||
41 | * operations to ktrace system call (KTROP(op))
|
||
42 | */
|
||
43 | #define KTROP_SET 0 /* set trace points */ |
||
44 | #define KTROP_CLEAR 1 /* clear trace points */ |
||
45 | #define KTROP_CLEARFILE 2 /* stop all tracing to file */ |
||
46 | #define KTROP_MASK 0x3 |
||
47 | #define KTROP(o) ((o)&KTROP_MASK) /* macro to extract operation */ |
||
48 | /*
|
||
49 | * flags (ORed in with operation)
|
||
50 | */
|
||
51 | #define KTRFLAG_DESCEND 4 /* perform op on all children too */ |
||
52 | |||
53 | /*
|
||
54 | * ktrace record header
|
||
55 | */
|
||
56 | struct ktr_header {
|
||
57 | int ktr_len; /* length of record minus length of old header */ |
||
58 | #if BYTE_ORDER == LITTLE_ENDIAN
|
||
59 | short ktr_type; /* trace record type */ |
||
60 | short ktr_version; /* trace record version */ |
||
61 | #else
|
||
62 | short ktr_version; /* trace record version */ |
||
63 | short ktr_type; /* trace record type */ |
||
64 | #endif
|
||
65 | pid_t ktr_pid; /* process id */
|
||
66 | char ktr_comm[MAXCOMLEN+1]; /* command name */ |
||
67 | union {
|
||
68 | struct { /* v0 */ |
||
69 | struct {
|
||
70 | int32_t tv_sec; |
||
71 | long tv_usec;
|
||
72 | } _tv; |
||
73 | const void *_buf; |
||
74 | } _v0; |
||
75 | struct { /* v1 */ |
||
76 | struct {
|
||
77 | int32_t tv_sec; |
||
78 | long tv_nsec;
|
||
79 | } _ts; |
||
80 | lwpid_t _lid; |
||
81 | } _v1; |
||
82 | struct { /* v2 */ |
||
83 | struct timespec _ts;
|
||
84 | lwpid_t _lid; |
||
85 | } _v2; |
||
86 | } _v; |
||
87 | }; |
||
88 | |||
89 | #define ktr_lid _v._v2._lid
|
||
90 | #define ktr_olid _v._v1._lid
|
||
91 | #define ktr_time _v._v2._ts
|
||
92 | #define ktr_otv _v._v0._tv
|
||
93 | #define ktr_ots _v._v1._ts
|
||
94 | #define ktr_ts _v._v2._ts
|
||
95 | #define ktr_unused _v._v0._buf
|
||
96 | |||
97 | #define KTR_SHIMLEN offsetof(struct ktr_header, ktr_pid) |
||
98 | |||
99 | /*
|
||
100 | * Test for kernel trace point
|
||
101 | */
|
||
102 | #define KTRPOINT(p, type) \
|
||
103 | (((p)->p_traceflag & (1<<(type))) != 0) |
||
104 | |||
105 | /*
|
||
106 | * ktrace record types
|
||
107 | */
|
||
108 | |||
109 | /*
|
||
110 | * KTR_SYSCALL - system call record
|
||
111 | */
|
||
112 | #define KTR_SYSCALL 1 |
||
113 | struct ktr_syscall {
|
||
114 | int ktr_code; /* syscall number */ |
||
115 | int ktr_argsize; /* size of arguments */ |
||
116 | /*
|
||
117 | * followed by ktr_argsize/sizeof(register_t) "register_t"s
|
||
118 | */
|
||
119 | }; |
||
120 | |||
121 | /*
|
||
122 | * KTR_SYSRET - return from system call record
|
||
123 | */
|
||
124 | #define KTR_SYSRET 2 |
||
125 | struct ktr_sysret {
|
||
126 | short ktr_code;
|
||
127 | short ktr_eosys; /* XXX unused */ |
||
128 | int ktr_error;
|
||
129 | register_t ktr_retval; |
||
130 | register_t ktr_retval_1; |
||
131 | }; |
||
132 | |||
133 | /*
|
||
134 | * KTR_NAMEI - namei record
|
||
135 | */
|
||
136 | #define KTR_NAMEI 3 |
||
137 | /* record contains pathname */
|
||
138 | |||
139 | /*
|
||
140 | * KTR_GENIO - trace generic process i/o
|
||
141 | */
|
||
142 | #define KTR_GENIO 4 |
||
143 | struct ktr_genio {
|
||
144 | int ktr_fd;
|
||
145 | enum uio_rw ktr_rw;
|
||
146 | /*
|
||
147 | * followed by data successfully read/written
|
||
148 | */
|
||
149 | }; |
||
150 | |||
151 | /*
|
||
152 | * KTR_PSIG - trace processed signal
|
||
153 | */
|
||
154 | #define KTR_PSIG 5 |
||
155 | struct ktr_psig {
|
||
156 | int signo;
|
||
157 | sig_t action; |
||
158 | sigset_t mask; |
||
159 | int code;
|
||
160 | /*
|
||
161 | * followed by optional siginfo_t
|
||
162 | */
|
||
163 | }; |
||
164 | |||
165 | /*
|
||
166 | * KTR_CSW - trace context switches
|
||
167 | */
|
||
168 | #define KTR_CSW 6 |
||
169 | struct ktr_csw {
|
||
170 | int out; /* 1 if switch out, 0 if switch in */ |
||
171 | int user; /* 1 if usermode (ivcsw), 0 if kernel (vcsw) */ |
||
172 | }; |
||
173 | |||
174 | /*
|
||
175 | * KTR_EMUL - emulation change
|
||
176 | */
|
||
177 | #define KTR_EMUL 7 |
||
178 | /* record contains emulation name */
|
||
179 | |||
180 | /*
|
||
181 | * KTR_USER - user record
|
||
182 | */
|
||
183 | #define KTR_USER 8 |
||
184 | #define KTR_USER_MAXIDLEN 20 |
||
185 | #define KTR_USER_MAXLEN 2048 /* maximum length of passed data */ |
||
186 | struct ktr_user {
|
||
187 | char ktr_id[KTR_USER_MAXIDLEN]; /* string id of caller */ |
||
188 | /*
|
||
189 | * Followed by ktr_len - sizeof(struct ktr_user) of user data.
|
||
190 | */
|
||
191 | }; |
||
192 | |||
193 | /*
|
||
194 | * KTR_EXEC_ARG, KTR_EXEC_ENV - Arguments and environment from exec
|
||
195 | */
|
||
196 | #define KTR_EXEC_ARG 10 |
||
197 | #define KTR_EXEC_ENV 11 |
||
198 | /* record contains arg/env string */
|
||
199 | |||
200 | /*
|
||
201 | * KTR_SAUPCALL - scheduler activated upcall.
|
||
202 | *
|
||
203 | * The structure is no longer used, but retained for compatibility.
|
||
204 | */
|
||
205 | #define KTR_SAUPCALL 13 |
||
206 | struct ktr_saupcall {
|
||
207 | int ktr_type;
|
||
208 | int ktr_nevent;
|
||
209 | int ktr_nint;
|
||
210 | void *ktr_sas;
|
||
211 | void *ktr_ap;
|
||
212 | /*
|
||
213 | * followed by nevent sa_t's from sas[]
|
||
214 | */
|
||
215 | }; |
||
216 | |||
217 | /*
|
||
218 | * KTR_MIB - MIB name and data
|
||
219 | */
|
||
220 | #define KTR_MIB 14 |
||
221 | /* Record contains MIB name */
|
||
222 | |||
223 | /*
|
||
224 | * KTR_EXEC_FD - Opened file descriptor from exec
|
||
225 | */
|
||
226 | #define KTR_EXEC_FD 15 |
||
227 | struct ktr_execfd {
|
||
228 | int ktr_fd;
|
||
229 | u_int ktr_dtype; /* one of DTYPE_* constants */
|
||
230 | }; |
||
231 | |||
232 | /*
|
||
233 | * kernel trace points (in p_traceflag)
|
||
234 | */
|
||
235 | #define KTRFAC_MASK 0x00ffffff |
||
236 | #define KTRFAC_SYSCALL (1<<KTR_SYSCALL) |
||
237 | #define KTRFAC_SYSRET (1<<KTR_SYSRET) |
||
238 | #define KTRFAC_NAMEI (1<<KTR_NAMEI) |
||
239 | #define KTRFAC_GENIO (1<<KTR_GENIO) |
||
240 | #define KTRFAC_PSIG (1<<KTR_PSIG) |
||
241 | #define KTRFAC_CSW (1<<KTR_CSW) |
||
242 | #define KTRFAC_EMUL (1<<KTR_EMUL) |
||
243 | #define KTRFAC_USER (1<<KTR_USER) |
||
244 | #define KTRFAC_EXEC_ARG (1<<KTR_EXEC_ARG) |
||
245 | #define KTRFAC_EXEC_ENV (1<<KTR_EXEC_ENV) |
||
246 | #define KTRFAC_MIB (1<<KTR_MIB) |
||
247 | #define KTRFAC_EXEC_FD (1<<KTR_EXEC_FD) |
||
248 | /*
|
||
249 | * trace flags (also in p_traceflags)
|
||
250 | */
|
||
251 | #define KTRFAC_PERSISTENT 0x80000000 /* persistent trace across sugid |
||
252 | exec (exclusive) */
|
||
253 | #define KTRFAC_INHERIT 0x40000000 /* pass trace flags to children */ |
||
254 | #define KTRFAC_TRC_EMUL 0x10000000 /* ktrace KTR_EMUL before next trace */ |
||
255 | #define KTRFAC_VER_MASK 0x0f000000 /* record version mask */ |
||
256 | #define KTRFAC_VER_SHIFT 24 /* record version shift */ |
||
257 | |||
258 | #define KTRFAC_VERSION(tf) (((tf) & KTRFAC_VER_MASK) >> KTRFAC_VER_SHIFT)
|
||
259 | |||
260 | #define KTRFACv0 (0 << KTRFAC_VER_SHIFT) |
||
261 | #define KTRFACv1 (1 << KTRFAC_VER_SHIFT) |
||
262 | #define KTRFACv2 (2 << KTRFAC_VER_SHIFT) |
||
263 | |||
264 | #ifndef _KERNEL
|
||
265 | |||
266 | #include <sys/cdefs.h> |
||
267 | |||
268 | __BEGIN_DECLS |
||
269 | int ktrace(const char *, int, int, pid_t); |
||
270 | int fktrace(int, int, int, pid_t); |
||
271 | int utrace(const char *, void *, size_t); |
||
272 | __END_DECLS |
||
273 | |||
274 | #else
|
||
275 | |||
276 | void ktrinit(void); |
||
277 | void ktrderef(struct proc *); |
||
278 | void ktradref(struct proc *); |
||
279 | |||
280 | extern kmutex_t ktrace_lock;
|
||
281 | extern int ktrace_on; |
||
282 | |||
283 | int ktruser(const char *, void *, size_t, int); |
||
284 | bool ktr_point(int); |
||
285 | |||
286 | void ktr_csw(int, int); |
||
287 | void ktr_emul(void); |
||
288 | void ktr_geniov(int, enum uio_rw, struct iovec *, size_t, int); |
||
289 | void ktr_genio(int, enum uio_rw, const void *, size_t, int); |
||
290 | void ktr_mibio(int, enum uio_rw, const void *, size_t, int); |
||
291 | void ktr_namei(const char *, size_t); |
||
292 | void ktr_namei2(const char *, size_t, const char *, size_t); |
||
293 | void ktr_psig(int, sig_t, const sigset_t *, const ksiginfo_t *); |
||
294 | void ktr_syscall(register_t, const register_t [], int); |
||
295 | void ktr_sysret(register_t, int, register_t *); |
||
296 | void ktr_kuser(const char *, void *, size_t); |
||
297 | void ktr_mib(const int *a , u_int b); |
||
298 | void ktr_execarg(const void *, size_t); |
||
299 | void ktr_execenv(const void *, size_t); |
||
300 | void ktr_execfd(int, u_int); |
||
301 | |||
302 | int ktrace_common(lwp_t *, int, int, int, file_t **); |
||
303 | |||
304 | static inline int |
||
305 | ktrenter(lwp_t *l) |
||
306 | { |
||
307 | |||
308 | if ((l->l_pflag & LP_KTRACTIVE) != 0) |
||
309 | return 1; |
||
310 | l->l_pflag |= LP_KTRACTIVE; |
||
311 | return 0; |
||
312 | } |
||
313 | |||
314 | static inline void |
||
315 | ktrexit(lwp_t *l) |
||
316 | { |
||
317 | |||
318 | l->l_pflag &= ~LP_KTRACTIVE; |
||
319 | } |
||
320 | |||
321 | static inline bool |
||
322 | ktrpoint(int fac)
|
||
323 | { |
||
324 | return __predict_false(ktrace_on) && __predict_false(ktr_point(1 << fac)); |
||
325 | } |
||
326 | |||
327 | static inline void |
||
328 | ktrcsw(int a, int b) |
||
329 | { |
||
330 | if (__predict_false(ktrace_on))
|
||
331 | ktr_csw(a, b); |
||
332 | } |
||
333 | |||
334 | static inline void |
||
335 | ktremul(void)
|
||
336 | { |
||
337 | if (__predict_false(ktrace_on))
|
||
338 | ktr_emul(); |
||
339 | } |
||
340 | |||
341 | static inline void |
||
342 | ktrgenio(int a, enum uio_rw b, const void *c, size_t d, int e) |
||
343 | { |
||
344 | if (__predict_false(ktrace_on))
|
||
345 | ktr_genio(a, b, c, d, e); |
||
346 | } |
||
347 | |||
348 | static inline void |
||
349 | ktrgeniov(int a, enum uio_rw b, struct iovec *c, int d, int e) |
||
350 | { |
||
351 | if (__predict_false(ktrace_on))
|
||
352 | ktr_geniov(a, b, c, d, e); |
||
353 | } |
||
354 | |||
355 | static inline void |
||
356 | ktrmibio(int a, enum uio_rw b, const void *c, size_t d, int e) |
||
357 | { |
||
358 | if (__predict_false(ktrace_on))
|
||
359 | ktr_mibio(a, b, c, d, e); |
||
360 | } |
||
361 | |||
362 | static inline void |
||
363 | ktrnamei(const char *a, size_t b) |
||
364 | { |
||
365 | if (__predict_false(ktrace_on))
|
||
366 | ktr_namei(a, b); |
||
367 | } |
||
368 | |||
369 | static inline void |
||
370 | ktrnamei2(const char *a, size_t b, const char *c, size_t d) |
||
371 | { |
||
372 | if (__predict_false(ktrace_on))
|
||
373 | ktr_namei2(a, b, c, d); |
||
374 | } |
||
375 | |||
376 | static inline void |
||
377 | ktrpsig(int a, sig_t b, const sigset_t *c, const ksiginfo_t * d) |
||
378 | { |
||
379 | if (__predict_false(ktrace_on))
|
||
380 | ktr_psig(a, b, c, d); |
||
381 | } |
||
382 | |||
383 | static inline void |
||
384 | ktrsyscall(register_t code, const register_t args[], int narg) |
||
385 | { |
||
386 | if (__predict_false(ktrace_on))
|
||
387 | ktr_syscall(code, args, narg); |
||
388 | } |
||
389 | |||
390 | static inline void |
||
391 | ktrsysret(register_t a, int b, register_t *c)
|
||
392 | { |
||
393 | if (__predict_false(ktrace_on))
|
||
394 | ktr_sysret(a, b, c); |
||
395 | } |
||
396 | |||
397 | static inline void |
||
398 | ktrkuser(const char *a, void *b, size_t c) |
||
399 | { |
||
400 | if (__predict_false(ktrace_on))
|
||
401 | ktr_kuser(a, b, c); |
||
402 | } |
||
403 | |||
404 | static inline void |
||
405 | ktrmib(const int *a , u_int b) |
||
406 | { |
||
407 | if (__predict_false(ktrace_on))
|
||
408 | ktr_mib(a, b); |
||
409 | } |
||
410 | |||
411 | static inline void |
||
412 | ktrexecarg(const void *a, size_t b) |
||
413 | { |
||
414 | if (__predict_false(ktrace_on))
|
||
415 | ktr_execarg(a, b); |
||
416 | } |
||
417 | |||
418 | static inline void |
||
419 | ktrexecenv(const void *a, size_t b) |
||
420 | { |
||
421 | if (__predict_false(ktrace_on))
|
||
422 | ktr_execenv(a, b); |
||
423 | } |
||
424 | |||
425 | static inline void |
||
426 | ktrexecfd(int fd, u_int dtype)
|
||
427 | { |
||
428 | if (__predict_false(ktrace_on))
|
||
429 | ktr_execfd(fd, dtype); |
||
430 | } |
||
431 | |||
432 | #endif /* !_KERNEL */ |
||
433 | |||
434 | #endif /* _SYS_KTRACE_H_ */ |