Utest: Give the test a little more time to complete
[akaros.git] / kern / include / oprofile.h
1 /**
2  * @file oprofile.h
3  *
4  * API for machine-specific interrupts to interface
5  * to oprofile.
6  *
7  * @remark Copyright 2002 OProfile authors
8  * @remark Read the file COPYING
9  *
10  * @author John Levon <levon@movementarian.org>
11  */
12
13 #ifndef OPROFILE_H
14 #define OPROFILE_H
15
16 /* Each escaped entry is prefixed by ESCAPE_CODE
17  * then one of the following codes, then the
18  * relevant data.
19  * These #defines live in this file so that arch-specific
20  * buffer sync'ing code can access them.
21  */
22 #define ESCAPE_CODE                     ~0UL
23 #define CTX_SWITCH_CODE                 1
24 #define CPU_SWITCH_CODE                 2
25 #define COOKIE_SWITCH_CODE              3
26 #define KERNEL_ENTER_SWITCH_CODE        4
27 #define KERNEL_EXIT_SWITCH_CODE         5
28 #define MODULE_LOADED_CODE              6
29 #define CTX_TGID_CODE                   7
30 #define TRACE_BEGIN_CODE                8
31 #define TRACE_END_CODE                  9
32 #define XEN_ENTER_SWITCH_CODE           10
33 #define SPU_PROFILING_CODE              11
34 #define SPU_CTX_SWITCH_CODE             12
35 #define IBS_FETCH_CODE                  13
36 #define IBS_OP_CODE                     14
37
38  
39 /* Operations structure to be filled in */
40 struct oprofile_operations {
41         /* create any necessary configuration files in the oprofile fs.
42          * Optional. */
43         int (*create_files)(void* sb, void *root);
44         /* Do any necessary interrupt setup. Optional. */
45         int (*setup)(void);
46         /* Do any necessary interrupt shutdown. Optional. */
47         void (*shutdown)(void);
48         /* Start delivering interrupts. */
49         int (*start)(void);
50         /* Stop delivering interrupts. */
51         void (*stop)(void);
52         /* Arch-specific buffer sync functions.
53          * Return value = 0:  Success
54          * Return value = -1: Failure
55          * Return value = 1:  Run generic sync function
56          */
57         int (*sync_start)(void);
58         int (*sync_stop)(void);
59
60         /* Initiate a stack backtrace. Optional. */
61         void (*backtrace)(void * const regs, unsigned int depth);
62
63         /* Multiplex between different events. Optional. */
64         int (*switch_events)(void);
65         /* CPU identification string. */
66         char * cpu_type;
67 };
68
69 /**
70  * One-time initialisation. *ops must be set to a filled-in
71  * operations structure. This is called even in timer interrupt
72  * mode so an arch can set a backtrace callback.
73  *
74  * If an error occurs, the fields should be left untouched.
75  */
76 int oprofile_arch_init(struct oprofile_operations * ops);
77  
78 /**
79  * One-time exit/cleanup for the arch.
80  */
81 void oprofile_arch_exit(void);
82
83 /**
84  * Add a sample. This may be called from any context.
85  */
86 void oprofile_add_sample(void* const regs, unsigned long event);
87
88 /**
89  * Add an extended sample.  Use this when the PC is not from the regs, and
90  * we cannot determine if we're in kernel mode from the regs.
91  *
92  * This function does perform a backtrace.
93  *
94  */
95 void oprofile_add_ext_sample(unsigned long pc, void * const regs,
96                                 unsigned long event, int is_kernel);
97
98 /* circular include stuff... */
99 struct proc;
100 /**
101  * Add an hardware sample.
102  */
103 void oprofile_add_ext_hw_sample(unsigned long pc, /*struct pt_regs*/void * const regs,
104                                 unsigned long event, int is_kernel,
105                                 struct proc *proc);
106
107 /* Use this instead when the PC value is not from the regs. Doesn't
108  * backtrace. */
109 void oprofile_add_pc(unsigned long pc, int is_kernel, unsigned long event);
110 void oprofile_add_backtrace(uintptr_t ebp);
111
112 /* add a backtrace entry, to be called from the ->backtrace callback */
113 void oprofile_add_trace(unsigned long eip);
114
115
116 /**
117  * Add the contents of a circular buffer to the event buffer.
118  */
119 void oprofile_put_buff(unsigned long *buf, unsigned int start,
120                         unsigned int stop, unsigned int max);
121
122 unsigned long oprofile_get_cpu_buffer_size(void);
123 void oprofile_cpu_buffer_inc_smpl_lost(void);
124  
125 /* cpu buffer functions */
126
127 struct op_sample;
128
129 struct op_entry {
130         void *event;
131         struct op_sample *sample;
132         unsigned long size;
133         unsigned long *data;
134 };
135
136 void oprofile_write_reserve(struct op_entry *entry,
137                             void */*struct pt_regs **/ const regs,
138                             unsigned long pc, int code, int size);
139 int oprofile_add_data(struct op_entry *entry, unsigned long val);
140 int oprofile_add_data64(struct op_entry *entry, uint64_t val);
141 int oprofile_write_commit(struct op_entry *entry);
142
143 int oprofile_perf_init(struct oprofile_operations *ops);
144 void oprofile_perf_exit(void);
145 char *op_name_from_perf_id(void);
146
147 struct op_sample *op_cpu_buffer_read_entry(struct op_entry *entry, int cpu);
148 unsigned long op_cpu_buffer_entries(int cpu);
149 void oprofile_cpubuf_flushone(int core, int newbuf);
150 void oprofile_cpubuf_flushall(int alloc);
151 void oprofile_control_trace(int onoff);
152 int oprofread(void *,int);
153 int oproflen(void);
154
155 #if 0 
156 make these weak funcitons. 
157 static inline int __init oprofile_perf_init(struct oprofile_operations *ops)
158 {
159         pr_info("oprofile: hardware counters not available\n");
160         return -ENODEV;
161 }
162 static inline void oprofile_perf_exit(void) { }
163 #endif
164
165 #endif /* OPROFILE_H */