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 perf_sample { 73 u64 ip; 74 u32 pid, tid; 75 u64 time; 76 u64 addr; 77 u64 id; 78 u64 stream_id; 79 u64 period; 80 u32 cpu; 81 u32 raw_size; 82 void *raw_data; 83 struct ip_callchain *callchain; 84 struct branch_stack *branch_stack; 85 }; 86 87 #define BUILD_ID_SIZE 20 88 89 struct build_id_event { 90 struct perf_event_header header; 91 pid_t pid; 92 u8 build_id[ALIGN(BUILD_ID_SIZE, sizeof(u64))]; 93 char filename[]; 94 }; 95 96 enum perf_user_event_type { /* above any possible kernel type */ 97 PERF_RECORD_USER_TYPE_START = 64, 98 PERF_RECORD_HEADER_ATTR = 64, 99 PERF_RECORD_HEADER_EVENT_TYPE = 65, 100 PERF_RECORD_HEADER_TRACING_DATA = 66, 101 PERF_RECORD_HEADER_BUILD_ID = 67, 102 PERF_RECORD_FINISHED_ROUND = 68, 103 PERF_RECORD_HEADER_MAX 104 }; 105 106 struct attr_event { 107 struct perf_event_header header; 108 struct perf_event_attr attr; 109 u64 id[]; 110 }; 111 112 #define MAX_EVENT_NAME 64 113 114 struct perf_trace_event_type { 115 u64 event_id; 116 char name[MAX_EVENT_NAME]; 117 }; 118 119 struct event_type_event { 120 struct perf_event_header header; 121 struct perf_trace_event_type event_type; 122 }; 123 124 struct tracing_data_event { 125 struct perf_event_header header; 126 u32 size; 127 }; 128 129 union perf_event { 130 struct perf_event_header header; 131 struct ip_event ip; 132 struct mmap_event mmap; 133 struct comm_event comm; 134 struct fork_event fork; 135 struct lost_event lost; 136 struct read_event read; 137 struct sample_event sample; 138 struct attr_event attr; 139 struct event_type_event event_type; 140 struct tracing_data_event tracing_data; 141 struct build_id_event build_id; 142 }; 143 144 void perf_event__print_totals(void); 145 146 struct perf_tool; 147 struct thread_map; 148 149 typedef int (*perf_event__handler_t)(struct perf_tool *tool, 150 union perf_event *event, 151 struct perf_sample *sample, 152 struct machine *machine); 153 154 int perf_event__synthesize_thread_map(struct perf_tool *tool, 155 struct thread_map *threads, 156 perf_event__handler_t process, 157 struct machine *machine); 158 int perf_event__synthesize_threads(struct perf_tool *tool, 159 perf_event__handler_t process, 160 struct machine *machine); 161 int perf_event__synthesize_kernel_mmap(struct perf_tool *tool, 162 perf_event__handler_t process, 163 struct machine *machine, 164 const char *symbol_name); 165 166 int perf_event__synthesize_modules(struct perf_tool *tool, 167 perf_event__handler_t process, 168 struct machine *machine); 169 170 int perf_event__process_comm(struct perf_tool *tool, 171 union perf_event *event, 172 struct perf_sample *sample, 173 struct machine *machine); 174 int perf_event__process_lost(struct perf_tool *tool, 175 union perf_event *event, 176 struct perf_sample *sample, 177 struct machine *machine); 178 int perf_event__process_mmap(struct perf_tool *tool, 179 union perf_event *event, 180 struct perf_sample *sample, 181 struct machine *machine); 182 int perf_event__process_task(struct perf_tool *tool, 183 union perf_event *event, 184 struct perf_sample *sample, 185 struct machine *machine); 186 int perf_event__process(struct perf_tool *tool, 187 union perf_event *event, 188 struct perf_sample *sample, 189 struct machine *machine); 190 191 struct addr_location; 192 int perf_event__preprocess_sample(const union perf_event *self, 193 struct machine *machine, 194 struct addr_location *al, 195 struct perf_sample *sample, 196 symbol_filter_t filter); 197 198 const char *perf_event__name(unsigned int id); 199 200 int perf_event__parse_sample(const union perf_event *event, u64 type, 201 int sample_size, bool sample_id_all, 202 struct perf_sample *sample, bool swapped); 203 int perf_event__synthesize_sample(union perf_event *event, u64 type, 204 const struct perf_sample *sample, 205 bool swapped); 206 207 size_t perf_event__fprintf_comm(union perf_event *event, FILE *fp); 208 size_t perf_event__fprintf_mmap(union perf_event *event, FILE *fp); 209 size_t perf_event__fprintf_task(union perf_event *event, FILE *fp); 210 size_t perf_event__fprintf(union perf_event *event, FILE *fp); 211 212 #endif /* __PERF_RECORD_H */ 213