Fixes bug in cpu_relax_vc()
[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
111 void oprofile_add_backtrace(uintptr_t pc, uintptr_t fp);
112 void oprofile_add_userpc(uintptr_t pc);
113
114 /* add a backtrace entry, to be called from the ->backtrace callback */
115 void oprofile_add_trace(unsigned long eip);
116
117
118 /**
119  * Add the contents of a circular buffer to the event buffer.
120  */
121 void oprofile_put_buff(unsigned long *buf, unsigned int start,
122                         unsigned int stop, unsigned int max);
123
124 unsigned long oprofile_get_cpu_buffer_size(void);
125 void oprofile_cpu_buffer_inc_smpl_lost(void);
126  
127 /* cpu buffer functions */
128
129 struct op_sample;
130
131 struct op_entry {
132         void *event;
133         struct op_sample *sample;
134         unsigned long size;
135         unsigned long *data;
136 };
137
138 void oprofile_write_reserve(struct op_entry *entry,
139                             void */*struct pt_regs **/ const regs,
140                             unsigned long pc, int code, int size);
141 int oprofile_add_data(struct op_entry *entry, unsigned long val);
142 int oprofile_add_data64(struct op_entry *entry, uint64_t val);
143 int oprofile_write_commit(struct op_entry *entry);
144
145 int oprofile_perf_init(struct oprofile_operations *ops);
146 void oprofile_perf_exit(void);
147 char *op_name_from_perf_id(void);
148
149 struct op_sample *op_cpu_buffer_read_entry(struct op_entry *entry, int cpu);
150 unsigned long op_cpu_buffer_entries(int cpu);
151 void oprofile_cpubuf_flushone(int core, int newbuf);
152 void oprofile_cpubuf_flushall(int alloc);
153 void oprofile_control_trace(int onoff);
154 int oprofread(void *,int);
155 int oproflen(void);
156
157 #if 0 
158 make these weak funcitons. 
159 static inline int __init oprofile_perf_init(struct oprofile_operations *ops)
160 {
161         pr_info("oprofile: hardware counters not available\n");
162         return -ENODEV;
163 }
164 static inline void oprofile_perf_exit(void) { }
165 #endif
166
167 #endif /* OPROFILE_H */