tools lib traceevent: Handle __print_hex(__get_dynamic_array(fieldname), len)
The kernel has a few events with a format similar to this excerpt:
field:unsigned int len; offset:12; size:4; signed:0;
field:__data_loc unsigned char[] data_array; offset:16; size:4; signed:0;
print fmt: "%s", __print_hex(__get_dynamic_array(data_array), REC->len)
trace-cmd could already parse that arg correctly, but print_str_arg()
was unable to handle the first parameter being a dynamic array. (It
just printed a "field not found" warning).
Teach print_str_arg's PRINT_HEX case to handle the nested
PRINT_DYNAMIC_ARRAY correctly. The output now matches the kernel's own
formatting for this case.
Signed-off-by: Howard Cochran <hcochran@lexmark.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Link: http://lkml.kernel.org/r/1381503349-12271-1-git-send-email-hcochran@lexmark.com
[ Removed "polish compare", we don't do that here ]
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
0970b5f438
commit
b30f75eba2
1 changed files with 16 additions and 8 deletions
|
|
@ -3588,6 +3588,13 @@ static void print_str_arg(struct trace_seq *s, void *data, int size,
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PRINT_HEX:
|
case PRINT_HEX:
|
||||||
|
if (arg->hex.field->type == PRINT_DYNAMIC_ARRAY) {
|
||||||
|
unsigned long offset;
|
||||||
|
offset = pevent_read_number(pevent,
|
||||||
|
data + arg->hex.field->dynarray.field->offset,
|
||||||
|
arg->hex.field->dynarray.field->size);
|
||||||
|
hex = data + (offset & 0xffff);
|
||||||
|
} else {
|
||||||
field = arg->hex.field->field.field;
|
field = arg->hex.field->field.field;
|
||||||
if (!field) {
|
if (!field) {
|
||||||
str = arg->hex.field->field.name;
|
str = arg->hex.field->field.name;
|
||||||
|
|
@ -3597,6 +3604,7 @@ static void print_str_arg(struct trace_seq *s, void *data, int size,
|
||||||
arg->hex.field->field.field = field;
|
arg->hex.field->field.field = field;
|
||||||
}
|
}
|
||||||
hex = data + field->offset;
|
hex = data + field->offset;
|
||||||
|
}
|
||||||
len = eval_num_arg(data, size, event, arg->hex.size);
|
len = eval_num_arg(data, size, event, arg->hex.size);
|
||||||
for (i = 0; i < len; i++) {
|
for (i = 0; i < len; i++) {
|
||||||
if (i)
|
if (i)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue