aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Rostedt <srostedt@redhat.com>2009-07-17 20:09:42 -0400
committerSteven Rostedt <srostedt@redhat.com>2009-07-17 20:09:42 -0400
commita2f4f2ba59bc76f1700f5583017bff342a722223 (patch)
treec8eacfce09f6b12a408d33ab699374279207d47f
parentd52dd1f4601dc2c1de730b52c3e00267740b79c5 (diff)
parse header_page from tracing/events directory
Parse out the header_page from the tracing/events directory to get the page header offsets and sizes. We can also use the "commit" field to get the long size of the kernel, incase the kernel and the userspace have different word sizes. Signed-off-by: Steven Rostedt <srostedt@redhat.com>
-rw-r--r--parse-events.c65
-rw-r--r--parse-events.h9
-rw-r--r--trace-read.c12
3 files changed, 85 insertions, 1 deletions
diff --git a/parse-events.c b/parse-events.c
index 81957cf..c5cf3b4 100644
--- a/parse-events.c
+++ b/parse-events.c
@@ -29,6 +29,13 @@
29 29
30#include "parse-events.h" 30#include "parse-events.h"
31 31
32int header_page_ts_offset;
33int header_page_ts_size;
34int header_page_size_offset;
35int header_page_size_size;
36int header_page_data_offset;
37int header_page_data_size;
38
32static char *input_buf; 39static char *input_buf;
33static unsigned long long input_buf_ptr; 40static unsigned long long input_buf_ptr;
34static unsigned long long input_buf_siz; 41static unsigned long long input_buf_siz;
@@ -2413,6 +2420,64 @@ void print_args(struct print_arg *args)
2413 } 2420 }
2414} 2421}
2415 2422
2423static void parse_header_field(char *type,
2424 int *offset, int *size)
2425{
2426 char *token;
2427
2428 if (read_expected(EVENT_ITEM, "field") < 0)
2429 return;
2430 if (read_expected(EVENT_OP, ":") < 0)
2431 return;
2432
2433 /* type */
2434 if (read_expect_type(EVENT_ITEM, &token) < 0)
2435 return;
2436 free_token(token);
2437
2438 if (read_expected(EVENT_ITEM, type) < 0)
2439 return;
2440 if (read_expected(EVENT_OP, ";") < 0)
2441 return;
2442 if (read_expected(EVENT_ITEM, "offset") < 0)
2443 return;
2444 if (read_expected(EVENT_OP, ":") < 0)
2445 return;
2446 if (read_expect_type(EVENT_ITEM, &token) < 0)
2447 return;
2448 *offset = atoi(token);
2449 free_token(token);
2450 if (read_expected(EVENT_OP, ";") < 0)
2451 return;
2452 if (read_expected(EVENT_ITEM, "size") < 0)
2453 return;
2454 if (read_expected(EVENT_OP, ":") < 0)
2455 return;
2456 if (read_expect_type(EVENT_ITEM, &token) < 0)
2457 return;
2458 *size = atoi(token);
2459 free_token(token);
2460 if (read_expected(EVENT_OP, ";") < 0)
2461 return;
2462 if (read_expect_type(EVENT_NEWLINE, &token) < 0)
2463 return;
2464 free_token(token);
2465}
2466
2467int parse_header_page(char *buf, unsigned long size)
2468{
2469 init_input_buf(buf, size);
2470
2471 parse_header_field("timestamp", &header_page_ts_offset,
2472 &header_page_ts_size);
2473 parse_header_field("commit", &header_page_size_offset,
2474 &header_page_size_size);
2475 parse_header_field("data", &header_page_data_offset,
2476 &header_page_data_size);
2477
2478 return 0;
2479}
2480
2416int parse_ftrace_file(char *buf, unsigned long size) 2481int parse_ftrace_file(char *buf, unsigned long size)
2417{ 2482{
2418 struct format_field *field; 2483 struct format_field *field;
diff --git a/parse-events.h b/parse-events.h
index c11139d..d41abd5 100644
--- a/parse-events.h
+++ b/parse-events.h
@@ -222,4 +222,13 @@ static inline unsigned long long __data2host8(unsigned long long data)
222#define data2host4(ptr) __data2host4(*(unsigned int *)ptr) 222#define data2host4(ptr) __data2host4(*(unsigned int *)ptr)
223#define data2host8(ptr) __data2host8(*(unsigned long long *)ptr) 223#define data2host8(ptr) __data2host8(*(unsigned long long *)ptr)
224 224
225extern int header_page_ts_offset;
226extern int header_page_ts_size;
227extern int header_page_size_offset;
228extern int header_page_size_size;
229extern int header_page_data_offset;
230extern int header_page_data_size;
231
232int parse_header_page(char *buf, unsigned long size);
233
225#endif /* _PARSE_EVENTS_H */ 234#endif /* _PARSE_EVENTS_H */
diff --git a/trace-read.c b/trace-read.c
index 91054b8..7b3824c 100644
--- a/trace-read.c
+++ b/trace-read.c
@@ -162,8 +162,15 @@ static void read_header_files(void)
162 size = read8(); 162 size = read8();
163 header_page = malloc_or_die(size); 163 header_page = malloc_or_die(size);
164 read_or_die(header_page, size); 164 read_or_die(header_page, size);
165 parse_header_page(header_page, size);
165 free(header_page); 166 free(header_page);
166 167
168 /*
169 * The size field in the page is of type long,
170 * use that instead, since it represents the kernel.
171 */
172 long_size = header_page_size_size;
173
167 read_or_die(buf, 13); 174 read_or_die(buf, 13);
168 if (memcmp(buf, "header_event", 13) != 0) 175 if (memcmp(buf, "header_event", 13) != 0)
169 die("did not read header event"); 176 die("did not read header event");
@@ -377,9 +384,11 @@ struct record *peak_data(int cpu)
377 384
378 if (!index) { 385 if (!index) {
379 /* FIXME: handle header page */ 386 /* FIXME: handle header page */
387 if (header_page_ts_size != 8)
388 die("expected a long long type for timestamp");
380 cpu_data[cpu].timestamp = data2host8(ptr); 389 cpu_data[cpu].timestamp = data2host8(ptr);
381 ptr += 8; 390 ptr += 8;
382 switch (long_size) { 391 switch (header_page_size_size) {
383 case 4: 392 case 4:
384 cpu_data[cpu].page_size = data2host4(ptr); 393 cpu_data[cpu].page_size = data2host4(ptr);
385 ptr += 4; 394 ptr += 4;
@@ -391,6 +400,7 @@ struct record *peak_data(int cpu)
391 default: 400 default:
392 die("bad long size"); 401 die("bad long size");
393 } 402 }
403 ptr = cpu_data[cpu].page + header_page_data_offset;
394 } 404 }
395 405
396read_again: 406read_again: