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 perf_sample { 116 u64 ip; 117 u32 pid, tid; 118 u64 time; 119 u64 addr; 120 u64 id; 121 u64 stream_id; 122 u64 period; 123 u64 weight; 124 u64 transaction; 125 u32 cpu; 126 u32 raw_size; 127 u64 data_src; 128 void *raw_data; 129 struct ip_callchain *callchain; 130 struct branch_stack *branch_stack; 131 struct regs_dump user_regs; 132 struct stack_dump user_stack; 133 struct sample_read read; 134 }; 135 136 #define PERF_MEM_DATA_SRC_NONE \ 137 (PERF_MEM_S(OP, NA) |\ 138 PERF_MEM_S(LVL, NA) |\ 139 PERF_MEM_S(SNOOP, NA) |\ 140 PERF_MEM_S(LOCK, NA) |\ 141 PERF_MEM_S(TLB, NA)) 142 143 struct build_id_event { 144 struct perf_event_header header; 145 pid_t pid; 146 u8 build_id[PERF_ALIGN(BUILD_ID_SIZE, sizeof(u64))]; 147 char filename[]; 148 }; 149 150 enum perf_user_event_type { /* above any possible kernel type */ 151 PERF_RECORD_USER_TYPE_START = 64, 152 PERF_RECORD_HEADER_ATTR = 64, 153 PERF_RECORD_HEADER_EVENT_TYPE = 65, /* depreceated */ 154 PERF_RECORD_HEADER_TRACING_DATA = 66, 155 PERF_RECORD_HEADER_BUILD_ID = 67, 156 PERF_RECORD_FINISHED_ROUND = 68, 157 PERF_RECORD_HEADER_MAX 158 }; 159 160 struct attr_event { 161 struct perf_event_header header; 162 struct perf_event_attr attr; 163 u64 id[]; 164 }; 165 166 #define MAX_EVENT_NAME 64 167 168 struct perf_trace_event_type { 169 u64 event_id; 170 char name[MAX_EVENT_NAME]; 171 }; 172 173 struct event_type_event { 174 struct perf_event_header header; 175 struct perf_trace_event_type event_type; 176 }; 177 178 struct tracing_data_event { 179 struct perf_event_header header; 180 u32 size; 181 }; 182 183 union perf_event { 184 struct perf_event_header header; 185 struct mmap_event mmap; 186 struct mmap2_event mmap2; 187 struct comm_event comm; 188 struct fork_event fork; 189 struct lost_event lost; 190 struct read_event read; 191 struct throttle_event throttle; 192 struct sample_event sample; 193 struct attr_event attr; 194 struct event_type_event event_type; 195 struct tracing_data_event tracing_data; 196 struct build_id_event build_id; 197 }; 198 199 void perf_event__print_totals(void); 200 201 struct perf_tool; 202 struct thread_map; 203 204 typedef int (*perf_event__handler_t)(struct perf_tool *tool, 205 union perf_event *event, 206 struct perf_sample *sample, 207 struct machine *machine); 208 209 int perf_event__synthesize_thread_map(struct perf_tool *tool, 210 struct thread_map *threads, 211 perf_event__handler_t process, 212 struct machine *machine, bool mmap_data); 213 int perf_event__synthesize_threads(struct perf_tool *tool, 214 perf_event__handler_t process, 215 struct machine *machine, bool mmap_data); 216 int perf_event__synthesize_kernel_mmap(struct perf_tool *tool, 217 perf_event__handler_t process, 218 struct machine *machine); 219 220 int perf_event__synthesize_modules(struct perf_tool *tool, 221 perf_event__handler_t process, 222 struct machine *machine); 223 224 int perf_event__process_comm(struct perf_tool *tool, 225 union perf_event *event, 226 struct perf_sample *sample, 227 struct machine *machine); 228 int perf_event__process_lost(struct perf_tool *tool, 229 union perf_event *event, 230 struct perf_sample *sample, 231 struct machine *machine); 232 int perf_event__process_mmap(struct perf_tool *tool, 233 union perf_event *event, 234 struct perf_sample *sample, 235 struct machine *machine); 236 int perf_event__process_mmap2(struct perf_tool *tool, 237 union perf_event *event, 238 struct perf_sample *sample, 239 struct machine *machine); 240 int perf_event__process_fork(struct perf_tool *tool, 241 union perf_event *event, 242 struct perf_sample *sample, 243 struct machine *machine); 244 int perf_event__process_exit(struct perf_tool *tool, 245 union perf_event *event, 246 struct perf_sample *sample, 247 struct machine *machine); 248 int perf_event__process(struct perf_tool *tool, 249 union perf_event *event, 250 struct perf_sample *sample, 251 struct machine *machine); 252 253 struct addr_location; 254 255 int perf_event__preprocess_sample(const union perf_event *event, 256 struct machine *machine, 257 struct addr_location *al, 258 struct perf_sample *sample); 259 260 const char *perf_event__name(unsigned int id); 261 262 size_t perf_event__sample_event_size(const struct perf_sample *sample, u64 type, 263 u64 read_format); 264 int perf_event__synthesize_sample(union perf_event *event, u64 type, 265 u64 read_format, 266 const struct perf_sample *sample, 267 bool swapped); 268 269 int perf_event__synthesize_mmap_events(struct perf_tool *tool, 270 union perf_event *event, 271 pid_t pid, pid_t tgid, 272 perf_event__handler_t process, 273 struct machine *machine, 274 bool mmap_data); 275 276 size_t perf_event__fprintf_comm(union perf_event *event, FILE *fp); 277 size_t perf_event__fprintf_mmap(union perf_event *event, FILE *fp); 278 size_t perf_event__fprintf_mmap2(union perf_event *event, FILE *fp); 279 size_t perf_event__fprintf_task(union perf_event *event, FILE *fp); 280 size_t perf_event__fprintf(union perf_event *event, FILE *fp); 281 282 u64 kallsyms__get_function_start(const char *kallsyms_filename, 283 const char *symbol_name); 284 285 #endif /* __PERF_RECORD_H */ 286