diff options
Diffstat (limited to 'tools/perf/util/trace-event-parse.c')
| -rw-r--r-- | tools/perf/util/trace-event-parse.c | 54 |
1 files changed, 28 insertions, 26 deletions
diff --git a/tools/perf/util/trace-event-parse.c b/tools/perf/util/trace-event-parse.c index 0715c843c2e7..3aabcd687cd5 100644 --- a/tools/perf/util/trace-event-parse.c +++ b/tools/perf/util/trace-event-parse.c | |||
| @@ -162,25 +162,16 @@ int trace_parse_common_pid(struct pevent *pevent, void *data) | |||
| 162 | return pevent_data_pid(pevent, &record); | 162 | return pevent_data_pid(pevent, &record); |
| 163 | } | 163 | } |
| 164 | 164 | ||
| 165 | unsigned long long read_size(struct pevent *pevent, void *ptr, int size) | 165 | unsigned long long read_size(struct event_format *event, void *ptr, int size) |
| 166 | { | 166 | { |
| 167 | return pevent_read_number(pevent, ptr, size); | 167 | return pevent_read_number(event->pevent, ptr, size); |
| 168 | } | 168 | } |
| 169 | 169 | ||
| 170 | void print_trace_event(struct pevent *pevent, int cpu, void *data, int size) | 170 | void event_format__print(struct event_format *event, |
| 171 | int cpu, void *data, int size) | ||
| 171 | { | 172 | { |
| 172 | struct event_format *event; | ||
| 173 | struct pevent_record record; | 173 | struct pevent_record record; |
| 174 | struct trace_seq s; | 174 | struct trace_seq s; |
| 175 | int type; | ||
| 176 | |||
| 177 | type = trace_parse_common_type(pevent, data); | ||
| 178 | |||
| 179 | event = pevent_find_event(pevent, type); | ||
| 180 | if (!event) { | ||
| 181 | warning("ug! no event found for type %d", type); | ||
| 182 | return; | ||
| 183 | } | ||
| 184 | 175 | ||
| 185 | memset(&record, 0, sizeof(record)); | 176 | memset(&record, 0, sizeof(record)); |
| 186 | record.cpu = cpu; | 177 | record.cpu = cpu; |
| @@ -192,6 +183,19 @@ void print_trace_event(struct pevent *pevent, int cpu, void *data, int size) | |||
| 192 | trace_seq_do_printf(&s); | 183 | trace_seq_do_printf(&s); |
| 193 | } | 184 | } |
| 194 | 185 | ||
| 186 | void print_trace_event(struct pevent *pevent, int cpu, void *data, int size) | ||
| 187 | { | ||
| 188 | int type = trace_parse_common_type(pevent, data); | ||
| 189 | struct event_format *event = pevent_find_event(pevent, type); | ||
| 190 | |||
| 191 | if (!event) { | ||
| 192 | warning("ug! no event found for type %d", type); | ||
| 193 | return; | ||
| 194 | } | ||
| 195 | |||
| 196 | event_format__print(event, cpu, data, size); | ||
| 197 | } | ||
| 198 | |||
| 195 | void print_event(struct pevent *pevent, int cpu, void *data, int size, | 199 | void print_event(struct pevent *pevent, int cpu, void *data, int size, |
| 196 | unsigned long long nsecs, char *comm) | 200 | unsigned long long nsecs, char *comm) |
| 197 | { | 201 | { |
| @@ -217,7 +221,7 @@ void print_event(struct pevent *pevent, int cpu, void *data, int size, | |||
| 217 | } | 221 | } |
| 218 | 222 | ||
| 219 | void parse_proc_kallsyms(struct pevent *pevent, | 223 | void parse_proc_kallsyms(struct pevent *pevent, |
| 220 | char *file, unsigned int size __unused) | 224 | char *file, unsigned int size __maybe_unused) |
| 221 | { | 225 | { |
| 222 | unsigned long long addr; | 226 | unsigned long long addr; |
| 223 | char *func; | 227 | char *func; |
| @@ -225,31 +229,29 @@ void parse_proc_kallsyms(struct pevent *pevent, | |||
| 225 | char *next = NULL; | 229 | char *next = NULL; |
| 226 | char *addr_str; | 230 | char *addr_str; |
| 227 | char *mod; | 231 | char *mod; |
| 228 | char ch; | 232 | char *fmt; |
| 229 | 233 | ||
| 230 | line = strtok_r(file, "\n", &next); | 234 | line = strtok_r(file, "\n", &next); |
| 231 | while (line) { | 235 | while (line) { |
| 232 | mod = NULL; | 236 | mod = NULL; |
| 233 | sscanf(line, "%as %c %as\t[%as", | 237 | addr_str = strtok_r(line, " ", &fmt); |
| 234 | (float *)(void *)&addr_str, /* workaround gcc warning */ | ||
| 235 | &ch, (float *)(void *)&func, (float *)(void *)&mod); | ||
| 236 | addr = strtoull(addr_str, NULL, 16); | 238 | addr = strtoull(addr_str, NULL, 16); |
| 237 | free(addr_str); | 239 | /* skip character */ |
| 238 | 240 | strtok_r(NULL, " ", &fmt); | |
| 239 | /* truncate the extra ']' */ | 241 | func = strtok_r(NULL, "\t", &fmt); |
| 242 | mod = strtok_r(NULL, "]", &fmt); | ||
| 243 | /* truncate the extra '[' */ | ||
| 240 | if (mod) | 244 | if (mod) |
| 241 | mod[strlen(mod) - 1] = 0; | 245 | mod = mod + 1; |
| 242 | 246 | ||
| 243 | pevent_register_function(pevent, func, addr, mod); | 247 | pevent_register_function(pevent, func, addr, mod); |
| 244 | free(func); | ||
| 245 | free(mod); | ||
| 246 | 248 | ||
| 247 | line = strtok_r(NULL, "\n", &next); | 249 | line = strtok_r(NULL, "\n", &next); |
| 248 | } | 250 | } |
| 249 | } | 251 | } |
| 250 | 252 | ||
| 251 | void parse_ftrace_printk(struct pevent *pevent, | 253 | void parse_ftrace_printk(struct pevent *pevent, |
| 252 | char *file, unsigned int size __unused) | 254 | char *file, unsigned int size __maybe_unused) |
| 253 | { | 255 | { |
| 254 | unsigned long long addr; | 256 | unsigned long long addr; |
| 255 | char *printk; | 257 | char *printk; |
| @@ -289,7 +291,7 @@ struct event_format *trace_find_next_event(struct pevent *pevent, | |||
| 289 | { | 291 | { |
| 290 | static int idx; | 292 | static int idx; |
| 291 | 293 | ||
| 292 | if (!pevent->events) | 294 | if (!pevent || !pevent->events) |
| 293 | return NULL; | 295 | return NULL; |
| 294 | 296 | ||
| 295 | if (!event) { | 297 | if (!event) { |
