summaryrefslogtreecommitdiff
path: root/release/src/linux/linux/include/linux/kernprof.h
blob: d13ffbe18b5ba47cbae0ac3b7b0104b3a9f68066 (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
#ifndef _LINUX_KERNPROF_H
#define _LINUX_KERNPROF_H

#include <linux/ioctl.h>

#define CG_MAX_ARCS (1 << (8 * sizeof(short)))

#define PROF_BACKTRACE_BUFSIZE	4096  /* must be a power of 2 */
#define PROF_BACKTRACE_MAX_LEN	24

typedef unsigned int PC_sample_count_t;

/* profiling ioctl requests */
#define PROF_START		_IO(0xAF, 0)
#define PROF_STOP		_IO(0xAF, 1)
#define PROF_RESET		_IO(0xAF, 2)
#define PROF_SET_SAMPLE_FREQ	_IOW(0xAF, 3, int)
#define PROF_GET_SAMPLE_FREQ	_IOR(0xAF, 4, int)
#define PROF_GET_PC_RES		_IOR(0xAF, 5, int)
#define PROF_GET_ON_OFF_STATE	_IOR(0xAF, 6, int)
#define PROF_SET_DOMAIN		_IOW(0xAF, 7, int)
#define PROF_GET_DOMAIN		_IOR(0xAF, 8, int)
#define PROF_SET_MODE		_IOW(0xAF, 9, int)
#define PROF_GET_MODE		_IOR(0xAF, 10, int)
#define PROF_SET_PERFCTR_EVENT	_IOW(0xAF, 11, int)
#define PROF_GET_PERFCTR_EVENT	_IOR(0xAF, 12, int)
/* PROF_*_ENABLE_MAP and PROF_GET_MAPPING ioctl requests are defined below */
#define PROF_SET_PID		_IOW(0xAF, 16, int)
#define PROF_GET_PID		_IOR(0xAF, 17, int)

enum {
	PROF_MODE_PC_SAMPLING = 1,
	PROF_MODE_CALL_GRAPH = 2,
	PROF_MODE_BACKTRACE = 4,
	PROF_MODE_CALL_COUNT = 8,
	PROF_MODE_SCHEDULER_CALL_GRAPH = 16
};

enum {
	PROF_DOMAIN_TIME,
	PROF_DOMAIN_PERFCTR
};

#if defined(CONFIG_KERNPROF) || defined(CONFIG_MCOUNT)
/*
 * To allow for profiling of loaded modules, this structure
 * describes the layout of the buckets used to collect samples.
 */

typedef struct prof_mem_map
{
   unsigned long     kernel_buckets;   /* number of kernel buckets */
   unsigned long     module_buckets;   /* number of module buckets */
   unsigned long     nr_cpus;          /* number of processors whether profiled or not */
   unsigned long     cg_from_size;     /* size of one cg_from array */
   unsigned long     cg_to_size;       /* size of one cg_to array */
   unsigned long     cg_to_offset;     /* offset of cg_to array */
   unsigned long     kernel_start;     /* lowest text address in kernel */
   unsigned long     kernel_end;       /* highest text address in kernel */
   unsigned long     module_start;     /* lowest text address in all modules */
   unsigned long     module_end;       /* highest text address in all modules */
} prof_mem_map_t;
#endif /* CONFIG_KERNPROF or CONFIG_MCOUNT */

#ifdef __KERNEL__

#include <asm/atomic.h>
#include <asm/ptrace.h>

/*
 * We don't export this to user space because its pointers may be of different
 * size.  If user space needs this it should define its own version making sure
 * that individual fields are of the same size as in the kernel definition.
 */
struct cg_arc_dest {
	unsigned long address;
	atomic_t count;
	unsigned short link;
	unsigned short pad;
};

/*
 * We do not export these ioctl requests to user space because it may have
 * longs of different size.
 */
#define PROF_SET_ENABLE_MAP	_IOW(0xAF, 13, long)
#define PROF_GET_ENABLE_MAP	_IOR(0xAF, 14, long)
#define PROF_GET_MAPPING	_IOR(0xAF, 15, long)


typedef void (*prof_hook_p)(struct pt_regs *);
typedef void (*mcount_hook_p)(unsigned long, unsigned long);
typedef void (*wakeup_hook_p)(unsigned long, unsigned long, unsigned long);

extern char _stext, _etext;
extern prof_hook_p prof_timer_hook;
extern prof_hook_p prof_perfctr_hook;
extern mcount_hook_p prof_scheduler_hook;
extern wakeup_hook_p prof_wakeup_hook;
extern mcount_hook_p mcount_hook;

extern int prof_have_frameptr, prof_have_mcount;

extern void USER(void);            /* these can not be in a module */
extern void UNKNOWN_KERNEL(void);
extern void FIRMWARE(void);
extern void STALLED(void);
extern void SLEEPING(void);
extern void MODULE(void);

#define pc_out_of_range(pc)	\
	((pc) < (unsigned long) &_stext || (pc) >= (unsigned long) &_etext)

/* might be overridden by arch-specific redefinition */
#define FUNCTIONPC(func)	(unsigned long) &(func)

#endif /* __KERNEL__ */

#endif /* !_LINUX_KERNPROF_H */