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