diff options
Diffstat (limited to 'tools/perf/util/trace-event-read.c')
-rw-r--r-- | tools/perf/util/trace-event-read.c | 52 |
1 files changed, 31 insertions, 21 deletions
diff --git a/tools/perf/util/trace-event-read.c b/tools/perf/util/trace-event-read.c index af215c0d2379..f2112270c663 100644 --- a/tools/perf/util/trace-event-read.c +++ b/tools/perf/util/trace-event-read.c | |||
@@ -39,10 +39,6 @@ | |||
39 | 39 | ||
40 | static int input_fd; | 40 | static int input_fd; |
41 | 41 | ||
42 | int file_bigendian; | ||
43 | int host_bigendian; | ||
44 | static int long_size; | ||
45 | |||
46 | static ssize_t trace_data_size; | 42 | static ssize_t trace_data_size; |
47 | static bool repipe; | 43 | static bool repipe; |
48 | 44 | ||
@@ -216,7 +212,7 @@ static int read_ftrace_printk(struct pevent *pevent) | |||
216 | static int read_header_files(struct pevent *pevent) | 212 | static int read_header_files(struct pevent *pevent) |
217 | { | 213 | { |
218 | unsigned long long size; | 214 | unsigned long long size; |
219 | char *header_event; | 215 | char *header_page; |
220 | char buf[BUFSIZ]; | 216 | char buf[BUFSIZ]; |
221 | int ret = 0; | 217 | int ret = 0; |
222 | 218 | ||
@@ -229,13 +225,26 @@ static int read_header_files(struct pevent *pevent) | |||
229 | } | 225 | } |
230 | 226 | ||
231 | size = read8(pevent); | 227 | size = read8(pevent); |
232 | skip(size); | ||
233 | 228 | ||
234 | /* | 229 | header_page = malloc(size); |
235 | * The size field in the page is of type long, | 230 | if (header_page == NULL) |
236 | * use that instead, since it represents the kernel. | 231 | return -1; |
237 | */ | 232 | |
238 | long_size = header_page_size_size; | 233 | if (do_read(header_page, size) < 0) { |
234 | pr_debug("did not read header page"); | ||
235 | free(header_page); | ||
236 | return -1; | ||
237 | } | ||
238 | |||
239 | if (!pevent_parse_header_page(pevent, header_page, size, | ||
240 | pevent_get_long_size(pevent))) { | ||
241 | /* | ||
242 | * The commit field in the page is of type long, | ||
243 | * use that instead, since it represents the kernel. | ||
244 | */ | ||
245 | pevent_set_long_size(pevent, pevent->header_page_size_size); | ||
246 | } | ||
247 | free(header_page); | ||
239 | 248 | ||
240 | if (do_read(buf, 13) < 0) | 249 | if (do_read(buf, 13) < 0) |
241 | return -1; | 250 | return -1; |
@@ -246,14 +255,8 @@ static int read_header_files(struct pevent *pevent) | |||
246 | } | 255 | } |
247 | 256 | ||
248 | size = read8(pevent); | 257 | size = read8(pevent); |
249 | header_event = malloc(size); | 258 | skip(size); |
250 | if (header_event == NULL) | ||
251 | return -1; | ||
252 | |||
253 | if (do_read(header_event, size) < 0) | ||
254 | ret = -1; | ||
255 | 259 | ||
256 | free(header_event); | ||
257 | return ret; | 260 | return ret; |
258 | } | 261 | } |
259 | 262 | ||
@@ -349,6 +352,10 @@ ssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe) | |||
349 | int show_funcs = 0; | 352 | int show_funcs = 0; |
350 | int show_printk = 0; | 353 | int show_printk = 0; |
351 | ssize_t size = -1; | 354 | ssize_t size = -1; |
355 | int file_bigendian; | ||
356 | int host_bigendian; | ||
357 | int file_long_size; | ||
358 | int file_page_size; | ||
352 | struct pevent *pevent; | 359 | struct pevent *pevent; |
353 | int err; | 360 | int err; |
354 | 361 | ||
@@ -391,12 +398,15 @@ ssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe) | |||
391 | 398 | ||
392 | if (do_read(buf, 1) < 0) | 399 | if (do_read(buf, 1) < 0) |
393 | goto out; | 400 | goto out; |
394 | long_size = buf[0]; | 401 | file_long_size = buf[0]; |
395 | 402 | ||
396 | page_size = read4(pevent); | 403 | file_page_size = read4(pevent); |
397 | if (!page_size) | 404 | if (!file_page_size) |
398 | goto out; | 405 | goto out; |
399 | 406 | ||
407 | pevent_set_long_size(pevent, file_long_size); | ||
408 | pevent_set_page_size(pevent, file_page_size); | ||
409 | |||
400 | err = read_header_files(pevent); | 410 | err = read_header_files(pevent); |
401 | if (err) | 411 | if (err) |
402 | goto out; | 412 | goto out; |