1 /*        $NetBSD: ktrace.h,v 1.71 2025/04/06 19:13:06 riastradh 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/param.h>
38 
39 #include <sys/mutex.h>
40 #include <sys/lwp.h>
41 #include <sys/signal.h>
42 #include <sys/time.h>
43 #include <sys/uio.h>
44 
45 /*
46  * operations to ktrace system call  (KTROP(op))
47  */
48 #define KTROP_SET             0         /* set trace points */
49 #define KTROP_CLEAR           1         /* clear trace points */
50 #define KTROP_CLEARFILE                 2         /* stop all tracing to file */
51 #define   KTROP_MASK                    0x3
52 #define   KTROP(o)            ((o)&KTROP_MASK) /* macro to extract operation */
53 /*
54  * flags (ORed in with operation)
55  */
56 #define KTRFLAG_DESCEND                 4         /* perform op on all children too */
57 
58 /*
59  * ktrace record header
60  */
61 struct ktr_header {
62           int       ktr_len;            /* length of record minus length of old header */
63 #if BYTE_ORDER == LITTLE_ENDIAN
64           short     ktr_type;           /* trace record type */
65           short     ktr_version;                  /* trace record version */
66 #else
67           short     ktr_version;                  /* trace record version */
68           short     ktr_type;           /* trace record type */
69 #endif
70           pid_t     ktr_pid;            /* process id */
71           char      ktr_comm[MAXCOMLEN+1];        /* command name */
72           union {
73                     struct { /* v0 */
74                               struct {
75                                         int32_t tv_sec;
76                                         long tv_usec;
77                               } _tv;
78                               const void *_buf;
79                     } _v0;
80                     struct { /* v1 */
81                               struct {
82                                         int32_t tv_sec;
83                                         long tv_nsec;
84                               } _ts;
85                               lwpid_t _lid;
86                     } _v1;
87                     struct { /* v2 */
88                               struct timespec _ts;
89                               lwpid_t _lid;
90                     } _v2;
91           } _v;
92 };
93 
94 #define ktr_lid               _v._v2._lid
95 #define ktr_olid    _v._v1._lid
96 #define ktr_time    _v._v2._ts
97 #define ktr_otv               _v._v0._tv
98 #define ktr_ots               _v._v1._ts
99 #define ktr_ts                _v._v2._ts
100 #define ktr_unused  _v._v0._buf
101 
102 #define   KTR_SHIMLEN         offsetof(struct ktr_header, ktr_pid)
103 
104 /*
105  * Test for kernel trace point
106  */
107 #define KTRPOINT(p, type)     \
108           (((p)->p_traceflag & (1<<(type))) != 0)
109 
110 /*
111  * ktrace record types
112  */
113 
114 /*
115  * KTR_SYSCALL - system call record
116  */
117 #define KTR_SYSCALL 1
118 struct ktr_syscall {
119           int       ktr_code;           /* syscall number */
120           int       ktr_argsize;                  /* size of arguments */
121           /*
122            * followed by ktr_argsize/sizeof(register_t) "register_t"s
123            */
124 };
125 
126 /*
127  * KTR_SYSRET - return from system call record
128  */
129 #define KTR_SYSRET  2
130 struct ktr_sysret {
131           short     ktr_code;
132           short     ktr_eosys;                    /* XXX unused */
133           int       ktr_error;
134           __register_t ktr_retval;
135           __register_t ktr_retval_1;
136 };
137 
138 /*
139  * KTR_NAMEI - namei record
140  */
141 #define KTR_NAMEI   3
142           /* record contains pathname */
143 
144 /*
145  * KTR_GENIO - trace generic process i/o
146  */
147 #define KTR_GENIO   4
148 struct ktr_genio {
149           int       ktr_fd;
150           enum      uio_rw ktr_rw;
151           /*
152            * followed by data successfully read/written
153            */
154 };
155 
156 /*
157  * KTR_PSIG - trace processed signal
158  */
159 #define   KTR_PSIG  5
160 struct ktr_psig {
161           int       signo;
162           sig_t     action;
163           sigset_t mask;
164           int       code;
165           /*
166            * followed by optional siginfo_t
167            */
168 };
169 
170 /*
171  * KTR_CSW - trace context switches
172  */
173 #define KTR_CSW               6
174 struct ktr_csw {
175           int       out;      /* 1 if switch out, 0 if switch in */
176           int       user;     /* 1 if usermode (ivcsw), 0 if kernel (vcsw) */
177 };
178 
179 /*
180  * KTR_EMUL - emulation change
181  */
182 #define KTR_EMUL    7
183           /* record contains emulation name */
184 
185 /*
186  * KTR_USER - user record
187  */
188 #define   KTR_USER  8
189 #define KTR_USER_MAXIDLEN     20
190 #define KTR_USER_MAXLEN                 2048      /* maximum length of passed data */
191 struct ktr_user {
192           char      ktr_id[KTR_USER_MAXIDLEN];    /* string id of caller */
193           /*
194            * Followed by ktr_len - sizeof(struct ktr_user) of user data.
195            */
196 };
197 
198 /*
199  * KTR_EXEC_ARG, KTR_EXEC_ENV - Arguments and environment from exec
200  */
201 #define KTR_EXEC_ARG                    10
202 #define KTR_EXEC_ENV                    11
203           /* record contains arg/env string */
204 
205 /*
206  * KTR_SAUPCALL - scheduler activated upcall.
207  *
208  * The structure is no longer used, but retained for compatibility.
209  */
210 #define   KTR_SAUPCALL        13
211 struct ktr_saupcall {
212           int ktr_type;
213           int ktr_nevent;
214           int ktr_nint;
215           void *ktr_sas;
216           void *ktr_ap;
217           /*
218            * followed by nevent sa_t's from sas[]
219            */
220 };
221 
222 /*
223  * KTR_MIB - MIB name and data
224  */
225 #define KTR_MIB               14
226           /* Record contains MIB name */
227 
228 /*
229  * KTR_EXEC_FD - Opened file descriptor from exec
230  */
231 #define KTR_EXEC_FD           15
232 struct ktr_execfd {
233           int   ktr_fd;
234           u_int ktr_dtype; /* one of DTYPE_* constants */
235 };
236 
237 /*
238  * kernel trace points (in p_traceflag)
239  */
240 #define KTRFAC_MASK 0x00ffffff
241 #define KTRFAC_SYSCALL        (1<<KTR_SYSCALL)
242 #define KTRFAC_SYSRET         (1<<KTR_SYSRET)
243 #define KTRFAC_NAMEI          (1<<KTR_NAMEI)
244 #define KTRFAC_GENIO          (1<<KTR_GENIO)
245 #define   KTRFAC_PSIG         (1<<KTR_PSIG)
246 #define KTRFAC_CSW  (1<<KTR_CSW)
247 #define KTRFAC_EMUL (1<<KTR_EMUL)
248 #define   KTRFAC_USER         (1<<KTR_USER)
249 #define KTRFAC_EXEC_ARG       (1<<KTR_EXEC_ARG)
250 #define KTRFAC_EXEC_ENV       (1<<KTR_EXEC_ENV)
251 #define   KTRFAC_MIB          (1<<KTR_MIB)
252 #define   KTRFAC_EXEC_FD      (1<<KTR_EXEC_FD)
253 
254 #define __KTRACE_FLAG_BITS \
255     "\177\020" \
256     "b\1SYSCALL\0" \
257     "b\2SYSRET\0" \
258     "b\3NAMEI\0" \
259     "b\4GENIO\0" \
260     "b\5PSIG\0" \
261     "b\6CSW\0" \
262     "b\7EMUL\0" \
263     "b\10USER\0" \
264     "b\12EXEC_ARG\0" \
265     "b\13EXEC_ENV\0" \
266     "b\15SAUPCALL\0" \
267     "b\16MIB\0" \
268     "b\17EXEC_FD\0" \
269     "f\30\4VERSION\0" \
270     "b\34TRC_EMUL\0" \
271     "b\36INHERIT\0" \
272     "b\37PERSISTENT\0"
273 
274 /*
275  * trace flags (also in p_traceflags)
276  */
277 #define KTRFAC_PERSISTENT     0x80000000          /* persistent trace across sugid
278                                                                exec (exclusive) */
279 #define KTRFAC_INHERIT        0x40000000          /* pass trace flags to children */
280 #define KTRFAC_TRC_EMUL       0x10000000          /* ktrace KTR_EMUL before next trace */
281 #define   KTRFAC_VER_MASK     0x0f000000          /* record version mask */
282 #define   KTRFAC_VER_SHIFT    24        /* record version shift */
283 
284 #define   KTRFAC_VERSION(tf)  (((tf) & KTRFAC_VER_MASK) >> KTRFAC_VER_SHIFT)
285 
286 #define   KTRFACv0  (0 << KTRFAC_VER_SHIFT)
287 #define   KTRFACv1  (1 << KTRFAC_VER_SHIFT)
288 #define   KTRFACv2  (2 << KTRFAC_VER_SHIFT)
289 
290 #ifndef   _KERNEL
291 
292 #include <sys/cdefs.h>
293 
294 __BEGIN_DECLS
295 int       ktrace(const char *, int, int, pid_t);
296 int       fktrace(int, int, int, pid_t);
297 int       utrace(const char *, void *, size_t);
298 __END_DECLS
299 
300 #else
301 
302 struct syncobj;
303 
304 void ktrinit(void);
305 void ktrderef(struct proc *);
306 void ktradref(struct proc *);
307 
308 extern kmutex_t ktrace_lock;
309 extern int ktrace_on;
310 
311 int ktruser(const char *, void *, size_t, int);
312 bool ktr_point(int);
313 
314 void ktr_csw(int, int, const struct syncobj *);
315 void ktr_emul(void);
316 void ktr_geniov(int, enum uio_rw, struct iovec *, size_t, int);
317 void ktr_genio(int, enum uio_rw, const void *, size_t, int);
318 void ktr_mibio(int, enum uio_rw, const void *, size_t, int);
319 void ktr_namei(const char *, size_t);
320 void ktr_namei2(const char *, size_t, const char *, size_t);
321 void ktr_psig(int, sig_t, const sigset_t *, const ksiginfo_t *);
322 void ktr_syscall(register_t, const register_t [], int);
323 void ktr_sysret(register_t, int, register_t *);
324 void ktr_kuser(const char *, const void *, size_t);
325 void ktr_mib(const int *a , u_int b);
326 void ktr_execarg(const void *, size_t);
327 void ktr_execenv(const void *, size_t);
328 void ktr_execfd(int, u_int);
329 
330 int  ktrace_common(lwp_t *, int, int, int, file_t **);
331 
332 static __inline int
333 ktrenter(lwp_t *l)
334 {
335 
336           if ((l->l_pflag & LP_KTRACTIVE) != 0)
337                     return 1;
338           l->l_pflag |= LP_KTRACTIVE;
339           return 0;
340 }
341 
342 static __inline void
343 ktrexit(lwp_t *l)
344 {
345 
346           l->l_pflag &= ~LP_KTRACTIVE;
347 }
348 
349 static __inline bool
350 ktrpoint(int fac)
351 {
352     return __predict_false(ktrace_on) && __predict_false(ktr_point(1 << fac));
353 }
354 
355 static __inline void
356 ktrcsw(int a, int b, const struct syncobj *c)
357 {
358           if (__predict_false(ktrace_on))
359                     ktr_csw(a, b, c);
360 }
361 
362 static __inline void
363 ktremul(void)
364 {
365           if (__predict_false(ktrace_on))
366                     ktr_emul();
367 }
368 
369 static __inline void
370 ktrgenio(int a, enum uio_rw b, const void *c, size_t d, int e)
371 {
372           if (__predict_false(ktrace_on))
373                     ktr_genio(a, b, c, d, e);
374 }
375 
376 static __inline void
377 ktrgeniov(int a, enum uio_rw b, struct iovec *c, int d, int e)
378 {
379           if (__predict_false(ktrace_on))
380                     ktr_geniov(a, b, c, d, e);
381 }
382 
383 static __inline void
384 ktrmibio(int a, enum uio_rw b, const void *c, size_t d, int e)
385 {
386           if (__predict_false(ktrace_on))
387                     ktr_mibio(a, b, c, d, e);
388 }
389 
390 static __inline void
391 ktrnamei(const char *a, size_t b)
392 {
393           if (__predict_false(ktrace_on))
394                     ktr_namei(a, b);
395 }
396 
397 static __inline void
398 ktrnamei2(const char *a, size_t b, const char *c, size_t d)
399 {
400           if (__predict_false(ktrace_on))
401                     ktr_namei2(a, b, c, d);
402 }
403 
404 static __inline void
405 ktrpsig(int a, sig_t b, const sigset_t *c, const ksiginfo_t * d)
406 {
407           if (__predict_false(ktrace_on))
408                     ktr_psig(a, b, c, d);
409 }
410 
411 static __inline void
412 ktrsyscall(register_t code, const register_t args[], int narg)
413 {
414           if (__predict_false(ktrace_on))
415                     ktr_syscall(code, args, narg);
416 }
417 
418 static __inline void
419 ktrsysret(register_t a, int b, register_t *c)
420 {
421           if (__predict_false(ktrace_on))
422                     ktr_sysret(a, b, c);
423 }
424 
425 static __inline void
426 ktrkuser(const char *a, const void *b, size_t c)
427 {
428           if (__predict_false(ktrace_on))
429                     ktr_kuser(a, b, c);
430 }
431 
432 static __inline void
433 ktrmib(const int *a , u_int b)
434 {
435           if (__predict_false(ktrace_on))
436                     ktr_mib(a, b);
437 }
438 
439 static __inline void
440 ktrexecarg(const void *a, size_t b)
441 {
442           if (__predict_false(ktrace_on))
443                     ktr_execarg(a, b);
444 }
445 
446 static __inline void
447 ktrexecenv(const void *a, size_t b)
448 {
449           if (__predict_false(ktrace_on))
450                     ktr_execenv(a, b);
451 }
452 
453 static __inline void
454 ktrexecfd(int fd, u_int dtype)
455 {
456           if (__predict_false(ktrace_on))
457                     ktr_execfd(fd, dtype);
458 }
459 
460 struct ktrace_entry;
461 int       ktealloc(struct ktrace_entry **, void **, lwp_t *, int, size_t);
462 void      ktesethdrlen(struct ktrace_entry *, size_t);
463 void      ktraddentry(lwp_t *, struct ktrace_entry *, int);
464 /* Flags for ktraddentry (3rd arg) */
465 #define   KTA_NOWAIT                    0x0000
466 #define   KTA_WAITOK                    0x0001
467 #define   KTA_LARGE           0x0002
468 
469 #endif    /* !_KERNEL */
470 
471 #endif /* _SYS_KTRACE_H_ */
472