aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorJavi Merino <javi.merino@arm.com>2015-03-24 07:07:19 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2015-03-24 11:46:39 -0400
commitb839e1e846edb15cff322e262e8ce412d298232e (patch)
tree59830971a7b6e6ee2ea6432a8e63c30d5d666d1a /tools
parente1644aae4589274223c1ab9072ddbda98dd97f6a (diff)
tools lib traceevent: Add support for __print_array()
Since 6ea22486ba46 ("tracing: Add array printing helper") trace can generate traces with variable element size arrays. Add support to parse them. Signed-off-by: Javi Merino <javi.merino@arm.com> Acked-by: Namhyung Kim <namhyung@kernel.org> Acked-by: Steven Rostedt <rostedt@goodmis.org> Cc: Jiri Olsa <jolsa@redhat.com> Link: http://lkml.kernel.org/r/1427195239-15730-1-git-send-email-javi.merino@arm.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools')
-rw-r--r--tools/lib/traceevent/event-parse.c93
-rw-r--r--tools/lib/traceevent/event-parse.h8
-rw-r--r--tools/perf/util/scripting-engines/trace-event-perl.c5
-rw-r--r--tools/perf/util/scripting-engines/trace-event-python.c5
4 files changed, 111 insertions, 0 deletions
diff --git a/tools/lib/traceevent/event-parse.c b/tools/lib/traceevent/event-parse.c
index bc227225c7f4..b6d11eea8a57 100644
--- a/tools/lib/traceevent/event-parse.c
+++ b/tools/lib/traceevent/event-parse.c
@@ -766,6 +766,11 @@ static void free_arg(struct print_arg *arg)
766 free_arg(arg->hex.field); 766 free_arg(arg->hex.field);
767 free_arg(arg->hex.size); 767 free_arg(arg->hex.size);
768 break; 768 break;
769 case PRINT_INT_ARRAY:
770 free_arg(arg->int_array.field);
771 free_arg(arg->int_array.count);
772 free_arg(arg->int_array.el_size);
773 break;
769 case PRINT_TYPE: 774 case PRINT_TYPE:
770 free(arg->typecast.type); 775 free(arg->typecast.type);
771 free_arg(arg->typecast.item); 776 free_arg(arg->typecast.item);
@@ -2545,6 +2550,32 @@ out:
2545} 2550}
2546 2551
2547static enum event_type 2552static enum event_type
2553process_int_array(struct event_format *event, struct print_arg *arg, char **tok)
2554{
2555 memset(arg, 0, sizeof(*arg));
2556 arg->type = PRINT_INT_ARRAY;
2557
2558 if (alloc_and_process_delim(event, ",", &arg->int_array.field))
2559 goto out;
2560
2561 if (alloc_and_process_delim(event, ",", &arg->int_array.count))
2562 goto free_field;
2563
2564 if (alloc_and_process_delim(event, ")", &arg->int_array.el_size))
2565 goto free_size;
2566
2567 return read_token_item(tok);
2568
2569free_size:
2570 free_arg(arg->int_array.count);
2571free_field:
2572 free_arg(arg->int_array.field);
2573out:
2574 *tok = NULL;
2575 return EVENT_ERROR;
2576}
2577
2578static enum event_type
2548process_dynamic_array(struct event_format *event, struct print_arg *arg, char **tok) 2579process_dynamic_array(struct event_format *event, struct print_arg *arg, char **tok)
2549{ 2580{
2550 struct format_field *field; 2581 struct format_field *field;
@@ -2839,6 +2870,10 @@ process_function(struct event_format *event, struct print_arg *arg,
2839 free_token(token); 2870 free_token(token);
2840 return process_hex(event, arg, tok); 2871 return process_hex(event, arg, tok);
2841 } 2872 }
2873 if (strcmp(token, "__print_array") == 0) {
2874 free_token(token);
2875 return process_int_array(event, arg, tok);
2876 }
2842 if (strcmp(token, "__get_str") == 0) { 2877 if (strcmp(token, "__get_str") == 0) {
2843 free_token(token); 2878 free_token(token);
2844 return process_str(event, arg, tok); 2879 return process_str(event, arg, tok);
@@ -3367,6 +3402,7 @@ eval_num_arg(void *data, int size, struct event_format *event, struct print_arg
3367 break; 3402 break;
3368 case PRINT_FLAGS: 3403 case PRINT_FLAGS:
3369 case PRINT_SYMBOL: 3404 case PRINT_SYMBOL:
3405 case PRINT_INT_ARRAY:
3370 case PRINT_HEX: 3406 case PRINT_HEX:
3371 break; 3407 break;
3372 case PRINT_TYPE: 3408 case PRINT_TYPE:
@@ -3777,6 +3813,54 @@ static void print_str_arg(struct trace_seq *s, void *data, int size,
3777 } 3813 }
3778 break; 3814 break;
3779 3815
3816 case PRINT_INT_ARRAY: {
3817 void *num;
3818 int el_size;
3819
3820 if (arg->int_array.field->type == PRINT_DYNAMIC_ARRAY) {
3821 unsigned long offset;
3822 struct format_field *field =
3823 arg->int_array.field->dynarray.field;
3824 offset = pevent_read_number(pevent,
3825 data + field->offset,
3826 field->size);
3827 num = data + (offset & 0xffff);
3828 } else {
3829 field = arg->int_array.field->field.field;
3830 if (!field) {
3831 str = arg->int_array.field->field.name;
3832 field = pevent_find_any_field(event, str);
3833 if (!field)
3834 goto out_warning_field;
3835 arg->int_array.field->field.field = field;
3836 }
3837 num = data + field->offset;
3838 }
3839 len = eval_num_arg(data, size, event, arg->int_array.count);
3840 el_size = eval_num_arg(data, size, event,
3841 arg->int_array.el_size);
3842 for (i = 0; i < len; i++) {
3843 if (i)
3844 trace_seq_putc(s, ' ');
3845
3846 if (el_size == 1) {
3847 trace_seq_printf(s, "%u", *(uint8_t *)num);
3848 } else if (el_size == 2) {
3849 trace_seq_printf(s, "%u", *(uint16_t *)num);
3850 } else if (el_size == 4) {
3851 trace_seq_printf(s, "%u", *(uint32_t *)num);
3852 } else if (el_size == 8) {
3853 trace_seq_printf(s, "%lu", *(uint64_t *)num);
3854 } else {
3855 trace_seq_printf(s, "BAD SIZE:%d 0x%x",
3856 el_size, *(uint8_t *)num);
3857 el_size = 1;
3858 }
3859
3860 num += el_size;
3861 }
3862 break;
3863 }
3780 case PRINT_TYPE: 3864 case PRINT_TYPE:
3781 break; 3865 break;
3782 case PRINT_STRING: { 3866 case PRINT_STRING: {
@@ -5361,6 +5445,15 @@ static void print_args(struct print_arg *args)
5361 print_args(args->hex.size); 5445 print_args(args->hex.size);
5362 printf(")"); 5446 printf(")");
5363 break; 5447 break;
5448 case PRINT_INT_ARRAY:
5449 printf("__print_array(");
5450 print_args(args->int_array.field);
5451 printf(", ");
5452 print_args(args->int_array.count);
5453 printf(", ");
5454 print_args(args->int_array.el_size);
5455 printf(")");
5456 break;
5364 case PRINT_STRING: 5457 case PRINT_STRING:
5365 case PRINT_BSTRING: 5458 case PRINT_BSTRING:
5366 printf("__get_str(%s)", args->string.string); 5459 printf("__get_str(%s)", args->string.string);
diff --git a/tools/lib/traceevent/event-parse.h b/tools/lib/traceevent/event-parse.h
index 8ca1b8ee50da..86a5839fb048 100644
--- a/tools/lib/traceevent/event-parse.h
+++ b/tools/lib/traceevent/event-parse.h
@@ -251,6 +251,12 @@ struct print_arg_hex {
251 struct print_arg *size; 251 struct print_arg *size;
252}; 252};
253 253
254struct print_arg_int_array {
255 struct print_arg *field;
256 struct print_arg *count;
257 struct print_arg *el_size;
258};
259
254struct print_arg_dynarray { 260struct print_arg_dynarray {
255 struct format_field *field; 261 struct format_field *field;
256 struct print_arg *index; 262 struct print_arg *index;
@@ -279,6 +285,7 @@ enum print_arg_type {
279 PRINT_FLAGS, 285 PRINT_FLAGS,
280 PRINT_SYMBOL, 286 PRINT_SYMBOL,
281 PRINT_HEX, 287 PRINT_HEX,
288 PRINT_INT_ARRAY,
282 PRINT_TYPE, 289 PRINT_TYPE,
283 PRINT_STRING, 290 PRINT_STRING,
284 PRINT_BSTRING, 291 PRINT_BSTRING,
@@ -298,6 +305,7 @@ struct print_arg {
298 struct print_arg_flags flags; 305 struct print_arg_flags flags;
299 struct print_arg_symbol symbol; 306 struct print_arg_symbol symbol;
300 struct print_arg_hex hex; 307 struct print_arg_hex hex;
308 struct print_arg_int_array int_array;
301 struct print_arg_func func; 309 struct print_arg_func func;
302 struct print_arg_string string; 310 struct print_arg_string string;
303 struct print_arg_bitmask bitmask; 311 struct print_arg_bitmask bitmask;
diff --git a/tools/perf/util/scripting-engines/trace-event-perl.c b/tools/perf/util/scripting-engines/trace-event-perl.c
index 22ebc46226e7..8171fed4136e 100644
--- a/tools/perf/util/scripting-engines/trace-event-perl.c
+++ b/tools/perf/util/scripting-engines/trace-event-perl.c
@@ -214,6 +214,11 @@ static void define_event_symbols(struct event_format *event,
214 define_event_symbols(event, ev_name, args->hex.field); 214 define_event_symbols(event, ev_name, args->hex.field);
215 define_event_symbols(event, ev_name, args->hex.size); 215 define_event_symbols(event, ev_name, args->hex.size);
216 break; 216 break;
217 case PRINT_INT_ARRAY:
218 define_event_symbols(event, ev_name, args->int_array.field);
219 define_event_symbols(event, ev_name, args->int_array.count);
220 define_event_symbols(event, ev_name, args->int_array.el_size);
221 break;
217 case PRINT_BSTRING: 222 case PRINT_BSTRING:
218 case PRINT_DYNAMIC_ARRAY: 223 case PRINT_DYNAMIC_ARRAY:
219 case PRINT_STRING: 224 case PRINT_STRING:
diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c
index 0c815a40a6e8..2ec5dfb5a456 100644
--- a/tools/perf/util/scripting-engines/trace-event-python.c
+++ b/tools/perf/util/scripting-engines/trace-event-python.c
@@ -231,6 +231,11 @@ static void define_event_symbols(struct event_format *event,
231 define_event_symbols(event, ev_name, args->hex.field); 231 define_event_symbols(event, ev_name, args->hex.field);
232 define_event_symbols(event, ev_name, args->hex.size); 232 define_event_symbols(event, ev_name, args->hex.size);
233 break; 233 break;
234 case PRINT_INT_ARRAY:
235 define_event_symbols(event, ev_name, args->int_array.field);
236 define_event_symbols(event, ev_name, args->int_array.count);
237 define_event_symbols(event, ev_name, args->int_array.el_size);
238 break;
234 case PRINT_STRING: 239 case PRINT_STRING:
235 break; 240 break;
236 case PRINT_TYPE: 241 case PRINT_TYPE: