summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/sys/ftrace.h
blob: 8fa940d62bed168451c940532520a184b479d124 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef	_SYS_FTRACE_H
#define	_SYS_FTRACE_H

#pragma ident	"%Z%%M%	%I%	%E% SMI"

#ifdef	__cplusplus
extern "C" {
#endif

/*
 * Constants used by both asm and non-asm code.
 */

/*
 * Flags determining the state of tracing -
 *   both for the "ftrace_state" variable, and for the per-CPU variable
 *   "cpu[N]->cpu_ftrace_state".
 */
#define	FTRACE_READY	0x00000001
#define	FTRACE_ENABLED	0x00000002

#if !defined(_ASM)

#include <sys/thread.h>
#include <sys/cpuvar.h>
#include <sys/types.h>

/*
 * The record of a single event.
 *
 * Should fit nicely into a standard cache line.
 * Here, the 32-bit version is 32 bytes, and the 64-bit version is 64 bytes.
 */
typedef struct ftrace_record {
	char		*ftr_event;
	kthread_t	*ftr_thread;
	uint64_t	ftr_tick;
	caddr_t		ftr_caller;
	ulong_t		ftr_data1;
	ulong_t		ftr_data2;
	ulong_t		ftr_data3;
#ifdef	_LP64
	ulong_t		__pad;
#endif
} ftrace_record_t;

/*
 * Default per-CPU event ring buffer size.
 */
#define	FTRACE_NENT 1024

#ifdef _KERNEL

/*
 * Tunable parameters in /etc/system.
 */
extern int ftrace_atboot;	/* Whether to start fast tracing on boot. */
extern int ftrace_nent;		/* Size of the per-CPU event ring buffer. */

extern int		ftrace_cpu_setup(cpu_setup_t, int, void *);
extern void		ftrace_init(void);
extern int		ftrace_start(void);
extern int		ftrace_stop(void);
extern void		ftrace_0(char *, caddr_t);
extern void		ftrace_1(char *, ulong_t, caddr_t);
extern void		ftrace_2(char *, ulong_t, ulong_t, caddr_t);
extern void		ftrace_3(char *, ulong_t, ulong_t, ulong_t, caddr_t);
extern void		ftrace_3_notick(char *, ulong_t, ulong_t, ulong_t,
    caddr_t);

typedef	uintptr_t	ftrace_icookie_t;
extern ftrace_icookie_t ftrace_interrupt_disable(void);
extern void ftrace_interrupt_enable(ftrace_icookie_t);
extern caddr_t caller(void);

#define	FTRACE_0(fmt)						\
	{							\
		if (CPU->cpu_ftrace.ftd_state & FTRACE_ENABLED)	\
			ftrace_0(fmt, caller());		\
	}
#define	FTRACE_1(fmt, d1) 					\
	{							\
		if (CPU->cpu_ftrace.ftd_state & FTRACE_ENABLED)	\
			ftrace_1(fmt, d1, caller());		\
	}
#define	FTRACE_2(fmt, d1, d2) 					\
	{							\
		if (CPU->cpu_ftrace.ftd_state & FTRACE_ENABLED)	\
			ftrace_2(fmt, d1, d2, caller());	\
	}
#define	FTRACE_3(fmt, d1, d2, d3) 				\
	{							\
		if (CPU->cpu_ftrace.ftd_state & FTRACE_ENABLED)	\
			ftrace_3(fmt, d1, d2, d3, caller());	\
	}
#define	FTRACE_START()	ftrace_start()
#define	FTRACE_STOP()	ftrace_stop()

#endif	/* _KERNEL */

#endif	/* !defined(_ASM) */

#ifdef	__cplusplus
}
#endif

#endif	/* _SYS_FTRACE_H */