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 /* 12 * PERF_SAMPLE_IP | PERF_SAMPLE_TID | * 13 */ 14 struct ip_event { 15 struct perf_event_header header; 16 u64 ip; 17 u32 pid, tid; 18 unsigned char __more_data[]; 19 }; 20 21 struct mmap_event { 22 struct perf_event_header header; 23 u32 pid, tid; 24 u64 start; 25 u64 len; 26 u64 pgoff; 27 char filename[PATH_MAX]; 28 }; 29 30 struct comm_event { 31 struct perf_event_header header; 32 u32 pid, tid; 33 char comm[16]; 34 }; 35 36 struct fork_event { 37 struct perf_event_header header; 38 u32 pid, ppid; 39 u32 tid, ptid; 40 u64 time; 41 }; 42 43 struct lost_event { 44 struct perf_event_header header; 45 u64 id; 46 u64 lost; 47 }; 48 49 /* 50 * PERF_FORMAT_ENABLED | PERF_FORMAT_RUNNING | PERF_FORMAT_ID 51 */ 52 struct read_event { 53 struct perf_event_header header; 54 u32 pid, tid; 55 u64 value; 56 u64 time_enabled; 57 u64 time_running; 58 u64 id; 59 }; 60 61 62 #define PERF_SAMPLE_MASK \ 63 (PERF_SAMPLE_IP | PERF_SAMPLE_TID | \ 64 PERF_SAMPLE_TIME | PERF_SAMPLE_ADDR | \ 65 PERF_SAMPLE_ID | PERF_SAMPLE_STREAM_ID | \ 66 PERF_SAMPLE_CPU | PERF_SAMPLE_PERIOD) 67 68 struct sample_event { 69 struct perf_event_header header; 70 u64 array[]; 71 }; 72 73 struct regs_dump { 74 u64 *regs; 75 }; 76 77 struct stack_dump { 78 u16 offset; 79 u64 size; 80 char *data; 81 }; 82 83 struct perf_sample { 84 u64 ip; 85 u32 pid, tid; 86 u64 time; 87 u64 addr; 88 u64 id; 89 u64 stream_id; 90 u64 period; 91 u64 weight; 92 u32 cpu; 93 u32 raw_size; 94 u64 data_src; 95 void *raw_data; 96 struct ip_callchain *callchain; 97 struct branch_stack *branch_stack; 98 struct regs_dump user_regs; 99 struct stack_dump user_stack; 100 }; 101 102 #define PERF_MEM_DATA_SRC_NONE \ 103 (PERF_MEM_S(OP, NA) |\ 104 PERF_MEM_S(LVL, NA) |\ 105 PERF_MEM_S(SNOOP, NA) |\ 106 PERF_MEM_S(LOCK, NA) |\ 107 PERF_MEM_S(TLB, NA)) 108 109 struct build_id_event { 110 struct perf_event_header header; 111 pid_t pid; 112 u8 build_id[PERF_ALIGN(BUILD_ID_SIZE, sizeof(u64))]; 113 char filename[]; 114 }; 115 116 enum perf_user_event_type { /* above any possible kernel type */ 117 PERF_RECORD_USER_TYPE_START = 64, 118 PERF_RECORD_HEADER_ATTR = 64, 119 PERF_RECORD_HEADER_EVENT_TYPE = 65, 120 PERF_RECORD_HEADER_TRACING_DATA = 66, 121 PERF_RECORD_HEADER_BUILD_ID = 67, 122 PERF_RECORD_FINISHED_ROUND = 68, 123 PERF_RECORD_HEADER_MAX 124 }; 125 126 struct attr_event { 127 struct perf_event_header header; 128 struct perf_event_attr attr; 129 u64 id[]; 130 }; 131 132 #define MAX_EVENT_NAME 64 133 134 struct perf_trace_event_type { 135 u64 event_id; 136 char name[MAX_EVENT_NAME]; 137 }; 138 139 struct event_type_event { 140 struct perf_event_header header; 141 struct perf_trace_event_type event_type; 142 }; 143 144 struct tracing_data_event { 145 struct perf_event_header header; 146 u32 size; 147 }; 148 149 union perf_event { 150 struct perf_event_header header; 151 struct ip_event ip; 152 struct mmap_event mmap; 153 struct comm_event comm; 154 struct fork_event fork; 155 struct lost_event lost; 156 struct read_event read; 157 struct sample_event sample; 158 struct attr_event attr; 159 struct event_type_event event_type; 160 struct tracing_data_event tracing_data; 161 struct build_id_event build_id; 162 }; 163 164 void perf_event__print_totals(void); 165 166 struct perf_tool; 167 struct thread_map; 168 169 typedef int (*perf_event__handler_t)(struct perf_tool *tool, 170 union perf_event *event, 171 struct perf_sample *sample, 172 struct machine *machine); 173 174 int perf_event__synthesize_thread_map(struct perf_tool *tool, 175 struct thread_map *threads, 176 perf_event__handler_t process, 177 struct machine *machine); 178 int perf_event__synthesize_threads(struct perf_tool *tool, 179 perf_event__handler_t process, 180 struct machine *machine); 181 int perf_event__synthesize_kernel_mmap(struct perf_tool *tool, 182 perf_event__handler_t process, 183 struct machine *machine, 184 const char *symbol_name); 185 186 int perf_event__synthesize_modules(struct perf_tool *tool, 187 perf_event__handler_t process, 188 struct machine *machine); 189 190 int perf_event__process_comm(struct perf_tool *tool, 191 union perf_event *event, 192 struct perf_sample *sample, 193 struct machine *machine); 194 int perf_event__process_lost(struct perf_tool *tool, 195 union perf_event *event, 196 struct perf_sample *sample, 197 struct machine *machine); 198 int perf_event__process_mmap(struct perf_tool *tool, 199 union perf_event *event, 200 struct perf_sample *sample, 201 struct machine *machine); 202 int perf_event__process_fork(struct perf_tool *tool, 203 union perf_event *event, 204 struct perf_sample *sample, 205 struct machine *machine); 206 int perf_event__process_exit(struct perf_tool *tool, 207 union perf_event *event, 208 struct perf_sample *sample, 209 struct machine *machine); 210 int perf_event__process(struct perf_tool *tool, 211 union perf_event *event, 212 struct perf_sample *sample, 213 struct machine *machine); 214 215 struct addr_location; 216 int perf_event__preprocess_sample(const union perf_event *self, 217 struct machine *machine, 218 struct addr_location *al, 219 struct perf_sample *sample, 220 symbol_filter_t filter); 221 222 const char *perf_event__name(unsigned int id); 223 224 int perf_event__synthesize_sample(union perf_event *event, u64 type, 225 const struct perf_sample *sample, 226 bool swapped); 227 228 size_t perf_event__fprintf_comm(union perf_event *event, FILE *fp); 229 size_t perf_event__fprintf_mmap(union perf_event *event, FILE *fp); 230 size_t perf_event__fprintf_task(union perf_event *event, FILE *fp); 231 size_t perf_event__fprintf(union perf_event *event, FILE *fp); 232 233 #endif /* __PERF_RECORD_H */ 234