diff options
Diffstat (limited to 'tools/perf/util/scripting-engines/trace-event-python.c')
-rw-r--r-- | tools/perf/util/scripting-engines/trace-event-python.c | 34 |
1 files changed, 23 insertions, 11 deletions
diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c index ff134700bf30..089438da1f7f 100644 --- a/tools/perf/util/scripting-engines/trace-event-python.c +++ b/tools/perf/util/scripting-engines/trace-event-python.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <stdbool.h> | 27 | #include <stdbool.h> |
28 | #include <errno.h> | 28 | #include <errno.h> |
29 | #include <linux/bitmap.h> | 29 | #include <linux/bitmap.h> |
30 | #include <linux/time64.h> | ||
30 | 31 | ||
31 | #include "../../perf.h" | 32 | #include "../../perf.h" |
32 | #include "../debug.h" | 33 | #include "../debug.h" |
@@ -273,7 +274,7 @@ static PyObject *get_field_numeric_entry(struct event_format *event, | |||
273 | struct format_field *field, void *data) | 274 | struct format_field *field, void *data) |
274 | { | 275 | { |
275 | bool is_array = field->flags & FIELD_IS_ARRAY; | 276 | bool is_array = field->flags & FIELD_IS_ARRAY; |
276 | PyObject *obj, *list = NULL; | 277 | PyObject *obj = NULL, *list = NULL; |
277 | unsigned long long val; | 278 | unsigned long long val; |
278 | unsigned int item_size, n_items, i; | 279 | unsigned int item_size, n_items, i; |
279 | 280 | ||
@@ -386,13 +387,12 @@ exit: | |||
386 | return pylist; | 387 | return pylist; |
387 | } | 388 | } |
388 | 389 | ||
389 | |||
390 | static void python_process_tracepoint(struct perf_sample *sample, | 390 | static void python_process_tracepoint(struct perf_sample *sample, |
391 | struct perf_evsel *evsel, | 391 | struct perf_evsel *evsel, |
392 | struct addr_location *al) | 392 | struct addr_location *al) |
393 | { | 393 | { |
394 | struct event_format *event = evsel->tp_format; | 394 | struct event_format *event = evsel->tp_format; |
395 | PyObject *handler, *context, *t, *obj, *callchain; | 395 | PyObject *handler, *context, *t, *obj = NULL, *callchain; |
396 | PyObject *dict = NULL; | 396 | PyObject *dict = NULL; |
397 | static char handler_name[256]; | 397 | static char handler_name[256]; |
398 | struct format_field *field; | 398 | struct format_field *field; |
@@ -427,8 +427,8 @@ static void python_process_tracepoint(struct perf_sample *sample, | |||
427 | if (!dict) | 427 | if (!dict) |
428 | Py_FatalError("couldn't create Python dict"); | 428 | Py_FatalError("couldn't create Python dict"); |
429 | } | 429 | } |
430 | s = nsecs / NSECS_PER_SEC; | 430 | s = nsecs / NSEC_PER_SEC; |
431 | ns = nsecs - s * NSECS_PER_SEC; | 431 | ns = nsecs - s * NSEC_PER_SEC; |
432 | 432 | ||
433 | scripting_context->event_data = data; | 433 | scripting_context->event_data = data; |
434 | scripting_context->pevent = evsel->tp_format->pevent; | 434 | scripting_context->pevent = evsel->tp_format->pevent; |
@@ -457,14 +457,26 @@ static void python_process_tracepoint(struct perf_sample *sample, | |||
457 | pydict_set_item_string_decref(dict, "common_callchain", callchain); | 457 | pydict_set_item_string_decref(dict, "common_callchain", callchain); |
458 | } | 458 | } |
459 | for (field = event->format.fields; field; field = field->next) { | 459 | for (field = event->format.fields; field; field = field->next) { |
460 | if (field->flags & FIELD_IS_STRING) { | 460 | unsigned int offset, len; |
461 | int offset; | 461 | unsigned long long val; |
462 | |||
463 | if (field->flags & FIELD_IS_ARRAY) { | ||
464 | offset = field->offset; | ||
465 | len = field->size; | ||
462 | if (field->flags & FIELD_IS_DYNAMIC) { | 466 | if (field->flags & FIELD_IS_DYNAMIC) { |
463 | offset = *(int *)(data + field->offset); | 467 | val = pevent_read_number(scripting_context->pevent, |
468 | data + offset, len); | ||
469 | offset = val; | ||
470 | len = offset >> 16; | ||
464 | offset &= 0xffff; | 471 | offset &= 0xffff; |
465 | } else | 472 | } |
466 | offset = field->offset; | 473 | if (field->flags & FIELD_IS_STRING && |
467 | obj = PyString_FromString((char *)data + offset); | 474 | is_printable_array(data + offset, len)) { |
475 | obj = PyString_FromString((char *) data + offset); | ||
476 | } else { | ||
477 | obj = PyByteArray_FromStringAndSize((const char *) data + offset, len); | ||
478 | field->flags &= ~FIELD_IS_STRING; | ||
479 | } | ||
468 | } else { /* FIELD_IS_NUMERIC */ | 480 | } else { /* FIELD_IS_NUMERIC */ |
469 | obj = get_field_numeric_entry(event, field, data); | 481 | obj = get_field_numeric_entry(event, field, data); |
470 | } | 482 | } |