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 */
|