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 *regs; 89 }; 90 91 struct stack_dump { 92 u16 offset; 93 u64 size; 94 char *data; 95 }; 96 97 struct sample_read_value { 98 u64 value; 99 u64 id; 100 }; 101 102 struct sample_read { 103 u64 time_enabled; 104 u64 time_running; 105 union { 106 struct { 107 u64 nr; 108 struct sample_read_value *values; 109 } group; 110 struct sample_read_value one; 111 }; 112 }; 113 114 struct perf_sample { 115 u64 ip; 116 u32 pid, tid; 117 u64 time; 118 u64 addr; 119 u64 id; 120 u64 stream_id; 121 u64 period; 122 u64 weight; 123 u64 transaction; 124 u32 cpu; 125 u32 raw_size; 126 u64 data_src; 127 void *raw_data; 128 struct ip_callchain *callchain; 129 struct branch_stack *branch_stack; 130 struct regs_dump user_regs; 131 struct stack_dump user_stack; 132 struct sample_read read; 133 }; 134 135 #define PERF_MEM_DATA_SRC_NONE \ 136 (PERF_MEM_S(OP, NA) |\ 137 PERF_MEM_S(LVL, NA) |\ 138 PERF_MEM_S(SNOOP, NA) |\ 139 PERF_MEM_S(LOCK, NA) |\ 140 PERF_MEM_S(TLB, NA)) 141 142 struct build_id_event { 143 struct perf_event_header header; 144 pid_t pid; 145 u8 build_id[PERF_ALIGN(BUILD_ID_SIZE, sizeof(u64))]; 146 char filename[]; 147 }; 148 149 enum perf_user_event_type { /* above any possible kernel type */ 150 PERF_RECORD_USER_TYPE_START = 64, 151 PERF_RECORD_HEADER_ATTR = 64, 152 PERF_RECORD_HEADER_EVENT_TYPE = 65, /* depreceated */ 153 PERF_RECORD_HEADER_TRACING_DATA = 66, 154 PERF_RECORD_HEADER_BUILD_ID = 67, 155 PERF_RECORD_FINISHED_ROUND = 68, 156 PERF_RECORD_HEADER_MAX 157 }; 158 159 struct attr_event { 160 struct perf_event_header header; 161 struct perf_event_attr attr; 162 u64 id[]; 163 }; 164 165 #define MAX_EVENT_NAME 64 166 167 struct perf_trace_event_type { 168 u64 event_id; 169 char name[MAX_EVENT_NAME]; 170 }; 171 172 struct event_type_event { 173 struct perf_event_header header; 174 struct perf_trace_event_type event_type; 175 }; 176 177 struct tracing_data_event { 178 struct perf_event_header header; 179 u32 size; 180 }; 181 182 union perf_event { 183 struct perf_event_header header; 184 struct mmap_event mmap; 185 struct mmap2_event mmap2; 186 struct comm_event comm; 187 struct fork_event fork; 188 struct lost_event lost; 189 struct read_event read; 190 struct throttle_event throttle; 191 struct sample_event sample; 192 struct attr_event attr; 193 struct event_type_event event_type; 194 struct tracing_data_event tracing_data; 195 struct build_id_event build_id; 196 }; 197 198 void perf_event__print_totals(void); 199 200 struct perf_tool; 201 struct thread_map; 202 203 typedef int (*perf_event__handler_t)(struct perf_tool *tool, 204 union perf_event *event, 205 struct perf_sample *sample, 206 struct machine *machine); 207 208 int perf_event__synthesize_thread_map(struct perf_tool *tool, 209 struct thread_map *threads, 210 perf_event__handler_t process, 211 struct machine *machine); 212 int perf_event__synthesize_threads(struct perf_tool *tool, 213 perf_event__handler_t process, 214 struct machine *machine); 215 int perf_event__synthesize_kernel_mmap(struct perf_tool *tool, 216 perf_event__handler_t process, 217 struct machine *machine, 218 const char *symbol_name); 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 sample_regs_user, u64 read_format); 264 int perf_event__synthesize_sample(union perf_event *event, u64 type, 265 u64 sample_regs_user, u64 read_format, 266 const struct perf_sample *sample, 267 bool swapped); 268 269 size_t perf_event__fprintf_comm(union perf_event *event, FILE *fp); 270 size_t perf_event__fprintf_mmap(union perf_event *event, FILE *fp); 271 size_t perf_event__fprintf_mmap2(union perf_event *event, FILE *fp); 272 size_t perf_event__fprintf_task(union perf_event *event, FILE *fp); 273 size_t perf_event__fprintf(union perf_event *event, FILE *fp); 274 275 #endif /* __PERF_RECORD_H */ 276