aboutsummaryrefslogtreecommitdiffstats
path: root/tools/lib/traceevent/event-parse.c
diff options
context:
space:
mode:
authorNamhyung Kim <namhyung@kernel.org>2015-12-23 08:08:41 -0500
committerArnaldo Carvalho de Melo <acme@redhat.com>2016-01-06 18:11:11 -0500
commitbe45d40efec96558c489579bbf93465e90b10abe (patch)
treed525ab0ff5cf272ccb90028d4ca98e8877986b06 /tools/lib/traceevent/event-parse.c
parent723928340c9d28d92dcaff8b8fbc9100a1cf9429 (diff)
tools lib traceevent: Factor out and export print_event_field[s]()
The print_event_field() and print_event_fields() functions print basic information of a given field or event without the print format. They'll be used by dynamic sort keys later. Committer note: Rename it to pevent_print_field[s]() to get proper namespacing, as discussed with Steven Rostedt. Signed-off-by: Namhyung Kim <namhyung@kernel.org> Acked-by: Jiri Olsa <jolsa@kernel.org> Acked-by: Steven Rostedt <rostedt@goodmis.org> Cc: Andi Kleen <andi@firstfloor.org> Cc: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Wang Nan <wangnan0@huawei.com> Link: http://lkml.kernel.org/r/1450876121-22494-1-git-send-email-namhyung@kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/lib/traceevent/event-parse.c')
-rw-r--r--tools/lib/traceevent/event-parse.c129
1 files changed, 68 insertions, 61 deletions
diff --git a/tools/lib/traceevent/event-parse.c b/tools/lib/traceevent/event-parse.c
index 68276f35e323..ea69ce35e902 100644
--- a/tools/lib/traceevent/event-parse.c
+++ b/tools/lib/traceevent/event-parse.c
@@ -4735,73 +4735,80 @@ static int is_printable_array(char *p, unsigned int len)
4735 return 1; 4735 return 1;
4736} 4736}
4737 4737
4738static void print_event_fields(struct trace_seq *s, void *data, 4738void pevent_print_field(struct trace_seq *s, void *data,
4739 int size __maybe_unused, 4739 struct format_field *field)
4740 struct event_format *event)
4741{ 4740{
4742 struct format_field *field;
4743 unsigned long long val; 4741 unsigned long long val;
4744 unsigned int offset, len, i; 4742 unsigned int offset, len, i;
4745 4743 struct pevent *pevent = field->event->pevent;
4746 field = event->format.fields; 4744
4747 while (field) { 4745 if (field->flags & FIELD_IS_ARRAY) {
4748 trace_seq_printf(s, " %s=", field->name); 4746 offset = field->offset;
4749 if (field->flags & FIELD_IS_ARRAY) { 4747 len = field->size;
4750 offset = field->offset; 4748 if (field->flags & FIELD_IS_DYNAMIC) {
4751 len = field->size; 4749 val = pevent_read_number(pevent, data + offset, len);
4752 if (field->flags & FIELD_IS_DYNAMIC) { 4750 offset = val;
4753 val = pevent_read_number(event->pevent, data + offset, len); 4751 len = offset >> 16;
4754 offset = val; 4752 offset &= 0xffff;
4755 len = offset >> 16; 4753 }
4756 offset &= 0xffff; 4754 if (field->flags & FIELD_IS_STRING &&
4757 } 4755 is_printable_array(data + offset, len)) {
4758 if (field->flags & FIELD_IS_STRING && 4756 trace_seq_printf(s, "%s", (char *)data + offset);
4759 is_printable_array(data + offset, len)) {
4760 trace_seq_printf(s, "%s", (char *)data + offset);
4761 } else {
4762 trace_seq_puts(s, "ARRAY[");
4763 for (i = 0; i < len; i++) {
4764 if (i)
4765 trace_seq_puts(s, ", ");
4766 trace_seq_printf(s, "%02x",
4767 *((unsigned char *)data + offset + i));
4768 }
4769 trace_seq_putc(s, ']');
4770 field->flags &= ~FIELD_IS_STRING;
4771 }
4772 } else { 4757 } else {
4773 val = pevent_read_number(event->pevent, data + field->offset, 4758 trace_seq_puts(s, "ARRAY[");
4774 field->size); 4759 for (i = 0; i < len; i++) {
4775 if (field->flags & FIELD_IS_POINTER) { 4760 if (i)
4776 trace_seq_printf(s, "0x%llx", val); 4761 trace_seq_puts(s, ", ");
4777 } else if (field->flags & FIELD_IS_SIGNED) { 4762 trace_seq_printf(s, "%02x",
4778 switch (field->size) { 4763 *((unsigned char *)data + offset + i));
4779 case 4: 4764 }
4780 /* 4765 trace_seq_putc(s, ']');
4781 * If field is long then print it in hex. 4766 field->flags &= ~FIELD_IS_STRING;
4782 * A long usually stores pointers. 4767 }
4783 */ 4768 } else {
4784 if (field->flags & FIELD_IS_LONG) 4769 val = pevent_read_number(pevent, data + field->offset,
4785 trace_seq_printf(s, "0x%x", (int)val); 4770 field->size);
4786 else 4771 if (field->flags & FIELD_IS_POINTER) {
4787 trace_seq_printf(s, "%d", (int)val); 4772 trace_seq_printf(s, "0x%llx", val);
4788 break; 4773 } else if (field->flags & FIELD_IS_SIGNED) {
4789 case 2: 4774 switch (field->size) {
4790 trace_seq_printf(s, "%2d", (short)val); 4775 case 4:
4791 break; 4776 /*
4792 case 1: 4777 * If field is long then print it in hex.
4793 trace_seq_printf(s, "%1d", (char)val); 4778 * A long usually stores pointers.
4794 break; 4779 */
4795 default:
4796 trace_seq_printf(s, "%lld", val);
4797 }
4798 } else {
4799 if (field->flags & FIELD_IS_LONG) 4780 if (field->flags & FIELD_IS_LONG)
4800 trace_seq_printf(s, "0x%llx", val); 4781 trace_seq_printf(s, "0x%x", (int)val);
4801 else 4782 else
4802 trace_seq_printf(s, "%llu", val); 4783 trace_seq_printf(s, "%d", (int)val);
4784 break;
4785 case 2:
4786 trace_seq_printf(s, "%2d", (short)val);
4787 break;
4788 case 1:
4789 trace_seq_printf(s, "%1d", (char)val);
4790 break;
4791 default:
4792 trace_seq_printf(s, "%lld", val);
4803 } 4793 }
4794 } else {
4795 if (field->flags & FIELD_IS_LONG)
4796 trace_seq_printf(s, "0x%llx", val);
4797 else
4798 trace_seq_printf(s, "%llu", val);
4804 } 4799 }
4800 }
4801}
4802
4803void pevent_print_fields(struct trace_seq *s, void *data,
4804 int size __maybe_unused, struct event_format *event)
4805{
4806 struct format_field *field;
4807
4808 field = event->format.fields;
4809 while (field) {
4810 trace_seq_printf(s, " %s=", field->name);
4811 pevent_print_field(s, data, field);
4805 field = field->next; 4812 field = field->next;
4806 } 4813 }
4807} 4814}
@@ -4827,7 +4834,7 @@ static void pretty_print(struct trace_seq *s, void *data, int size, struct event
4827 4834
4828 if (event->flags & EVENT_FL_FAILED) { 4835 if (event->flags & EVENT_FL_FAILED) {
4829 trace_seq_printf(s, "[FAILED TO PARSE]"); 4836 trace_seq_printf(s, "[FAILED TO PARSE]");
4830 print_event_fields(s, data, size, event); 4837 pevent_print_fields(s, data, size, event);
4831 return; 4838 return;
4832 } 4839 }
4833 4840
@@ -5301,7 +5308,7 @@ void pevent_event_info(struct trace_seq *s, struct event_format *event,
5301 int print_pretty = 1; 5308 int print_pretty = 1;
5302 5309
5303 if (event->pevent->print_raw || (event->flags & EVENT_FL_PRINTRAW)) 5310 if (event->pevent->print_raw || (event->flags & EVENT_FL_PRINTRAW))
5304 print_event_fields(s, record->data, record->size, event); 5311 pevent_print_fields(s, record->data, record->size, event);
5305 else { 5312 else {
5306 5313
5307 if (event->handler && !(event->flags & EVENT_FL_NOHANDLE)) 5314 if (event->handler && !(event->flags & EVENT_FL_NOHANDLE))