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