ktr.h revision 66615
1/*-
2 * Copyright (c) 1996 Berkeley Software Design, Inc. All rights reserved.
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 * 3. Berkeley Software Design Inc's name may not be used to endorse or
13 *    promote products derived from this software without specific prior
14 *    written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY BERKELEY SOFTWARE DESIGN INC ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED.  IN NO EVENT SHALL BERKELEY SOFTWARE DESIGN INC BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 *
28 *	from BSDI $Id: ktr.h,v 1.10.2.7 2000/03/16 21:44:42 cp Exp $
29 * $FreeBSD: head/sys/sys/ktr.h 66615 2000-10-04 01:29:17Z jasone $
30 */
31
32/*
33 *	Wraparound kernel trace buffer support.
34 */
35
36#ifndef _SYS_KTR_H_
37#define _SYS_KTR_H_
38
39/* Requires sys/types.h, sys/time.h, machine/atomic.h, and machine/cpufunc.h */
40
41#include <machine/atomic.h>
42#include <machine/cpufunc.h>
43
44/*
45 * Trace classes
46 */
47#define	KTR_GEN		0x00000001		/* General (TR) */
48#define	KTR_NET		0x00000002		/* Network */
49#define	KTR_DEV		0x00000004		/* Device driver */
50#define	KTR_LOCK	0x00000008		/* MP locking */
51#define	KTR_SMP		0x00000010		/* MP general */
52#define	KTR_FS		0x00000020		/* Filesystem */
53#define KTR_PMAP	0x00000040		/* Pmap tracing */
54#define KTR_MALLOC	0x00000080		/* Malloc tracing */
55#define	KTR_TRAP	0x00000100		/* Trap processing */
56#define	KTR_INTR	0x00000200		/* Interrupt tracing */
57#define KTR_SIG		0x00000400		/* Signal processing */
58#define	KTR_CLK		0x00000800		/* hardclock verbose */
59#define	KTR_PROC	0x00001000		/* Process scheduling */
60#define	KTR_SYSC	0x00002000		/* System call */
61#define	KTR_INIT	0x00004000		/* System initialization */
62#define KTR_KGDB	0x00008000		/* Trace kgdb internals */
63#define	KTR_IO		0x00010000		/* Upper I/O  */
64#define KTR_LOCKMGR	0x00020000
65#define KTR_NFS		0x00040000		/* The obvious */
66#define KTR_VOP		0x00080000		/* The obvious */
67#define KTR_VM		0x00100000		/* The virtual memory system */
68#define KTR_IDLELOOP	0x00200000		/* checks done in the idle process */
69
70/*
71 * Trace classes which can be assigned to particular use at compile time
72 * These must remain in high 22 as some assembly code counts on it
73 */
74#define KTR_CT1		0x010000000
75#define KTR_CT2		0x020000000
76#define KTR_CT3		0x040000000
77#define KTR_CT4		0x080000000
78#define KTR_CT5		0x100000000
79#define KTR_CT6		0x200000000
80#define KTR_CT7		0x400000000
81#define KTR_CT8		0x800000000
82
83/* Trace classes to compile in */
84#ifndef KTR_COMPILE
85#define	KTR_COMPILE	(KTR_GEN)
86#endif
87
88#ifndef KTR_MASK
89#define	KTR_MASK	(KTR_GEN)
90#endif
91
92#ifndef KTR_CPUMASK
93#define	KTR_CPUMASK	(~0)
94#endif
95
96#ifndef LOCORE
97
98#include <sys/time.h>
99
100struct ktr_entry {
101	struct	timespec ktr_tv;
102#ifdef KTR_EXTEND
103#ifndef KTRDESCSIZE
104#define KTRDESCSIZE 80
105#endif
106#ifndef KTRFILENAMESIZE
107#define KTRFILENAMESIZE 32
108#endif
109	char	ktr_desc [KTRDESCSIZE];
110	char    ktr_filename [KTRFILENAMESIZE];
111	int	ktr_line;
112	int	ktr_cpu;
113#else
114	char	*ktr_desc;
115	u_long	ktr_parm1;
116	u_long	ktr_parm2;
117	u_long	ktr_parm3;
118	u_long	ktr_parm4;
119	u_long	ktr_parm5;
120#endif
121};
122
123/* These variables are used by gdb to analyse the output */
124extern int ktr_extend;
125
126extern int ktr_cpumask;
127extern int ktr_mask;
128extern int ktr_entries;
129
130extern volatile int ktr_idx;
131extern struct ktr_entry ktr_buf[];
132
133#endif /* !LOCORE */
134#ifdef KTR
135
136#ifndef KTR_ENTRIES
137#define	KTR_ENTRIES	1024
138#endif
139
140#ifdef KTR_EXTEND
141#ifndef _TR_CPU
142#ifdef SMP
143#define _TR_CPU		cpuid
144#else
145#define _TR_CPU		0
146#endif
147#endif
148#ifndef _TR
149#include <sys/systm.h>
150#define _TR()							\
151        struct ktr_entry *_ktrptr;				\
152	int _ktr_newidx, _ktr_saveidx;				\
153	int _tr_intrsave = save_intr();				\
154	disable_intr();						\
155	do {							\
156		_ktr_saveidx = ktr_idx;				\
157		_ktr_newidx = (ktr_idx + 1) & (KTR_ENTRIES - 1); \
158	} while (atomic_cmpset_int(&ktr_idx, _ktr_saveidx, _ktr_newidx) == 0); \
159	_ktrptr = &ktr_buf[_ktr_saveidx];			\
160	restore_intr(_tr_intrsave);				\
161	nanotime(&_ktrptr->ktr_tv);				\
162	snprintf (_ktrptr->ktr_filename, KTRFILENAMESIZE, "%s", __FILE__); \
163        _ktrptr->ktr_line = __LINE__;				\
164	_ktrptr->ktr_cpu = _TR_CPU;
165#endif
166#define	CTR0(m, _desc) 						\
167	if (KTR_COMPILE & (m)) {				\
168		if ((ktr_mask & (m)) && ((1 << _TR_CPU) & ktr_cpumask)) { \
169			_TR()					\
170			memcpy (_ktrptr->ktr_desc, _desc, KTRDESCSIZE);	\
171		}						\
172	}
173#define	CTR1(m, _desc, _p1)					\
174	if (KTR_COMPILE & (m)) {				\
175		if ((ktr_mask & (m)) && ((1 << _TR_CPU) & ktr_cpumask)) { \
176			_TR()					\
177			snprintf (_ktrptr->ktr_desc, KTRDESCSIZE, _desc, _p1);	\
178		}						\
179	}
180#define	CTR2(m, _desc, _p1, _p2) 				\
181	if (KTR_COMPILE & (m)) {				\
182		if ((ktr_mask & (m)) && ((1 << _TR_CPU) & ktr_cpumask)) { \
183			_TR()					\
184			snprintf (_ktrptr->ktr_desc, KTRDESCSIZE, _desc, _p1, _p2);	\
185		}						\
186	}
187#define	CTR3(m, _desc, _p1, _p2, _p3) 				\
188	if (KTR_COMPILE & (m)) {				\
189		if ((ktr_mask & (m)) && ((1 << _TR_CPU) & ktr_cpumask)) { \
190			_TR()					\
191			snprintf (_ktrptr->ktr_desc, KTRDESCSIZE, _desc, _p1, _p2, _p3);	\
192		}						\
193	}
194#define	CTR4(m, _desc, _p1, _p2, _p3, _p4) 			\
195	if (KTR_COMPILE & (m)) {				\
196		if ((ktr_mask & (m)) && ((1 << _TR_CPU) & ktr_cpumask)) { \
197			_TR()					\
198			snprintf (_ktrptr->ktr_desc, KTRDESCSIZE, _desc, _p1, _p2, _p3, _p4);	\
199		}						\
200	}
201#define	CTR5(m, _desc, _p1, _p2, _p3, _p4, _p5) 		\
202	if (KTR_COMPILE & (m)) {					\
203		if ((ktr_mask & (m)) && ((1 << _TR_CPU) & ktr_cpumask)) { \
204			_TR()					\
205			snprintf (_ktrptr->ktr_desc, KTRDESCSIZE, _desc, _p1, _p2, _p3, _p4, _p5);	\
206		}						\
207	}
208
209#else							    /* not extended */
210#ifndef _TR
211#define _TR(_desc)						\
212        struct ktr_entry *_ktrptr;				\
213	int _ktr_newidx, _ktr_saveidx;				\
214	do {							\
215		_ktr_saveidx = ktr_idx;				\
216		_ktr_newidx = (ktr_idx + 1) & (KTR_ENTRIES - 1); \
217	} while (atomic_cmpset_int(&ktr_idx, _ktr_saveidx, _ktr_newidx) == 0); \
218	_ktrptr = &ktr_buf[_ktr_saveidx];			\
219	nanotime(&_ktrptr->ktr_tv);				\
220	_ktrptr->ktr_desc = (_desc);
221#endif
222#define	CTR0(m, _desc) 						\
223	if (KTR_COMPILE & (m)) {				\
224		if (ktr_mask & (m)) {				\
225			_TR(_desc)				\
226		}						\
227	}
228#define	CTR1(m, _desc, _p1)					\
229	if (KTR_COMPILE & (m)) {				\
230		if (ktr_mask & (m)) {				\
231			_TR(_desc)				\
232			_ktrptr->ktr_parm1 = (u_long)(_p1);	\
233		}						\
234	}
235#define	CTR2(m, _desc, _p1, _p2) 				\
236	if (KTR_COMPILE & (m)) {				\
237		if (ktr_mask & (m)) {				\
238			_TR(_desc)				\
239			_ktrptr->ktr_parm1 = (u_long)(_p1);	\
240			_ktrptr->ktr_parm2 = (u_long)(_p2);	\
241		}						\
242	}
243#define	CTR3(m, _desc, _p1, _p2, _p3) 				\
244	if (KTR_COMPILE & (m)) {				\
245		if (ktr_mask & (m)) {				\
246			_TR(_desc)				\
247			_ktrptr->ktr_parm1 = (u_long)(_p1);	\
248			_ktrptr->ktr_parm2 = (u_long)(_p2);	\
249			_ktrptr->ktr_parm3 = (u_long)(_p3);	\
250		}						\
251	}
252#define	CTR4(m, _desc, _p1, _p2, _p3, _p4) 			\
253	if (KTR_COMPILE & (m)) {				\
254		if (ktr_mask & (m)) {				\
255			_TR(_desc)				\
256			_ktrptr->ktr_parm1 = (u_long)(_p1);	\
257			_ktrptr->ktr_parm2 = (u_long)(_p2);	\
258			_ktrptr->ktr_parm3 = (u_long)(_p3);	\
259			_ktrptr->ktr_parm4 = (u_long)(_p4);	\
260		}						\
261	}
262#define	CTR5(m, _desc, _p1, _p2, _p3, _p4, _p5) 		\
263	if (KTR_COMPILE & (m)) {				\
264		if (ktr_mask & (m)) {				\
265			_TR(_desc)				\
266			_ktrptr->ktr_parm1 = (u_long)(_p1);	\
267			_ktrptr->ktr_parm2 = (u_long)(_p2);	\
268			_ktrptr->ktr_parm3 = (u_long)(_p3);	\
269			_ktrptr->ktr_parm4 = (u_long)(_p4);	\
270			_ktrptr->ktr_parm5 = (u_long)(_p5);	\
271		}						\
272	}
273#endif
274#else	/* KTR */
275#undef KTR_COMPILE
276#define KTR_COMPILE 0
277#define	CTR0(m, d)
278#define	CTR1(m, d, p1)
279#define	CTR2(m, d, p1, p2)
280#define	CTR3(m, d, p1, p2, p3)
281#define	CTR4(m, d, p1, p2, p3, p4)
282#define	CTR5(m, d, p1, p2, p3, p4, p5)
283/* XXX vvvvvvvv ??? */
284#define	SEG_ATR(d,s)
285#define	SEG_ATR_DESC(d,s)
286#define	ATR(d)
287#define	CATR(f,d,n)
288#define	CATRD(f,d,n)
289#endif	/* KTR */
290
291#define	TR0(d)				CTR0(KTR_GEN, d)
292#define	TR1(d, p1)			CTR1(KTR_GEN, d, p1)
293#define	TR2(d, p1, p2)			CTR2(KTR_GEN, d, p1, p2)
294#define	TR3(d, p1, p2, p3)		CTR3(KTR_GEN, d, p1, p2, p3)
295#define	TR4(d, p1, p2, p3, p4)		CTR4(KTR_GEN, d, p1, p2, p3, p4)
296#define	TR5(d, p1, p2, p3, p4, p5)	CTR5(KTR_GEN, d, p1, p2, p3, p4, p5)
297
298/*
299 * Trace initialization events, similar to CTR with KTR_INIT, but
300 * completely ifdef'ed out if KTR_INIT isn't in KTR_COMPILE (to
301 * save string space, the compiler doesn't optimize out strings
302 * for the conditional ones above).
303 */
304#if (KTR_COMPILE & KTR_INIT) != 0
305#define	ITR0(d)				CTR0(KTR_INIT, d)
306#define	ITR1(d, p1)			CTR1(KTR_INIT, d, p1)
307#define	ITR2(d, p1, p2)			CTR2(KTR_INIT, d, p1, p2)
308#define	ITR3(d, p1, p2, p3)		CTR3(KTR_INIT, d, p1, p2, p3)
309#define	ITR4(d, p1, p2, p3, p4)		CTR4(KTR_INIT, d, p1, p2, p3, p4)
310#define	ITR5(d, p1, p2, p3, p4, p5)	CTR5(KTR_INIT, d, p1, p2, p3, p4, p5)
311#else
312#define	ITR0(d)
313#define	ITR1(d, p1)
314#define	ITR2(d, p1, p2)
315#define	ITR3(d, p1, p2, p3)
316#define	ITR4(d, p1, p2, p3, p4)
317#define	ITR5(d, p1, p2, p3, p4, p5)
318#endif
319
320#endif /* !_SYS_KTR_H_ */
321