Merge branch 'perf-fixes-for-linus-2' of git://git.kernel.org/pub/scm/linux/kernel...
[linux-2.6.git] / tools / perf / util / trace-event-parse.c
index b53b27f..55b41b9 100644 (file)
@@ -29,6 +29,7 @@
 #include <errno.h>
 
 #undef _GNU_SOURCE
+#include "../perf.h"
 #include "util.h"
 #include "trace-event.h"
 
@@ -89,7 +90,7 @@ void parse_cmdlines(char *file, int size __unused)
        while (line) {
                item = malloc_or_die(sizeof(*item));
                sscanf(line, "%d %as", &item->pid,
-                      (float *)&item->comm); /* workaround gcc warning */
+                      (float *)(void *)&item->comm); /* workaround gcc warning */
                item->next = list;
                list = item;
                line = strtok_r(NULL, "\n", &next);
@@ -151,10 +152,10 @@ void parse_proc_kallsyms(char *file, unsigned int size __unused)
                item = malloc_or_die(sizeof(*item));
                item->mod = NULL;
                ret = sscanf(line, "%as %c %as\t[%as",
-                            (float *)&addr_str, /* workaround gcc warning */
+                            (float *)(void *)&addr_str, /* workaround gcc warning */
                             &ch,
-                            (float *)&item->func,
-                            (float *)&item->mod);
+                            (float *)(void *)&item->func,
+                            (float *)(void *)&item->mod);
                item->addr = strtoull(addr_str, NULL, 16);
                free(addr_str);
 
@@ -290,8 +291,8 @@ void parse_ftrace_printk(char *file, unsigned int size __unused)
        while (line) {
                item = malloc_or_die(sizeof(*item));
                ret = sscanf(line, "%as : %as",
-                            (float *)&addr_str, /* workaround gcc warning */
-                            (float *)&item->printk);
+                            (float *)(void *)&addr_str, /* workaround gcc warning */
+                            (float *)(void *)&item->printk);
                item->addr = strtoull(addr_str, NULL, 16);
                free(addr_str);
 
@@ -1547,6 +1548,7 @@ process_str(struct event *event __unused, struct print_arg *arg, char **tok)
 
        arg->type = PRINT_STRING;
        arg->string.string = token;
+       arg->string.offset = -1;
 
        if (read_expected(EVENT_DELIM, (char *)")") < 0)
                return EVENT_ERROR;
@@ -1774,6 +1776,29 @@ static unsigned long long read_size(void *ptr, int size)
        }
 }
 
+unsigned long long
+raw_field_value(struct event *event, const char *name, void *data)
+{
+       struct format_field *field;
+
+       field = find_any_field(event, name);
+       if (!field)
+               return 0ULL;
+
+       return read_size(data + field->offset, field->size);
+}
+
+void *raw_field_ptr(struct event *event, const char *name, void *data)
+{
+       struct format_field *field;
+
+       field = find_any_field(event, name);
+       if (!field)
+               return NULL;
+
+       return data + field->offset;
+}
+
 static int get_common_info(const char *type, int *offset, int *size)
 {
        struct event *event;
@@ -1797,7 +1822,7 @@ static int get_common_info(const char *type, int *offset, int *size)
        return 0;
 }
 
-static int parse_common_type(void *data)
+int trace_parse_common_type(void *data)
 {
        static int type_offset;
        static int type_size;
@@ -1830,7 +1855,7 @@ static int parse_common_pid(void *data)
        return read_size(data + pid_offset, pid_size);
 }
 
-static struct event *find_event(int id)
+struct event *trace_find_event(int id)
 {
        struct event *event;
 
@@ -1943,10 +1968,11 @@ static const struct flag flags[] = {
        { "NET_TX_SOFTIRQ", 2 },
        { "NET_RX_SOFTIRQ", 3 },
        { "BLOCK_SOFTIRQ", 4 },
-       { "TASKLET_SOFTIRQ", 5 },
-       { "SCHED_SOFTIRQ", 6 },
-       { "HRTIMER_SOFTIRQ", 7 },
-       { "RCU_SOFTIRQ", 8 },
+       { "BLOCK_IOPOLL_SOFTIRQ", 5 },
+       { "TASKLET_SOFTIRQ", 6 },
+       { "SCHED_SOFTIRQ", 7 },
+       { "HRTIMER_SOFTIRQ", 8 },
+       { "RCU_SOFTIRQ", 9 },
 
        { "HRTIMER_NORESTART", 0 },
        { "HRTIMER_RESTART", 1 },
@@ -1996,6 +2022,7 @@ static void print_str_arg(void *data, int size,
                memcpy(str, data + arg->field.field->offset,
                       arg->field.field->size);
                str[arg->field.field->size] = 0;
+               printf("%s", str);
                free(str);
                break;
        case PRINT_FLAGS:
@@ -2029,9 +2056,20 @@ static void print_str_arg(void *data, int size,
 
        case PRINT_TYPE:
                break;
-       case PRINT_STRING:
-               printf("%s", arg->string.string);
+       case PRINT_STRING: {
+               int str_offset;
+
+               if (arg->string.offset == -1) {
+                       struct format_field *f;
+
+                       f = find_any_field(event, arg->string.string);
+                       arg->string.offset = f->offset;
+               }
+               str_offset = *(int *)(data + arg->string.offset);
+               str_offset &= 0xffff;
+               printf("%s", ((char *)data) + str_offset);
                break;
+       }
        case PRINT_OP:
                /*
                 * The only op for string should be ? :
@@ -2406,8 +2444,8 @@ get_return_for_leaf(int cpu, int cur_pid, unsigned long long cur_func,
        int type;
        int pid;
 
-       type = parse_common_type(next->data);
-       event = find_event(type);
+       type = trace_parse_common_type(next->data);
+       event = trace_find_event(type);
        if (!event)
                return NULL;
 
@@ -2488,8 +2526,8 @@ print_graph_entry_leaf(struct event *event, void *data, struct record *ret_rec)
        int type;
        int i;
 
-       type = parse_common_type(ret_rec->data);
-       ret_event = find_event(type);
+       type = trace_parse_common_type(ret_rec->data);
+       ret_event = trace_find_event(type);
 
        field = find_field(ret_event, "rettime");
        if (!field)
@@ -2682,11 +2720,13 @@ void print_event(int cpu, void *data, int size, unsigned long long nsecs,
        nsecs -= secs * NSECS_PER_SEC;
        usecs = nsecs / NSECS_PER_USEC;
 
-       type = parse_common_type(data);
+       type = trace_parse_common_type(data);
 
-       event = find_event(type);
-       if (!event)
-               die("ug! no event found for type %d", type);
+       event = trace_find_event(type);
+       if (!event) {
+               printf("ug! no event found for type %d\n", type);
+               return;
+       }
 
        pid = parse_common_pid(data);
 
@@ -2694,9 +2734,9 @@ void print_event(int cpu, void *data, int size, unsigned long long nsecs,
                return pretty_print_func_graph(data, size, event, cpu,
                                               pid, comm, secs, usecs);
 
-       printf("%16s-%-5d [%03d] %5lu.%06lu: %s: ",
+       printf("%16s-%-5d [%03d] %5lu.%09Lu: %s: ",
               comm, pid,  cpu,
-              secs, usecs, event->name);
+              secs, nsecs, event->name);
 
        pretty_print(data, size, event);
        printf("\n");