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 65 #define PERF_SAMPLE_MASK \ 66 (PERF_SAMPLE_IP | PERF_SAMPLE_TID | \ 67 PERF_SAMPLE_TIME | PERF_SAMPLE_ADDR | \ 68 PERF_SAMPLE_ID | PERF_SAMPLE_STREAM_ID | \ 69 PERF_SAMPLE_CPU | PERF_SAMPLE_PERIOD | \ 70 PERF_SAMPLE_IDENTIFIER) 71 72 struct sample_event { 73 struct perf_event_header header; 74 u64 array[]; 75 }; 76 77 struct regs_dump { 78 u64 abi; 79 u64 *regs; 80 }; 81 82 struct stack_dump { 83 u16 offset; 84 u64 size; 85 char *data; 86 }; 87 88 struct sample_read_value { 89 u64 value; 90 u64 id; 91 }; 92 93 struct sample_read { 94 u64 time_enabled; 95 u64 time_running; 96 union { 97 struct { 98 u64 nr; 99 struct sample_read_value *values; 100 } group; 101 struct sample_read_value one; 102 }; 103 }; 104 105 struct perf_sample { 106 u64 ip; 107 u32 pid, tid; 108 u64 time; 109 u64 addr; 110 u64 id; 111 u64 stream_id; 112 u64 period; 113 u64 weight; 114 u32 cpu; 115 u32 raw_size; 116 u64 data_src; 117 void *raw_data; 118 struct ip_callchain *callchain; 119 struct branch_stack *branch_stack; 120 struct regs_dump user_regs; 121 struct stack_dump user_stack; 122 struct sample_read read; 123 }; 124 125 #define PERF_MEM_DATA_SRC_NONE \ 126 (PERF_MEM_S(OP, NA) |\ 127 PERF_MEM_S(LVL, NA) |\ 128 PERF_MEM_S(SNOOP, NA) |\ 129 PERF_MEM_S(LOCK, NA) |\ 130 PERF_MEM_S(TLB, NA)) 131 132 struct build_id_event { 133 struct perf_event_header header; 134 pid_t pid; 135 u8 build_id[PERF_ALIGN(BUILD_ID_SIZE, sizeof(u64))]; 136 char filename[]; 137 }; 138 139 enum perf_user_event_type { /* above any possible kernel type */ 140 PERF_RECORD_USER_TYPE_START = 64, 141 PERF_RECORD_HEADER_ATTR = 64, 142 PERF_RECORD_HEADER_EVENT_TYPE = 65, /* depreceated */ 143 PERF_RECORD_HEADER_TRACING_DATA = 66, 144 PERF_RECORD_HEADER_BUILD_ID = 67, 145 PERF_RECORD_FINISHED_ROUND = 68, 146 PERF_RECORD_HEADER_MAX 147 }; 148 149 struct attr_event { 150 struct perf_event_header header; 151 struct perf_event_attr attr; 152 u64 id[]; 153 }; 154 155 #define MAX_EVENT_NAME 64 156 157 struct perf_trace_event_type { 158 u64 event_id; 159 char name[MAX_EVENT_NAME]; 160 }; 161 162 struct event_type_event { 163 struct perf_event_header header; 164 struct perf_trace_event_type event_type; 165 }; 166 167 struct tracing_data_event { 168 struct perf_event_header header; 169 u32 size; 170 }; 171 172 union perf_event { 173 struct perf_event_header header; 174 struct mmap_event mmap; 175 struct mmap2_event mmap2; 176 struct comm_event comm; 177 struct fork_event fork; 178 struct lost_event lost; 179 struct read_event read; 180 struct sample_event sample; 181 struct attr_event attr; 182 struct event_type_event event_type; 183 struct tracing_data_event tracing_data; 184 struct build_id_event build_id; 185 }; 186 187 void perf_event__print_totals(void); 188 189 struct perf_tool; 190 struct thread_map; 191 192 typedef int (*perf_event__handler_t)(struct perf_tool *tool, 193 union perf_event *event, 194 struct perf_sample *sample, 195 struct machine *machine); 196 197 int perf_event__synthesize_thread_map(struct perf_tool *tool, 198 struct thread_map *threads, 199 perf_event__handler_t process, 200 struct machine *machine); 201 int perf_event__synthesize_threads(struct perf_tool *tool, 202 perf_event__handler_t process, 203 struct machine *machine); 204 int perf_event__synthesize_kernel_mmap(struct perf_tool *tool, 205 perf_event__handler_t process, 206 struct machine *machine, 207 const char *symbol_name); 208 209 int perf_event__synthesize_modules(struct perf_tool *tool, 210 perf_event__handler_t process, 211 struct machine *machine); 212 213 int perf_event__process_comm(struct perf_tool *tool, 214 union perf_event *event, 215 struct perf_sample *sample, 216 struct machine *machine); 217 int perf_event__process_lost(struct perf_tool *tool, 218 union perf_event *event, 219 struct perf_sample *sample, 220 struct machine *machine); 221 int perf_event__process_mmap(struct perf_tool *tool, 222 union perf_event *event, 223 struct perf_sample *sample, 224 struct machine *machine); 225 int perf_event__process_mmap2(struct perf_tool *tool, 226 union perf_event *event, 227 struct perf_sample *sample, 228 struct machine *machine); 229 int perf_event__process_fork(struct perf_tool *tool, 230 union perf_event *event, 231 struct perf_sample *sample, 232 struct machine *machine); 233 int perf_event__process_exit(struct perf_tool *tool, 234 union perf_event *event, 235 struct perf_sample *sample, 236 struct machine *machine); 237 int perf_event__process(struct perf_tool *tool, 238 union perf_event *event, 239 struct perf_sample *sample, 240 struct machine *machine); 241 242 struct addr_location; 243 int perf_event__preprocess_sample(const union perf_event *self, 244 struct machine *machine, 245 struct addr_location *al, 246 struct perf_sample *sample); 247 248 const char *perf_event__name(unsigned int id); 249 250 size_t perf_event__sample_event_size(const struct perf_sample *sample, u64 type, 251 u64 sample_regs_user, u64 read_format); 252 int perf_event__synthesize_sample(union perf_event *event, u64 type, 253 u64 sample_regs_user, u64 read_format, 254 const struct perf_sample *sample, 255 bool swapped); 256 257 size_t perf_event__fprintf_comm(union perf_event *event, FILE *fp); 258 size_t perf_event__fprintf_mmap(union perf_event *event, FILE *fp); 259 size_t perf_event__fprintf_mmap2(union perf_event *event, FILE *fp); 260 size_t perf_event__fprintf_task(union perf_event *event, FILE *fp); 261 size_t perf_event__fprintf(union perf_event *event, FILE *fp); 262 263 #endif /* __PERF_RECORD_H */ 264