1 #ifndef __PERF_RECORD_H 2 #define __PERF_RECORD_H 3 4 #include <limits.h> 5 #include <stdio.h> 6 7 #include "../perf.h" 8 #include "map.h" 9 #include "build-id.h" 10 11 struct mmap_event { 12 struct perf_event_header header; 13 u32 pid, tid; 14 u64 start; 15 u64 len; 16 u64 pgoff; 17 char filename[PATH_MAX]; 18 }; 19 20 struct mmap2_event { 21 struct perf_event_header header; 22 u32 pid, tid; 23 u64 start; 24 u64 len; 25 u64 pgoff; 26 u32 maj; 27 u32 min; 28 u64 ino; 29 u64 ino_generation; 30 char filename[PATH_MAX]; 31 }; 32 33 struct comm_event { 34 struct perf_event_header header; 35 u32 pid, tid; 36 char comm[16]; 37 }; 38 39 struct fork_event { 40 struct perf_event_header header; 41 u32 pid, ppid; 42 u32 tid, ptid; 43 u64 time; 44 }; 45 46 struct lost_event { 47 struct perf_event_header header; 48 u64 id; 49 u64 lost; 50 }; 51 52 /* 53 * PERF_FORMAT_ENABLED | PERF_FORMAT_RUNNING | PERF_FORMAT_ID 54 */ 55 struct read_event { 56 struct perf_event_header header; 57 u32 pid, tid; 58 u64 value; 59 u64 time_enabled; 60 u64 time_running; 61 u64 id; 62 }; 63 64 struct throttle_event { 65 struct perf_event_header header; 66 u64 time; 67 u64 id; 68 u64 stream_id; 69 }; 70 71 #define PERF_SAMPLE_MASK \ 72 (PERF_SAMPLE_IP | PERF_SAMPLE_TID | \ 73 PERF_SAMPLE_TIME | PERF_SAMPLE_ADDR | \ 74 PERF_SAMPLE_ID | PERF_SAMPLE_STREAM_ID | \ 75 PERF_SAMPLE_CPU | PERF_SAMPLE_PERIOD | \ 76 PERF_SAMPLE_IDENTIFIER) 77 78 /* perf sample has 16 bits size limit */ 79 #define PERF_SAMPLE_MAX_SIZE (1 << 16) 80 81 struct sample_event { 82 struct perf_event_header header; 83 u64 array[]; 84 }; 85 86 struct regs_dump { 87 u64 abi; 88 u64 mask; 89 u64 *regs; 90 }; 91 92 struct stack_dump { 93 u16 offset; 94 u64 size; 95 char *data; 96 }; 97 98 struct sample_read_value { 99 u64 value; 100 u64 id; 101 }; 102 103 struct sample_read { 104 u64 time_enabled; 105 u64 time_running; 106 union { 107 struct { 108 u64 nr; 109 struct sample_read_value *values; 110 } group; 111 struct sample_read_value one; 112 }; 113 }; 114 115 struct ip_callchain { 116 u64 nr; 117 u64 ips[0]; 118 }; 119 120 struct branch_flags { 121 u64 mispred:1; 122 u64 predicted:1; 123 u64 in_tx:1; 124 u64 abort:1; 125 u64 reserved:60; 126 }; 127 128 struct branch_entry { 129 u64 from; 130 u64 to; 131 struct branch_flags flags; 132 }; 133 134 struct branch_stack { 135 u64 nr; 136 struct branch_entry entries[0]; 137 }; 138 139 struct perf_sample { 140 u64 ip; 141 u32 pid, tid; 142 u64 time; 143 u64 addr; 144 u64 id; 145 u64 stream_id; 146 u64 period; 147 u64 weight; 148 u64 transaction; 149 u32 cpu; 150 u32 raw_size; 151 u64 data_src; 152 void *raw_data; 153 struct ip_callchain *callchain; 154 struct branch_stack *branch_stack; 155 struct regs_dump user_regs; 156 struct stack_dump user_stack; 157 struct sample_read read; 158 }; 159 160 #define PERF_MEM_DATA_SRC_NONE \ 161 (PERF_MEM_S(OP, NA) |\ 162 PERF_MEM_S(LVL, NA) |\ 163 PERF_MEM_S(SNOOP, NA) |\ 164 PERF_MEM_S(LOCK, NA) |\ 165 PERF_MEM_S(TLB, NA)) 166 167 struct build_id_event { 168 struct perf_event_header header; 169 pid_t pid; 170 u8 build_id[PERF_ALIGN(BUILD_ID_SIZE, sizeof(u64))]; 171 char filename[]; 172 }; 173 174 enum perf_user_event_type { /* above any possible kernel type */ 175 PERF_RECORD_USER_TYPE_START = 64, 176 PERF_RECORD_HEADER_ATTR = 64, 177 PERF_RECORD_HEADER_EVENT_TYPE = 65, /* depreceated */ 178 PERF_RECORD_HEADER_TRACING_DATA = 66, 179 PERF_RECORD_HEADER_BUILD_ID = 67, 180 PERF_RECORD_FINISHED_ROUND = 68, 181 PERF_RECORD_HEADER_MAX 182 }; 183 184 struct attr_event { 185 struct perf_event_header header; 186 struct perf_event_attr attr; 187 u64 id[]; 188 }; 189 190 #define MAX_EVENT_NAME 64 191 192 struct perf_trace_event_type { 193 u64 event_id; 194 char name[MAX_EVENT_NAME]; 195 }; 196 197 struct event_type_event { 198 struct perf_event_header header; 199 struct perf_trace_event_type event_type; 200 }; 201 202 struct tracing_data_event { 203 struct perf_event_header header; 204 u32 size; 205 }; 206 207 union perf_event { 208 struct perf_event_header header; 209 struct mmap_event mmap; 210 struct mmap2_event mmap2; 211 struct comm_event comm; 212 struct fork_event fork; 213 struct lost_event lost; 214 struct read_event read; 215 struct throttle_event throttle; 216 struct sample_event sample; 217 struct attr_event attr; 218 struct event_type_event event_type; 219 struct tracing_data_event tracing_data; 220 struct build_id_event build_id; 221 }; 222 223 void perf_event__print_totals(void); 224 225 struct perf_tool; 226 struct thread_map; 227 228 typedef int (*perf_event__handler_t)(struct perf_tool *tool, 229 union perf_event *event, 230 struct perf_sample *sample, 231 struct machine *machine); 232 233 int perf_event__synthesize_thread_map(struct perf_tool *tool, 234 struct thread_map *threads, 235 perf_event__handler_t process, 236 struct machine *machine, bool mmap_data); 237 int perf_event__synthesize_threads(struct perf_tool *tool, 238 perf_event__handler_t process, 239 struct machine *machine, bool mmap_data); 240 int perf_event__synthesize_kernel_mmap(struct perf_tool *tool, 241 perf_event__handler_t process, 242 struct machine *machine); 243 244 int perf_event__synthesize_modules(struct perf_tool *tool, 245 perf_event__handler_t process, 246 struct machine *machine); 247 248 int perf_event__process_comm(struct perf_tool *tool, 249 union perf_event *event, 250 struct perf_sample *sample, 251 struct machine *machine); 252 int perf_event__process_lost(struct perf_tool *tool, 253 union perf_event *event, 254 struct perf_sample *sample, 255 struct machine *machine); 256 int perf_event__process_mmap(struct perf_tool *tool, 257 union perf_event *event, 258 struct perf_sample *sample, 259 struct machine *machine); 260 int perf_event__process_mmap2(struct perf_tool *tool, 261 union perf_event *event, 262 struct perf_sample *sample, 263 struct machine *machine); 264 int perf_event__process_fork(struct perf_tool *tool, 265 union perf_event *event, 266 struct perf_sample *sample, 267 struct machine *machine); 268 int perf_event__process_exit(struct perf_tool *tool, 269 union perf_event *event, 270 struct perf_sample *sample, 271 struct machine *machine); 272 int perf_event__process(struct perf_tool *tool, 273 union perf_event *event, 274 struct perf_sample *sample, 275 struct machine *machine); 276 277 struct addr_location; 278 279 int perf_event__preprocess_sample(const union perf_event *event, 280 struct machine *machine, 281 struct addr_location *al, 282 struct perf_sample *sample); 283 284 const char *perf_event__name(unsigned int id); 285 286 size_t perf_event__sample_event_size(const struct perf_sample *sample, u64 type, 287 u64 read_format); 288 int perf_event__synthesize_sample(union perf_event *event, u64 type, 289 u64 read_format, 290 const struct perf_sample *sample, 291 bool swapped); 292 293 int perf_event__synthesize_mmap_events(struct perf_tool *tool, 294 union perf_event *event, 295 pid_t pid, pid_t tgid, 296 perf_event__handler_t process, 297 struct machine *machine, 298 bool mmap_data); 299 300 size_t perf_event__fprintf_comm(union perf_event *event, FILE *fp); 301 size_t perf_event__fprintf_mmap(union perf_event *event, FILE *fp); 302 size_t perf_event__fprintf_mmap2(union perf_event *event, FILE *fp); 303 size_t perf_event__fprintf_task(union perf_event *event, FILE *fp); 304 size_t perf_event__fprintf(union perf_event *event, FILE *fp); 305 306 u64 kallsyms__get_function_start(const char *kallsyms_filename, 307 const char *symbol_name); 308 309 #endif /* __PERF_RECORD_H */ 310