perf tools: Fix bprintk reading in trace output
authorSteven Rostedt <srostedt@redhat.com>
Wed, 14 Oct 2009 19:43:40 +0000 (15:43 -0400)
committerIngo Molnar <mingo@elte.hu>
Thu, 15 Oct 2009 08:42:38 +0000 (10:42 +0200)
The bprintk parsing was broken in more ways than one.

The file parsing was incorrect, and the words used by the
arguments are always 4 bytes aligned, even on 64-bit machines.

Signed-off-by: Steven Rostedt <srostedt@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
LKML-Reference: <20091014194359.520931637@goodmis.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
tools/perf/util/trace-event-parse.c

index eda0a2488c1934e5b877fcec7e5e16cdeeb0e795..93a82fead95806228fd131699e4704c8fa09f796 100644 (file)
@@ -284,18 +284,16 @@ void parse_ftrace_printk(char *file, unsigned int size __unused)
        char *line;
        char *next = NULL;
        char *addr_str;
-       int ret;
+       char *fmt;
        int i;
 
        line = strtok_r(file, "\n", &next);
        while (line) {
                item = malloc_or_die(sizeof(*item));
-               ret = sscanf(line, "%as : %as",
-                            (float *)(void *)&addr_str, /* workaround gcc warning */
-                            (float *)(void *)&item->printk);
+               addr_str = strtok_r(line, ":", &fmt);
                item->addr = strtoull(addr_str, NULL, 16);
-               free(addr_str);
-
+               /* fmt still has a space, skip it */
+               item->printk = strdup(fmt+1);
                item->next = list;
                list = item;
                line = strtok_r(NULL, "\n", &next);
@@ -2274,8 +2272,9 @@ static struct print_arg *make_bprint_args(char *fmt, void *data, int size, struc
                        case 'u':
                        case 'x':
                        case 'i':
-                               bptr = (void *)(((unsigned long)bptr + (long_size - 1)) &
-                                               ~(long_size - 1));
+                               /* the pointers are always 4 bytes aligned */
+                               bptr = (void *)(((unsigned long)bptr + 3) &
+                                               ~3);
                                switch (ls) {
                                case 0:
                                case 1: