17e4b21b8STom Zanussi /* 27e4b21b8STom Zanussi * trace-event-python. Feed trace events to an embedded Python interpreter. 37e4b21b8STom Zanussi * 47e4b21b8STom Zanussi * Copyright (C) 2010 Tom Zanussi <[email protected]> 57e4b21b8STom Zanussi * 67e4b21b8STom Zanussi * This program is free software; you can redistribute it and/or modify 77e4b21b8STom Zanussi * it under the terms of the GNU General Public License as published by 87e4b21b8STom Zanussi * the Free Software Foundation; either version 2 of the License, or 97e4b21b8STom Zanussi * (at your option) any later version. 107e4b21b8STom Zanussi * 117e4b21b8STom Zanussi * This program is distributed in the hope that it will be useful, 127e4b21b8STom Zanussi * but WITHOUT ANY WARRANTY; without even the implied warranty of 137e4b21b8STom Zanussi * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 147e4b21b8STom Zanussi * GNU General Public License for more details. 157e4b21b8STom Zanussi * 167e4b21b8STom Zanussi * You should have received a copy of the GNU General Public License 177e4b21b8STom Zanussi * along with this program; if not, write to the Free Software 187e4b21b8STom Zanussi * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 197e4b21b8STom Zanussi * 207e4b21b8STom Zanussi */ 217e4b21b8STom Zanussi 227e4b21b8STom Zanussi #include <Python.h> 237e4b21b8STom Zanussi 24fd20e811SArnaldo Carvalho de Melo #include <inttypes.h> 257e4b21b8STom Zanussi #include <stdio.h> 267e4b21b8STom Zanussi #include <stdlib.h> 277e4b21b8STom Zanussi #include <string.h> 28df919b40SAdrian Hunter #include <stdbool.h> 297e4b21b8STom Zanussi #include <errno.h> 30adf5bcf3SJiri Olsa #include <linux/bitmap.h> 316c346643SArnaldo Carvalho de Melo #include <linux/compiler.h> 32bd48c63eSArnaldo Carvalho de Melo #include <linux/time64.h> 337e4b21b8STom Zanussi 347e4b21b8STom Zanussi #include "../../perf.h" 3584f5d36fSJiri Olsa #include "../debug.h" 368f651eaeSArnaldo Carvalho de Melo #include "../callchain.h" 37fcf65bf1SArnaldo Carvalho de Melo #include "../evsel.h" 387e4b21b8STom Zanussi #include "../util.h" 39743eb868SArnaldo Carvalho de Melo #include "../event.h" 40743eb868SArnaldo Carvalho de Melo #include "../thread.h" 41df919b40SAdrian Hunter #include "../comm.h" 42df919b40SAdrian Hunter #include "../machine.h" 43df919b40SAdrian Hunter #include "../db-export.h" 446a70307dSAdrian Hunter #include "../thread-stack.h" 457e4b21b8STom Zanussi #include "../trace-event.h" 46451db126SChris Phlipot #include "../call-path.h" 47aef90263SJiri Olsa #include "thread_map.h" 48aef90263SJiri Olsa #include "cpumap.h" 49fea01392SArnaldo Carvalho de Melo #include "print_binary.h" 50aef90263SJiri Olsa #include "stat.h" 517e4b21b8STom Zanussi 52*66dfdff0SJaroslav Škarvada #if PY_MAJOR_VERSION < 3 53*66dfdff0SJaroslav Škarvada #define _PyUnicode_FromString(arg) \ 54*66dfdff0SJaroslav Škarvada PyString_FromString(arg) 55*66dfdff0SJaroslav Škarvada #define _PyUnicode_FromStringAndSize(arg1, arg2) \ 56*66dfdff0SJaroslav Škarvada PyString_FromStringAndSize((arg1), (arg2)) 57*66dfdff0SJaroslav Škarvada #define _PyBytes_FromStringAndSize(arg1, arg2) \ 58*66dfdff0SJaroslav Škarvada PyString_FromStringAndSize((arg1), (arg2)) 59*66dfdff0SJaroslav Škarvada #define _PyLong_FromLong(arg) \ 60*66dfdff0SJaroslav Škarvada PyInt_FromLong(arg) 61*66dfdff0SJaroslav Škarvada #define _PyLong_AsLong(arg) \ 62*66dfdff0SJaroslav Škarvada PyInt_AsLong(arg) 63*66dfdff0SJaroslav Škarvada #define _PyCapsule_New(arg1, arg2, arg3) \ 64*66dfdff0SJaroslav Škarvada PyCObject_FromVoidPtr((arg1), (arg2)) 65*66dfdff0SJaroslav Škarvada 667e4b21b8STom Zanussi PyMODINIT_FUNC initperf_trace_context(void); 67*66dfdff0SJaroslav Škarvada #else 68*66dfdff0SJaroslav Škarvada #define _PyUnicode_FromString(arg) \ 69*66dfdff0SJaroslav Škarvada PyUnicode_FromString(arg) 70*66dfdff0SJaroslav Škarvada #define _PyUnicode_FromStringAndSize(arg1, arg2) \ 71*66dfdff0SJaroslav Škarvada PyUnicode_FromStringAndSize((arg1), (arg2)) 72*66dfdff0SJaroslav Škarvada #define _PyBytes_FromStringAndSize(arg1, arg2) \ 73*66dfdff0SJaroslav Škarvada PyBytes_FromStringAndSize((arg1), (arg2)) 74*66dfdff0SJaroslav Škarvada #define _PyLong_FromLong(arg) \ 75*66dfdff0SJaroslav Škarvada PyLong_FromLong(arg) 76*66dfdff0SJaroslav Škarvada #define _PyLong_AsLong(arg) \ 77*66dfdff0SJaroslav Škarvada PyLong_AsLong(arg) 78*66dfdff0SJaroslav Škarvada #define _PyCapsule_New(arg1, arg2, arg3) \ 79*66dfdff0SJaroslav Škarvada PyCapsule_New((arg1), (arg2), (arg3)) 80*66dfdff0SJaroslav Škarvada 81*66dfdff0SJaroslav Škarvada PyMODINIT_FUNC PyInit_perf_trace_context(void); 82*66dfdff0SJaroslav Škarvada #endif 837e4b21b8STom Zanussi 84609a7404SSteven Rostedt (Red Hat) #define TRACE_EVENT_TYPE_MAX \ 857e4b21b8STom Zanussi ((1 << (sizeof(unsigned short) * 8)) - 1) 867e4b21b8STom Zanussi 87609a7404SSteven Rostedt (Red Hat) static DECLARE_BITMAP(events_defined, TRACE_EVENT_TYPE_MAX); 887e4b21b8STom Zanussi 897e4b21b8STom Zanussi #define MAX_FIELDS 64 907e4b21b8STom Zanussi #define N_COMMON_FIELDS 7 917e4b21b8STom Zanussi 927e4b21b8STom Zanussi extern struct scripting_context *scripting_context; 937e4b21b8STom Zanussi 947e4b21b8STom Zanussi static char *cur_field_name; 957e4b21b8STom Zanussi static int zero_flag_atom; 967e4b21b8STom Zanussi 977e4b21b8STom Zanussi static PyObject *main_module, *main_dict; 987e4b21b8STom Zanussi 99df919b40SAdrian Hunter struct tables { 100df919b40SAdrian Hunter struct db_export dbe; 101df919b40SAdrian Hunter PyObject *evsel_handler; 102df919b40SAdrian Hunter PyObject *machine_handler; 103df919b40SAdrian Hunter PyObject *thread_handler; 104df919b40SAdrian Hunter PyObject *comm_handler; 105df919b40SAdrian Hunter PyObject *comm_thread_handler; 106df919b40SAdrian Hunter PyObject *dso_handler; 107df919b40SAdrian Hunter PyObject *symbol_handler; 108c29414f5SAdrian Hunter PyObject *branch_type_handler; 109df919b40SAdrian Hunter PyObject *sample_handler; 1106a70307dSAdrian Hunter PyObject *call_path_handler; 1116a70307dSAdrian Hunter PyObject *call_return_handler; 112df919b40SAdrian Hunter bool db_export_mode; 113df919b40SAdrian Hunter }; 114df919b40SAdrian Hunter 115df919b40SAdrian Hunter static struct tables tables_global; 116df919b40SAdrian Hunter 1176c346643SArnaldo Carvalho de Melo static void handler_call_die(const char *handler_name) __noreturn; 1187e4b21b8STom Zanussi static void handler_call_die(const char *handler_name) 1197e4b21b8STom Zanussi { 1207e4b21b8STom Zanussi PyErr_Print(); 1217e4b21b8STom Zanussi Py_FatalError("problem in Python trace event handler"); 12205f832e3SJoseph Schuchart // Py_FatalError does not return 12305f832e3SJoseph Schuchart // but we have to make the compiler happy 12405f832e3SJoseph Schuchart abort(); 1257e4b21b8STom Zanussi } 1267e4b21b8STom Zanussi 127c0268e8dSJoseph Schuchart /* 128c0268e8dSJoseph Schuchart * Insert val into into the dictionary and decrement the reference counter. 129c0268e8dSJoseph Schuchart * This is necessary for dictionaries since PyDict_SetItemString() does not 130c0268e8dSJoseph Schuchart * steal a reference, as opposed to PyTuple_SetItem(). 131c0268e8dSJoseph Schuchart */ 132c0268e8dSJoseph Schuchart static void pydict_set_item_string_decref(PyObject *dict, const char *key, PyObject *val) 133c0268e8dSJoseph Schuchart { 134c0268e8dSJoseph Schuchart PyDict_SetItemString(dict, key, val); 135c0268e8dSJoseph Schuchart Py_DECREF(val); 136c0268e8dSJoseph Schuchart } 137c0268e8dSJoseph Schuchart 138a5563edfSAdrian Hunter static PyObject *get_handler(const char *handler_name) 139a5563edfSAdrian Hunter { 140a5563edfSAdrian Hunter PyObject *handler; 141a5563edfSAdrian Hunter 142a5563edfSAdrian Hunter handler = PyDict_GetItemString(main_dict, handler_name); 143a5563edfSAdrian Hunter if (handler && !PyCallable_Check(handler)) 144a5563edfSAdrian Hunter return NULL; 145a5563edfSAdrian Hunter return handler; 146a5563edfSAdrian Hunter } 147a5563edfSAdrian Hunter 148f38d2816SArun Kalyanasundaram static int get_argument_count(PyObject *handler) 149f38d2816SArun Kalyanasundaram { 150f38d2816SArun Kalyanasundaram int arg_count = 0; 151f38d2816SArun Kalyanasundaram 152f38d2816SArun Kalyanasundaram /* 153f38d2816SArun Kalyanasundaram * The attribute for the code object is func_code in Python 2, 154f38d2816SArun Kalyanasundaram * whereas it is __code__ in Python 3.0+. 155f38d2816SArun Kalyanasundaram */ 156f38d2816SArun Kalyanasundaram PyObject *code_obj = PyObject_GetAttrString(handler, 157f38d2816SArun Kalyanasundaram "func_code"); 158f38d2816SArun Kalyanasundaram if (PyErr_Occurred()) { 159f38d2816SArun Kalyanasundaram PyErr_Clear(); 160f38d2816SArun Kalyanasundaram code_obj = PyObject_GetAttrString(handler, 161f38d2816SArun Kalyanasundaram "__code__"); 162f38d2816SArun Kalyanasundaram } 163f38d2816SArun Kalyanasundaram PyErr_Clear(); 164f38d2816SArun Kalyanasundaram if (code_obj) { 165f38d2816SArun Kalyanasundaram PyObject *arg_count_obj = PyObject_GetAttrString(code_obj, 166f38d2816SArun Kalyanasundaram "co_argcount"); 167f38d2816SArun Kalyanasundaram if (arg_count_obj) { 168*66dfdff0SJaroslav Škarvada arg_count = (int) _PyLong_AsLong(arg_count_obj); 169f38d2816SArun Kalyanasundaram Py_DECREF(arg_count_obj); 170f38d2816SArun Kalyanasundaram } 171f38d2816SArun Kalyanasundaram Py_DECREF(code_obj); 172f38d2816SArun Kalyanasundaram } 173f38d2816SArun Kalyanasundaram return arg_count; 174f38d2816SArun Kalyanasundaram } 175f38d2816SArun Kalyanasundaram 176a5563edfSAdrian Hunter static void call_object(PyObject *handler, PyObject *args, const char *die_msg) 177a5563edfSAdrian Hunter { 178a5563edfSAdrian Hunter PyObject *retval; 179a5563edfSAdrian Hunter 180a5563edfSAdrian Hunter retval = PyObject_CallObject(handler, args); 181a5563edfSAdrian Hunter if (retval == NULL) 182a5563edfSAdrian Hunter handler_call_die(die_msg); 183a5563edfSAdrian Hunter Py_DECREF(retval); 184a5563edfSAdrian Hunter } 185a5563edfSAdrian Hunter 186a5563edfSAdrian Hunter static void try_call_object(const char *handler_name, PyObject *args) 187a5563edfSAdrian Hunter { 188a5563edfSAdrian Hunter PyObject *handler; 189a5563edfSAdrian Hunter 190a5563edfSAdrian Hunter handler = get_handler(handler_name); 191a5563edfSAdrian Hunter if (handler) 192a5563edfSAdrian Hunter call_object(handler, args, handler_name); 193a5563edfSAdrian Hunter } 194a5563edfSAdrian Hunter 1957e4b21b8STom Zanussi static void define_value(enum print_arg_type field_type, 1967e4b21b8STom Zanussi const char *ev_name, 1977e4b21b8STom Zanussi const char *field_name, 1987e4b21b8STom Zanussi const char *field_value, 1997e4b21b8STom Zanussi const char *field_str) 2007e4b21b8STom Zanussi { 2017e4b21b8STom Zanussi const char *handler_name = "define_flag_value"; 202a5563edfSAdrian Hunter PyObject *t; 2037e4b21b8STom Zanussi unsigned long long value; 2047e4b21b8STom Zanussi unsigned n = 0; 2057e4b21b8STom Zanussi 2067e4b21b8STom Zanussi if (field_type == PRINT_SYMBOL) 2077e4b21b8STom Zanussi handler_name = "define_symbolic_value"; 2087e4b21b8STom Zanussi 20944ad9cd8STom Zanussi t = PyTuple_New(4); 2107e4b21b8STom Zanussi if (!t) 2117e4b21b8STom Zanussi Py_FatalError("couldn't create Python tuple"); 2127e4b21b8STom Zanussi 2137e4b21b8STom Zanussi value = eval_flag(field_value); 2147e4b21b8STom Zanussi 215*66dfdff0SJaroslav Škarvada PyTuple_SetItem(t, n++, _PyUnicode_FromString(ev_name)); 216*66dfdff0SJaroslav Škarvada PyTuple_SetItem(t, n++, _PyUnicode_FromString(field_name)); 217*66dfdff0SJaroslav Škarvada PyTuple_SetItem(t, n++, _PyLong_FromLong(value)); 218*66dfdff0SJaroslav Škarvada PyTuple_SetItem(t, n++, _PyUnicode_FromString(field_str)); 2197e4b21b8STom Zanussi 220a5563edfSAdrian Hunter try_call_object(handler_name, t); 2217e4b21b8STom Zanussi 2227e4b21b8STom Zanussi Py_DECREF(t); 2237e4b21b8STom Zanussi } 2247e4b21b8STom Zanussi 2257e4b21b8STom Zanussi static void define_values(enum print_arg_type field_type, 2267e4b21b8STom Zanussi struct print_flag_sym *field, 2277e4b21b8STom Zanussi const char *ev_name, 2287e4b21b8STom Zanussi const char *field_name) 2297e4b21b8STom Zanussi { 2307e4b21b8STom Zanussi define_value(field_type, ev_name, field_name, field->value, 2317e4b21b8STom Zanussi field->str); 2327e4b21b8STom Zanussi 2337e4b21b8STom Zanussi if (field->next) 2347e4b21b8STom Zanussi define_values(field_type, field->next, ev_name, field_name); 2357e4b21b8STom Zanussi } 2367e4b21b8STom Zanussi 2377e4b21b8STom Zanussi static void define_field(enum print_arg_type field_type, 2387e4b21b8STom Zanussi const char *ev_name, 2397e4b21b8STom Zanussi const char *field_name, 2407e4b21b8STom Zanussi const char *delim) 2417e4b21b8STom Zanussi { 2427e4b21b8STom Zanussi const char *handler_name = "define_flag_field"; 243a5563edfSAdrian Hunter PyObject *t; 2447e4b21b8STom Zanussi unsigned n = 0; 2457e4b21b8STom Zanussi 2467e4b21b8STom Zanussi if (field_type == PRINT_SYMBOL) 2477e4b21b8STom Zanussi handler_name = "define_symbolic_field"; 2487e4b21b8STom Zanussi 24944ad9cd8STom Zanussi if (field_type == PRINT_FLAGS) 25044ad9cd8STom Zanussi t = PyTuple_New(3); 25144ad9cd8STom Zanussi else 25244ad9cd8STom Zanussi t = PyTuple_New(2); 2537e4b21b8STom Zanussi if (!t) 2547e4b21b8STom Zanussi Py_FatalError("couldn't create Python tuple"); 2557e4b21b8STom Zanussi 256*66dfdff0SJaroslav Škarvada PyTuple_SetItem(t, n++, _PyUnicode_FromString(ev_name)); 257*66dfdff0SJaroslav Škarvada PyTuple_SetItem(t, n++, _PyUnicode_FromString(field_name)); 2587e4b21b8STom Zanussi if (field_type == PRINT_FLAGS) 259*66dfdff0SJaroslav Škarvada PyTuple_SetItem(t, n++, _PyUnicode_FromString(delim)); 2607e4b21b8STom Zanussi 261a5563edfSAdrian Hunter try_call_object(handler_name, t); 2627e4b21b8STom Zanussi 2637e4b21b8STom Zanussi Py_DECREF(t); 2647e4b21b8STom Zanussi } 2657e4b21b8STom Zanussi 266aaf045f7SSteven Rostedt static void define_event_symbols(struct event_format *event, 2677e4b21b8STom Zanussi const char *ev_name, 2687e4b21b8STom Zanussi struct print_arg *args) 2697e4b21b8STom Zanussi { 2708579aca3STaeung Song if (args == NULL) 2718579aca3STaeung Song return; 2728579aca3STaeung Song 2737e4b21b8STom Zanussi switch (args->type) { 2747e4b21b8STom Zanussi case PRINT_NULL: 2757e4b21b8STom Zanussi break; 2767e4b21b8STom Zanussi case PRINT_ATOM: 2777e4b21b8STom Zanussi define_value(PRINT_FLAGS, ev_name, cur_field_name, "0", 2787e4b21b8STom Zanussi args->atom.atom); 2797e4b21b8STom Zanussi zero_flag_atom = 0; 2807e4b21b8STom Zanussi break; 2817e4b21b8STom Zanussi case PRINT_FIELD: 2827e4b21b8STom Zanussi free(cur_field_name); 2837e4b21b8STom Zanussi cur_field_name = strdup(args->field.name); 2847e4b21b8STom Zanussi break; 2857e4b21b8STom Zanussi case PRINT_FLAGS: 2867e4b21b8STom Zanussi define_event_symbols(event, ev_name, args->flags.field); 2877e4b21b8STom Zanussi define_field(PRINT_FLAGS, ev_name, cur_field_name, 2887e4b21b8STom Zanussi args->flags.delim); 2897e4b21b8STom Zanussi define_values(PRINT_FLAGS, args->flags.flags, ev_name, 2907e4b21b8STom Zanussi cur_field_name); 2917e4b21b8STom Zanussi break; 2927e4b21b8STom Zanussi case PRINT_SYMBOL: 2937e4b21b8STom Zanussi define_event_symbols(event, ev_name, args->symbol.field); 2947e4b21b8STom Zanussi define_field(PRINT_SYMBOL, ev_name, cur_field_name, NULL); 2957e4b21b8STom Zanussi define_values(PRINT_SYMBOL, args->symbol.symbols, ev_name, 2967e4b21b8STom Zanussi cur_field_name); 2977e4b21b8STom Zanussi break; 298e080e6f1SNamhyung Kim case PRINT_HEX: 2990fe05591SDaniel Borkmann case PRINT_HEX_STR: 300e080e6f1SNamhyung Kim define_event_symbols(event, ev_name, args->hex.field); 301e080e6f1SNamhyung Kim define_event_symbols(event, ev_name, args->hex.size); 302e080e6f1SNamhyung Kim break; 303b839e1e8SJavi Merino case PRINT_INT_ARRAY: 304b839e1e8SJavi Merino define_event_symbols(event, ev_name, args->int_array.field); 305b839e1e8SJavi Merino define_event_symbols(event, ev_name, args->int_array.count); 306b839e1e8SJavi Merino define_event_symbols(event, ev_name, args->int_array.el_size); 307b839e1e8SJavi Merino break; 3087e4b21b8STom Zanussi case PRINT_STRING: 3097e4b21b8STom Zanussi break; 3107e4b21b8STom Zanussi case PRINT_TYPE: 3117e4b21b8STom Zanussi define_event_symbols(event, ev_name, args->typecast.item); 3127e4b21b8STom Zanussi break; 3137e4b21b8STom Zanussi case PRINT_OP: 3147e4b21b8STom Zanussi if (strcmp(args->op.op, ":") == 0) 3157e4b21b8STom Zanussi zero_flag_atom = 1; 3167e4b21b8STom Zanussi define_event_symbols(event, ev_name, args->op.left); 3177e4b21b8STom Zanussi define_event_symbols(event, ev_name, args->op.right); 3187e4b21b8STom Zanussi break; 3197e4b21b8STom Zanussi default: 320aaf045f7SSteven Rostedt /* gcc warns for these? */ 321aaf045f7SSteven Rostedt case PRINT_BSTRING: 322aaf045f7SSteven Rostedt case PRINT_DYNAMIC_ARRAY: 32376055940SHe Kuang case PRINT_DYNAMIC_ARRAY_LEN: 324aaf045f7SSteven Rostedt case PRINT_FUNC: 325473a778aSSteven Rostedt (Red Hat) case PRINT_BITMASK: 3267e4b21b8STom Zanussi /* we should warn... */ 3277e4b21b8STom Zanussi return; 3287e4b21b8STom Zanussi } 3297e4b21b8STom Zanussi 3307e4b21b8STom Zanussi if (args->next) 3317e4b21b8STom Zanussi define_event_symbols(event, ev_name, args->next); 3327e4b21b8STom Zanussi } 3337e4b21b8STom Zanussi 33433058b94SSebastian Andrzej Siewior static PyObject *get_field_numeric_entry(struct event_format *event, 33533058b94SSebastian Andrzej Siewior struct format_field *field, void *data) 33633058b94SSebastian Andrzej Siewior { 3378ac631cdSSebastian Andrzej Siewior bool is_array = field->flags & FIELD_IS_ARRAY; 33839f54862SArnaldo Carvalho de Melo PyObject *obj = NULL, *list = NULL; 33933058b94SSebastian Andrzej Siewior unsigned long long val; 3408ac631cdSSebastian Andrzej Siewior unsigned int item_size, n_items, i; 34133058b94SSebastian Andrzej Siewior 3428ac631cdSSebastian Andrzej Siewior if (is_array) { 3438ac631cdSSebastian Andrzej Siewior list = PyList_New(field->arraylen); 3448ac631cdSSebastian Andrzej Siewior item_size = field->size / field->arraylen; 3458ac631cdSSebastian Andrzej Siewior n_items = field->arraylen; 3468ac631cdSSebastian Andrzej Siewior } else { 3478ac631cdSSebastian Andrzej Siewior item_size = field->size; 3488ac631cdSSebastian Andrzej Siewior n_items = 1; 3498ac631cdSSebastian Andrzej Siewior } 3508ac631cdSSebastian Andrzej Siewior 3518ac631cdSSebastian Andrzej Siewior for (i = 0; i < n_items; i++) { 3528ac631cdSSebastian Andrzej Siewior 3538ac631cdSSebastian Andrzej Siewior val = read_size(event, data + field->offset + i * item_size, 3548ac631cdSSebastian Andrzej Siewior item_size); 35533058b94SSebastian Andrzej Siewior if (field->flags & FIELD_IS_SIGNED) { 35633058b94SSebastian Andrzej Siewior if ((long long)val >= LONG_MIN && 35733058b94SSebastian Andrzej Siewior (long long)val <= LONG_MAX) 358*66dfdff0SJaroslav Škarvada obj = _PyLong_FromLong(val); 35933058b94SSebastian Andrzej Siewior else 36033058b94SSebastian Andrzej Siewior obj = PyLong_FromLongLong(val); 36133058b94SSebastian Andrzej Siewior } else { 36233058b94SSebastian Andrzej Siewior if (val <= LONG_MAX) 363*66dfdff0SJaroslav Škarvada obj = _PyLong_FromLong(val); 36433058b94SSebastian Andrzej Siewior else 36533058b94SSebastian Andrzej Siewior obj = PyLong_FromUnsignedLongLong(val); 36633058b94SSebastian Andrzej Siewior } 3678ac631cdSSebastian Andrzej Siewior if (is_array) 3688ac631cdSSebastian Andrzej Siewior PyList_SET_ITEM(list, i, obj); 3698ac631cdSSebastian Andrzej Siewior } 3708ac631cdSSebastian Andrzej Siewior if (is_array) 3718ac631cdSSebastian Andrzej Siewior obj = list; 37233058b94SSebastian Andrzej Siewior return obj; 37333058b94SSebastian Andrzej Siewior } 37433058b94SSebastian Andrzej Siewior 3750f5f5bcdSJoseph Schuchart 3760f5f5bcdSJoseph Schuchart static PyObject *python_process_callchain(struct perf_sample *sample, 3770f5f5bcdSJoseph Schuchart struct perf_evsel *evsel, 3780f5f5bcdSJoseph Schuchart struct addr_location *al) 3790f5f5bcdSJoseph Schuchart { 3800f5f5bcdSJoseph Schuchart PyObject *pylist; 3810f5f5bcdSJoseph Schuchart 3820f5f5bcdSJoseph Schuchart pylist = PyList_New(0); 3830f5f5bcdSJoseph Schuchart if (!pylist) 3840f5f5bcdSJoseph Schuchart Py_FatalError("couldn't create Python list"); 3850f5f5bcdSJoseph Schuchart 3860f5f5bcdSJoseph Schuchart if (!symbol_conf.use_callchain || !sample->callchain) 3870f5f5bcdSJoseph Schuchart goto exit; 3880f5f5bcdSJoseph Schuchart 38991d7b2deSArnaldo Carvalho de Melo if (thread__resolve_callchain(al->thread, &callchain_cursor, evsel, 3900f5f5bcdSJoseph Schuchart sample, NULL, NULL, 39144cbe729SAdrian Hunter scripting_max_stack) != 0) { 3920f5f5bcdSJoseph Schuchart pr_err("Failed to resolve callchain. Skipping\n"); 3930f5f5bcdSJoseph Schuchart goto exit; 3940f5f5bcdSJoseph Schuchart } 3950f5f5bcdSJoseph Schuchart callchain_cursor_commit(&callchain_cursor); 3960f5f5bcdSJoseph Schuchart 3970f5f5bcdSJoseph Schuchart 3980f5f5bcdSJoseph Schuchart while (1) { 3990f5f5bcdSJoseph Schuchart PyObject *pyelem; 4000f5f5bcdSJoseph Schuchart struct callchain_cursor_node *node; 4010f5f5bcdSJoseph Schuchart node = callchain_cursor_current(&callchain_cursor); 4020f5f5bcdSJoseph Schuchart if (!node) 4030f5f5bcdSJoseph Schuchart break; 4040f5f5bcdSJoseph Schuchart 4050f5f5bcdSJoseph Schuchart pyelem = PyDict_New(); 4060f5f5bcdSJoseph Schuchart if (!pyelem) 4070f5f5bcdSJoseph Schuchart Py_FatalError("couldn't create Python dictionary"); 4080f5f5bcdSJoseph Schuchart 4090f5f5bcdSJoseph Schuchart 4100f5f5bcdSJoseph Schuchart pydict_set_item_string_decref(pyelem, "ip", 4110f5f5bcdSJoseph Schuchart PyLong_FromUnsignedLongLong(node->ip)); 4120f5f5bcdSJoseph Schuchart 4130f5f5bcdSJoseph Schuchart if (node->sym) { 4140f5f5bcdSJoseph Schuchart PyObject *pysym = PyDict_New(); 4150f5f5bcdSJoseph Schuchart if (!pysym) 4160f5f5bcdSJoseph Schuchart Py_FatalError("couldn't create Python dictionary"); 4170f5f5bcdSJoseph Schuchart pydict_set_item_string_decref(pysym, "start", 4180f5f5bcdSJoseph Schuchart PyLong_FromUnsignedLongLong(node->sym->start)); 4190f5f5bcdSJoseph Schuchart pydict_set_item_string_decref(pysym, "end", 4200f5f5bcdSJoseph Schuchart PyLong_FromUnsignedLongLong(node->sym->end)); 4210f5f5bcdSJoseph Schuchart pydict_set_item_string_decref(pysym, "binding", 422*66dfdff0SJaroslav Škarvada _PyLong_FromLong(node->sym->binding)); 4230f5f5bcdSJoseph Schuchart pydict_set_item_string_decref(pysym, "name", 424*66dfdff0SJaroslav Škarvada _PyUnicode_FromStringAndSize(node->sym->name, 4250f5f5bcdSJoseph Schuchart node->sym->namelen)); 4260f5f5bcdSJoseph Schuchart pydict_set_item_string_decref(pyelem, "sym", pysym); 4270f5f5bcdSJoseph Schuchart } 4280f5f5bcdSJoseph Schuchart 4290f5f5bcdSJoseph Schuchart if (node->map) { 4300f5f5bcdSJoseph Schuchart struct map *map = node->map; 4310f5f5bcdSJoseph Schuchart const char *dsoname = "[unknown]"; 4328bd8c653SArnaldo Carvalho de Melo if (map && map->dso) { 4330f5f5bcdSJoseph Schuchart if (symbol_conf.show_kernel_path && map->dso->long_name) 4340f5f5bcdSJoseph Schuchart dsoname = map->dso->long_name; 4358bd8c653SArnaldo Carvalho de Melo else 4360f5f5bcdSJoseph Schuchart dsoname = map->dso->name; 4370f5f5bcdSJoseph Schuchart } 4380f5f5bcdSJoseph Schuchart pydict_set_item_string_decref(pyelem, "dso", 439*66dfdff0SJaroslav Škarvada _PyUnicode_FromString(dsoname)); 4400f5f5bcdSJoseph Schuchart } 4410f5f5bcdSJoseph Schuchart 4420f5f5bcdSJoseph Schuchart callchain_cursor_advance(&callchain_cursor); 4430f5f5bcdSJoseph Schuchart PyList_Append(pylist, pyelem); 4440f5f5bcdSJoseph Schuchart Py_DECREF(pyelem); 4450f5f5bcdSJoseph Schuchart } 4460f5f5bcdSJoseph Schuchart 4470f5f5bcdSJoseph Schuchart exit: 4480f5f5bcdSJoseph Schuchart return pylist; 4490f5f5bcdSJoseph Schuchart } 4500f5f5bcdSJoseph Schuchart 45174ec14f3SArun Kalyanasundaram static PyObject *get_sample_value_as_tuple(struct sample_read_value *value) 45274ec14f3SArun Kalyanasundaram { 45374ec14f3SArun Kalyanasundaram PyObject *t; 45474ec14f3SArun Kalyanasundaram 45574ec14f3SArun Kalyanasundaram t = PyTuple_New(2); 45674ec14f3SArun Kalyanasundaram if (!t) 45774ec14f3SArun Kalyanasundaram Py_FatalError("couldn't create Python tuple"); 45874ec14f3SArun Kalyanasundaram PyTuple_SetItem(t, 0, PyLong_FromUnsignedLongLong(value->id)); 45974ec14f3SArun Kalyanasundaram PyTuple_SetItem(t, 1, PyLong_FromUnsignedLongLong(value->value)); 46074ec14f3SArun Kalyanasundaram return t; 46174ec14f3SArun Kalyanasundaram } 46274ec14f3SArun Kalyanasundaram 46374ec14f3SArun Kalyanasundaram static void set_sample_read_in_dict(PyObject *dict_sample, 46474ec14f3SArun Kalyanasundaram struct perf_sample *sample, 46574ec14f3SArun Kalyanasundaram struct perf_evsel *evsel) 46674ec14f3SArun Kalyanasundaram { 46774ec14f3SArun Kalyanasundaram u64 read_format = evsel->attr.read_format; 46874ec14f3SArun Kalyanasundaram PyObject *values; 46974ec14f3SArun Kalyanasundaram unsigned int i; 47074ec14f3SArun Kalyanasundaram 47174ec14f3SArun Kalyanasundaram if (read_format & PERF_FORMAT_TOTAL_TIME_ENABLED) { 47274ec14f3SArun Kalyanasundaram pydict_set_item_string_decref(dict_sample, "time_enabled", 47374ec14f3SArun Kalyanasundaram PyLong_FromUnsignedLongLong(sample->read.time_enabled)); 47474ec14f3SArun Kalyanasundaram } 47574ec14f3SArun Kalyanasundaram 47674ec14f3SArun Kalyanasundaram if (read_format & PERF_FORMAT_TOTAL_TIME_RUNNING) { 47774ec14f3SArun Kalyanasundaram pydict_set_item_string_decref(dict_sample, "time_running", 47874ec14f3SArun Kalyanasundaram PyLong_FromUnsignedLongLong(sample->read.time_running)); 47974ec14f3SArun Kalyanasundaram } 48074ec14f3SArun Kalyanasundaram 48174ec14f3SArun Kalyanasundaram if (read_format & PERF_FORMAT_GROUP) 48274ec14f3SArun Kalyanasundaram values = PyList_New(sample->read.group.nr); 48374ec14f3SArun Kalyanasundaram else 48474ec14f3SArun Kalyanasundaram values = PyList_New(1); 48574ec14f3SArun Kalyanasundaram 48674ec14f3SArun Kalyanasundaram if (!values) 48774ec14f3SArun Kalyanasundaram Py_FatalError("couldn't create Python list"); 48874ec14f3SArun Kalyanasundaram 48974ec14f3SArun Kalyanasundaram if (read_format & PERF_FORMAT_GROUP) { 49074ec14f3SArun Kalyanasundaram for (i = 0; i < sample->read.group.nr; i++) { 49174ec14f3SArun Kalyanasundaram PyObject *t = get_sample_value_as_tuple(&sample->read.group.values[i]); 49274ec14f3SArun Kalyanasundaram PyList_SET_ITEM(values, i, t); 49374ec14f3SArun Kalyanasundaram } 49474ec14f3SArun Kalyanasundaram } else { 49574ec14f3SArun Kalyanasundaram PyObject *t = get_sample_value_as_tuple(&sample->read.one); 49674ec14f3SArun Kalyanasundaram PyList_SET_ITEM(values, 0, t); 49774ec14f3SArun Kalyanasundaram } 49874ec14f3SArun Kalyanasundaram pydict_set_item_string_decref(dict_sample, "values", values); 49974ec14f3SArun Kalyanasundaram } 50074ec14f3SArun Kalyanasundaram 501892e76b2SArun Kalyanasundaram static PyObject *get_perf_sample_dict(struct perf_sample *sample, 502892e76b2SArun Kalyanasundaram struct perf_evsel *evsel, 503892e76b2SArun Kalyanasundaram struct addr_location *al, 504892e76b2SArun Kalyanasundaram PyObject *callchain) 505892e76b2SArun Kalyanasundaram { 506892e76b2SArun Kalyanasundaram PyObject *dict, *dict_sample; 507892e76b2SArun Kalyanasundaram 508892e76b2SArun Kalyanasundaram dict = PyDict_New(); 509892e76b2SArun Kalyanasundaram if (!dict) 510892e76b2SArun Kalyanasundaram Py_FatalError("couldn't create Python dictionary"); 511892e76b2SArun Kalyanasundaram 512892e76b2SArun Kalyanasundaram dict_sample = PyDict_New(); 513892e76b2SArun Kalyanasundaram if (!dict_sample) 514892e76b2SArun Kalyanasundaram Py_FatalError("couldn't create Python dictionary"); 515892e76b2SArun Kalyanasundaram 516*66dfdff0SJaroslav Škarvada pydict_set_item_string_decref(dict, "ev_name", _PyUnicode_FromString(perf_evsel__name(evsel))); 517*66dfdff0SJaroslav Škarvada pydict_set_item_string_decref(dict, "attr", _PyUnicode_FromStringAndSize( 518892e76b2SArun Kalyanasundaram (const char *)&evsel->attr, sizeof(evsel->attr))); 519892e76b2SArun Kalyanasundaram 520892e76b2SArun Kalyanasundaram pydict_set_item_string_decref(dict_sample, "pid", 521*66dfdff0SJaroslav Škarvada _PyLong_FromLong(sample->pid)); 522892e76b2SArun Kalyanasundaram pydict_set_item_string_decref(dict_sample, "tid", 523*66dfdff0SJaroslav Škarvada _PyLong_FromLong(sample->tid)); 524892e76b2SArun Kalyanasundaram pydict_set_item_string_decref(dict_sample, "cpu", 525*66dfdff0SJaroslav Škarvada _PyLong_FromLong(sample->cpu)); 526892e76b2SArun Kalyanasundaram pydict_set_item_string_decref(dict_sample, "ip", 527892e76b2SArun Kalyanasundaram PyLong_FromUnsignedLongLong(sample->ip)); 528892e76b2SArun Kalyanasundaram pydict_set_item_string_decref(dict_sample, "time", 529892e76b2SArun Kalyanasundaram PyLong_FromUnsignedLongLong(sample->time)); 530892e76b2SArun Kalyanasundaram pydict_set_item_string_decref(dict_sample, "period", 531892e76b2SArun Kalyanasundaram PyLong_FromUnsignedLongLong(sample->period)); 53241013f0cSKan Liang pydict_set_item_string_decref(dict_sample, "phys_addr", 53341013f0cSKan Liang PyLong_FromUnsignedLongLong(sample->phys_addr)); 53474ec14f3SArun Kalyanasundaram set_sample_read_in_dict(dict_sample, sample, evsel); 535892e76b2SArun Kalyanasundaram pydict_set_item_string_decref(dict, "sample", dict_sample); 536892e76b2SArun Kalyanasundaram 537*66dfdff0SJaroslav Škarvada pydict_set_item_string_decref(dict, "raw_buf", _PyBytes_FromStringAndSize( 538892e76b2SArun Kalyanasundaram (const char *)sample->raw_data, sample->raw_size)); 539892e76b2SArun Kalyanasundaram pydict_set_item_string_decref(dict, "comm", 540*66dfdff0SJaroslav Škarvada _PyUnicode_FromString(thread__comm_str(al->thread))); 541892e76b2SArun Kalyanasundaram if (al->map) { 542892e76b2SArun Kalyanasundaram pydict_set_item_string_decref(dict, "dso", 543*66dfdff0SJaroslav Škarvada _PyUnicode_FromString(al->map->dso->name)); 544892e76b2SArun Kalyanasundaram } 545892e76b2SArun Kalyanasundaram if (al->sym) { 546892e76b2SArun Kalyanasundaram pydict_set_item_string_decref(dict, "symbol", 547*66dfdff0SJaroslav Škarvada _PyUnicode_FromString(al->sym->name)); 548892e76b2SArun Kalyanasundaram } 549892e76b2SArun Kalyanasundaram 550892e76b2SArun Kalyanasundaram pydict_set_item_string_decref(dict, "callchain", callchain); 551892e76b2SArun Kalyanasundaram 552892e76b2SArun Kalyanasundaram return dict; 553892e76b2SArun Kalyanasundaram } 554892e76b2SArun Kalyanasundaram 555b7fff6b5SArnaldo Carvalho de Melo static void python_process_tracepoint(struct perf_sample *sample, 556fcf65bf1SArnaldo Carvalho de Melo struct perf_evsel *evsel, 55773994dc1SFeng Tang struct addr_location *al) 5587e4b21b8STom Zanussi { 559adf5bcf3SJiri Olsa struct event_format *event = evsel->tp_format; 56039f54862SArnaldo Carvalho de Melo PyObject *handler, *context, *t, *obj = NULL, *callchain; 561f38d2816SArun Kalyanasundaram PyObject *dict = NULL, *all_entries_dict = NULL; 5627e4b21b8STom Zanussi static char handler_name[256]; 5637e4b21b8STom Zanussi struct format_field *field; 5647e4b21b8STom Zanussi unsigned long s, ns; 5657e4b21b8STom Zanussi unsigned n = 0; 5667e4b21b8STom Zanussi int pid; 567be6d842aSDavid Ahern int cpu = sample->cpu; 568be6d842aSDavid Ahern void *data = sample->raw_data; 569be6d842aSDavid Ahern unsigned long long nsecs = sample->time; 570f9d5d549SArnaldo Carvalho de Melo const char *comm = thread__comm_str(al->thread); 571e9f9a9caSArun Kalyanasundaram const char *default_handler_name = "trace_unhandled"; 5727e4b21b8STom Zanussi 57362665dffSArnaldo Carvalho de Melo if (!event) { 57462665dffSArnaldo Carvalho de Melo snprintf(handler_name, sizeof(handler_name), 57562665dffSArnaldo Carvalho de Melo "ug! no event found for type %" PRIu64, (u64)evsel->attr.config); 57662665dffSArnaldo Carvalho de Melo Py_FatalError(handler_name); 57762665dffSArnaldo Carvalho de Melo } 5787e4b21b8STom Zanussi 57997822433SArnaldo Carvalho de Melo pid = raw_field_value(event, "common_pid", data); 5807e4b21b8STom Zanussi 5817e4b21b8STom Zanussi sprintf(handler_name, "%s__%s", event->system, event->name); 5827e4b21b8STom Zanussi 583adf5bcf3SJiri Olsa if (!test_and_set_bit(event->id, events_defined)) 584adf5bcf3SJiri Olsa define_event_symbols(event, handler_name, event->print_fmt.args); 585adf5bcf3SJiri Olsa 586a5563edfSAdrian Hunter handler = get_handler(handler_name); 587c0251485SPierre Tardy if (!handler) { 588e9f9a9caSArun Kalyanasundaram handler = get_handler(default_handler_name); 589e9f9a9caSArun Kalyanasundaram if (!handler) 590e9f9a9caSArun Kalyanasundaram return; 591c0251485SPierre Tardy dict = PyDict_New(); 592c0251485SPierre Tardy if (!dict) 593c0251485SPierre Tardy Py_FatalError("couldn't create Python dict"); 594c0251485SPierre Tardy } 595e9f9a9caSArun Kalyanasundaram 596e9f9a9caSArun Kalyanasundaram t = PyTuple_New(MAX_FIELDS); 597e9f9a9caSArun Kalyanasundaram if (!t) 598e9f9a9caSArun Kalyanasundaram Py_FatalError("couldn't create Python tuple"); 599e9f9a9caSArun Kalyanasundaram 600e9f9a9caSArun Kalyanasundaram 601bd48c63eSArnaldo Carvalho de Melo s = nsecs / NSEC_PER_SEC; 602bd48c63eSArnaldo Carvalho de Melo ns = nsecs - s * NSEC_PER_SEC; 6037e4b21b8STom Zanussi 6047e4b21b8STom Zanussi scripting_context->event_data = data; 6052de9533dSTom Zanussi scripting_context->pevent = evsel->tp_format->pevent; 6067e4b21b8STom Zanussi 607*66dfdff0SJaroslav Škarvada context = _PyCapsule_New(scripting_context, NULL, NULL); 6087e4b21b8STom Zanussi 609*66dfdff0SJaroslav Škarvada PyTuple_SetItem(t, n++, _PyUnicode_FromString(handler_name)); 610fb7d0b3cSKyle McMartin PyTuple_SetItem(t, n++, context); 611c0251485SPierre Tardy 6120f5f5bcdSJoseph Schuchart /* ip unwinding */ 6130f5f5bcdSJoseph Schuchart callchain = python_process_callchain(sample, evsel, al); 614f38d2816SArun Kalyanasundaram /* Need an additional reference for the perf_sample dict */ 615f38d2816SArun Kalyanasundaram Py_INCREF(callchain); 6160f5f5bcdSJoseph Schuchart 617e9f9a9caSArun Kalyanasundaram if (!dict) { 618*66dfdff0SJaroslav Škarvada PyTuple_SetItem(t, n++, _PyLong_FromLong(cpu)); 619*66dfdff0SJaroslav Škarvada PyTuple_SetItem(t, n++, _PyLong_FromLong(s)); 620*66dfdff0SJaroslav Škarvada PyTuple_SetItem(t, n++, _PyLong_FromLong(ns)); 621*66dfdff0SJaroslav Škarvada PyTuple_SetItem(t, n++, _PyLong_FromLong(pid)); 622*66dfdff0SJaroslav Škarvada PyTuple_SetItem(t, n++, _PyUnicode_FromString(comm)); 6230f5f5bcdSJoseph Schuchart PyTuple_SetItem(t, n++, callchain); 624c0251485SPierre Tardy } else { 625*66dfdff0SJaroslav Škarvada pydict_set_item_string_decref(dict, "common_cpu", _PyLong_FromLong(cpu)); 626*66dfdff0SJaroslav Škarvada pydict_set_item_string_decref(dict, "common_s", _PyLong_FromLong(s)); 627*66dfdff0SJaroslav Škarvada pydict_set_item_string_decref(dict, "common_ns", _PyLong_FromLong(ns)); 628*66dfdff0SJaroslav Škarvada pydict_set_item_string_decref(dict, "common_pid", _PyLong_FromLong(pid)); 629*66dfdff0SJaroslav Škarvada pydict_set_item_string_decref(dict, "common_comm", _PyUnicode_FromString(comm)); 6300f5f5bcdSJoseph Schuchart pydict_set_item_string_decref(dict, "common_callchain", callchain); 631c0251485SPierre Tardy } 6327e4b21b8STom Zanussi for (field = event->format.fields; field; field = field->next) { 633249de6e0SJiri Olsa unsigned int offset, len; 634249de6e0SJiri Olsa unsigned long long val; 635249de6e0SJiri Olsa 636249de6e0SJiri Olsa if (field->flags & FIELD_IS_ARRAY) { 6377e4b21b8STom Zanussi offset = field->offset; 638249de6e0SJiri Olsa len = field->size; 639249de6e0SJiri Olsa if (field->flags & FIELD_IS_DYNAMIC) { 640249de6e0SJiri Olsa val = pevent_read_number(scripting_context->pevent, 641249de6e0SJiri Olsa data + offset, len); 642249de6e0SJiri Olsa offset = val; 643249de6e0SJiri Olsa len = offset >> 16; 644249de6e0SJiri Olsa offset &= 0xffff; 645249de6e0SJiri Olsa } 646249de6e0SJiri Olsa if (field->flags & FIELD_IS_STRING && 647249de6e0SJiri Olsa is_printable_array(data + offset, len)) { 648*66dfdff0SJaroslav Škarvada obj = _PyUnicode_FromString((char *) data + offset); 649249de6e0SJiri Olsa } else { 650249de6e0SJiri Olsa obj = PyByteArray_FromStringAndSize((const char *) data + offset, len); 651249de6e0SJiri Olsa field->flags &= ~FIELD_IS_STRING; 652249de6e0SJiri Olsa } 6537e4b21b8STom Zanussi } else { /* FIELD_IS_NUMERIC */ 65433058b94SSebastian Andrzej Siewior obj = get_field_numeric_entry(event, field, data); 6557e4b21b8STom Zanussi } 656e9f9a9caSArun Kalyanasundaram if (!dict) 657b1dcc03cSTom Zanussi PyTuple_SetItem(t, n++, obj); 658c0251485SPierre Tardy else 659c0268e8dSJoseph Schuchart pydict_set_item_string_decref(dict, field->name, obj); 660c0251485SPierre Tardy 6617e4b21b8STom Zanussi } 6620f5f5bcdSJoseph Schuchart 663e9f9a9caSArun Kalyanasundaram if (dict) 664c0251485SPierre Tardy PyTuple_SetItem(t, n++, dict); 6657e4b21b8STom Zanussi 666f38d2816SArun Kalyanasundaram if (get_argument_count(handler) == (int) n + 1) { 667f38d2816SArun Kalyanasundaram all_entries_dict = get_perf_sample_dict(sample, evsel, al, 668f38d2816SArun Kalyanasundaram callchain); 669f38d2816SArun Kalyanasundaram PyTuple_SetItem(t, n++, all_entries_dict); 670f38d2816SArun Kalyanasundaram } else { 671f38d2816SArun Kalyanasundaram Py_DECREF(callchain); 672f38d2816SArun Kalyanasundaram } 673f38d2816SArun Kalyanasundaram 6747e4b21b8STom Zanussi if (_PyTuple_Resize(&t, n) == -1) 6757e4b21b8STom Zanussi Py_FatalError("error resizing Python tuple"); 6767e4b21b8STom Zanussi 677e9f9a9caSArun Kalyanasundaram if (!dict) { 678a5563edfSAdrian Hunter call_object(handler, t, handler_name); 6797e4b21b8STom Zanussi } else { 680e9f9a9caSArun Kalyanasundaram call_object(handler, t, default_handler_name); 681c0251485SPierre Tardy Py_DECREF(dict); 6827e4b21b8STom Zanussi } 6837e4b21b8STom Zanussi 684f38d2816SArun Kalyanasundaram Py_XDECREF(all_entries_dict); 6857e4b21b8STom Zanussi Py_DECREF(t); 6867e4b21b8STom Zanussi } 6877e4b21b8STom Zanussi 688df919b40SAdrian Hunter static PyObject *tuple_new(unsigned int sz) 689df919b40SAdrian Hunter { 690df919b40SAdrian Hunter PyObject *t; 691df919b40SAdrian Hunter 692df919b40SAdrian Hunter t = PyTuple_New(sz); 693df919b40SAdrian Hunter if (!t) 694df919b40SAdrian Hunter Py_FatalError("couldn't create Python tuple"); 695df919b40SAdrian Hunter return t; 696df919b40SAdrian Hunter } 697df919b40SAdrian Hunter 698df919b40SAdrian Hunter static int tuple_set_u64(PyObject *t, unsigned int pos, u64 val) 699df919b40SAdrian Hunter { 700df919b40SAdrian Hunter #if BITS_PER_LONG == 64 701*66dfdff0SJaroslav Škarvada return PyTuple_SetItem(t, pos, _PyLong_FromLong(val)); 702df919b40SAdrian Hunter #endif 703df919b40SAdrian Hunter #if BITS_PER_LONG == 32 704df919b40SAdrian Hunter return PyTuple_SetItem(t, pos, PyLong_FromLongLong(val)); 705df919b40SAdrian Hunter #endif 706df919b40SAdrian Hunter } 707df919b40SAdrian Hunter 708df919b40SAdrian Hunter static int tuple_set_s32(PyObject *t, unsigned int pos, s32 val) 709df919b40SAdrian Hunter { 710*66dfdff0SJaroslav Škarvada return PyTuple_SetItem(t, pos, _PyLong_FromLong(val)); 711df919b40SAdrian Hunter } 712df919b40SAdrian Hunter 713df919b40SAdrian Hunter static int tuple_set_string(PyObject *t, unsigned int pos, const char *s) 714df919b40SAdrian Hunter { 715*66dfdff0SJaroslav Škarvada return PyTuple_SetItem(t, pos, _PyUnicode_FromString(s)); 716df919b40SAdrian Hunter } 717df919b40SAdrian Hunter 718df919b40SAdrian Hunter static int python_export_evsel(struct db_export *dbe, struct perf_evsel *evsel) 719df919b40SAdrian Hunter { 720df919b40SAdrian Hunter struct tables *tables = container_of(dbe, struct tables, dbe); 721df919b40SAdrian Hunter PyObject *t; 722df919b40SAdrian Hunter 723df919b40SAdrian Hunter t = tuple_new(2); 724df919b40SAdrian Hunter 725df919b40SAdrian Hunter tuple_set_u64(t, 0, evsel->db_id); 726df919b40SAdrian Hunter tuple_set_string(t, 1, perf_evsel__name(evsel)); 727df919b40SAdrian Hunter 728df919b40SAdrian Hunter call_object(tables->evsel_handler, t, "evsel_table"); 729df919b40SAdrian Hunter 730df919b40SAdrian Hunter Py_DECREF(t); 731df919b40SAdrian Hunter 732df919b40SAdrian Hunter return 0; 733df919b40SAdrian Hunter } 734df919b40SAdrian Hunter 735df919b40SAdrian Hunter static int python_export_machine(struct db_export *dbe, 736df919b40SAdrian Hunter struct machine *machine) 737df919b40SAdrian Hunter { 738df919b40SAdrian Hunter struct tables *tables = container_of(dbe, struct tables, dbe); 739df919b40SAdrian Hunter PyObject *t; 740df919b40SAdrian Hunter 741df919b40SAdrian Hunter t = tuple_new(3); 742df919b40SAdrian Hunter 743df919b40SAdrian Hunter tuple_set_u64(t, 0, machine->db_id); 744df919b40SAdrian Hunter tuple_set_s32(t, 1, machine->pid); 745df919b40SAdrian Hunter tuple_set_string(t, 2, machine->root_dir ? machine->root_dir : ""); 746df919b40SAdrian Hunter 747df919b40SAdrian Hunter call_object(tables->machine_handler, t, "machine_table"); 748df919b40SAdrian Hunter 749df919b40SAdrian Hunter Py_DECREF(t); 750df919b40SAdrian Hunter 751df919b40SAdrian Hunter return 0; 752df919b40SAdrian Hunter } 753df919b40SAdrian Hunter 754df919b40SAdrian Hunter static int python_export_thread(struct db_export *dbe, struct thread *thread, 755df919b40SAdrian Hunter u64 main_thread_db_id, struct machine *machine) 756df919b40SAdrian Hunter { 757df919b40SAdrian Hunter struct tables *tables = container_of(dbe, struct tables, dbe); 758df919b40SAdrian Hunter PyObject *t; 759df919b40SAdrian Hunter 760df919b40SAdrian Hunter t = tuple_new(5); 761df919b40SAdrian Hunter 762df919b40SAdrian Hunter tuple_set_u64(t, 0, thread->db_id); 763df919b40SAdrian Hunter tuple_set_u64(t, 1, machine->db_id); 764df919b40SAdrian Hunter tuple_set_u64(t, 2, main_thread_db_id); 765df919b40SAdrian Hunter tuple_set_s32(t, 3, thread->pid_); 766df919b40SAdrian Hunter tuple_set_s32(t, 4, thread->tid); 767df919b40SAdrian Hunter 768df919b40SAdrian Hunter call_object(tables->thread_handler, t, "thread_table"); 769df919b40SAdrian Hunter 770df919b40SAdrian Hunter Py_DECREF(t); 771df919b40SAdrian Hunter 772df919b40SAdrian Hunter return 0; 773df919b40SAdrian Hunter } 774df919b40SAdrian Hunter 775df919b40SAdrian Hunter static int python_export_comm(struct db_export *dbe, struct comm *comm) 776df919b40SAdrian Hunter { 777df919b40SAdrian Hunter struct tables *tables = container_of(dbe, struct tables, dbe); 778df919b40SAdrian Hunter PyObject *t; 779df919b40SAdrian Hunter 780df919b40SAdrian Hunter t = tuple_new(2); 781df919b40SAdrian Hunter 782df919b40SAdrian Hunter tuple_set_u64(t, 0, comm->db_id); 783df919b40SAdrian Hunter tuple_set_string(t, 1, comm__str(comm)); 784df919b40SAdrian Hunter 785df919b40SAdrian Hunter call_object(tables->comm_handler, t, "comm_table"); 786df919b40SAdrian Hunter 787df919b40SAdrian Hunter Py_DECREF(t); 788df919b40SAdrian Hunter 789df919b40SAdrian Hunter return 0; 790df919b40SAdrian Hunter } 791df919b40SAdrian Hunter 792df919b40SAdrian Hunter static int python_export_comm_thread(struct db_export *dbe, u64 db_id, 793df919b40SAdrian Hunter struct comm *comm, struct thread *thread) 794df919b40SAdrian Hunter { 795df919b40SAdrian Hunter struct tables *tables = container_of(dbe, struct tables, dbe); 796df919b40SAdrian Hunter PyObject *t; 797df919b40SAdrian Hunter 798df919b40SAdrian Hunter t = tuple_new(3); 799df919b40SAdrian Hunter 800df919b40SAdrian Hunter tuple_set_u64(t, 0, db_id); 801df919b40SAdrian Hunter tuple_set_u64(t, 1, comm->db_id); 802df919b40SAdrian Hunter tuple_set_u64(t, 2, thread->db_id); 803df919b40SAdrian Hunter 804df919b40SAdrian Hunter call_object(tables->comm_thread_handler, t, "comm_thread_table"); 805df919b40SAdrian Hunter 806df919b40SAdrian Hunter Py_DECREF(t); 807df919b40SAdrian Hunter 808df919b40SAdrian Hunter return 0; 809df919b40SAdrian Hunter } 810df919b40SAdrian Hunter 811df919b40SAdrian Hunter static int python_export_dso(struct db_export *dbe, struct dso *dso, 812df919b40SAdrian Hunter struct machine *machine) 813df919b40SAdrian Hunter { 814df919b40SAdrian Hunter struct tables *tables = container_of(dbe, struct tables, dbe); 815b5d8bbe8SMasami Hiramatsu char sbuild_id[SBUILD_ID_SIZE]; 816df919b40SAdrian Hunter PyObject *t; 817df919b40SAdrian Hunter 818df919b40SAdrian Hunter build_id__sprintf(dso->build_id, sizeof(dso->build_id), sbuild_id); 819df919b40SAdrian Hunter 820df919b40SAdrian Hunter t = tuple_new(5); 821df919b40SAdrian Hunter 822df919b40SAdrian Hunter tuple_set_u64(t, 0, dso->db_id); 823df919b40SAdrian Hunter tuple_set_u64(t, 1, machine->db_id); 824df919b40SAdrian Hunter tuple_set_string(t, 2, dso->short_name); 825df919b40SAdrian Hunter tuple_set_string(t, 3, dso->long_name); 826df919b40SAdrian Hunter tuple_set_string(t, 4, sbuild_id); 827df919b40SAdrian Hunter 828df919b40SAdrian Hunter call_object(tables->dso_handler, t, "dso_table"); 829df919b40SAdrian Hunter 830df919b40SAdrian Hunter Py_DECREF(t); 831df919b40SAdrian Hunter 832df919b40SAdrian Hunter return 0; 833df919b40SAdrian Hunter } 834df919b40SAdrian Hunter 835df919b40SAdrian Hunter static int python_export_symbol(struct db_export *dbe, struct symbol *sym, 836df919b40SAdrian Hunter struct dso *dso) 837df919b40SAdrian Hunter { 838df919b40SAdrian Hunter struct tables *tables = container_of(dbe, struct tables, dbe); 839df919b40SAdrian Hunter u64 *sym_db_id = symbol__priv(sym); 840df919b40SAdrian Hunter PyObject *t; 841df919b40SAdrian Hunter 842df919b40SAdrian Hunter t = tuple_new(6); 843df919b40SAdrian Hunter 844df919b40SAdrian Hunter tuple_set_u64(t, 0, *sym_db_id); 845df919b40SAdrian Hunter tuple_set_u64(t, 1, dso->db_id); 846df919b40SAdrian Hunter tuple_set_u64(t, 2, sym->start); 847df919b40SAdrian Hunter tuple_set_u64(t, 3, sym->end); 848df919b40SAdrian Hunter tuple_set_s32(t, 4, sym->binding); 849df919b40SAdrian Hunter tuple_set_string(t, 5, sym->name); 850df919b40SAdrian Hunter 851df919b40SAdrian Hunter call_object(tables->symbol_handler, t, "symbol_table"); 852df919b40SAdrian Hunter 853df919b40SAdrian Hunter Py_DECREF(t); 854df919b40SAdrian Hunter 855df919b40SAdrian Hunter return 0; 856df919b40SAdrian Hunter } 857df919b40SAdrian Hunter 858c29414f5SAdrian Hunter static int python_export_branch_type(struct db_export *dbe, u32 branch_type, 859c29414f5SAdrian Hunter const char *name) 860c29414f5SAdrian Hunter { 861c29414f5SAdrian Hunter struct tables *tables = container_of(dbe, struct tables, dbe); 862c29414f5SAdrian Hunter PyObject *t; 863c29414f5SAdrian Hunter 864c29414f5SAdrian Hunter t = tuple_new(2); 865c29414f5SAdrian Hunter 866c29414f5SAdrian Hunter tuple_set_s32(t, 0, branch_type); 867c29414f5SAdrian Hunter tuple_set_string(t, 1, name); 868c29414f5SAdrian Hunter 869c29414f5SAdrian Hunter call_object(tables->branch_type_handler, t, "branch_type_table"); 870c29414f5SAdrian Hunter 871c29414f5SAdrian Hunter Py_DECREF(t); 872c29414f5SAdrian Hunter 873c29414f5SAdrian Hunter return 0; 874c29414f5SAdrian Hunter } 875c29414f5SAdrian Hunter 876df919b40SAdrian Hunter static int python_export_sample(struct db_export *dbe, 877df919b40SAdrian Hunter struct export_sample *es) 878df919b40SAdrian Hunter { 879df919b40SAdrian Hunter struct tables *tables = container_of(dbe, struct tables, dbe); 880df919b40SAdrian Hunter PyObject *t; 881df919b40SAdrian Hunter 8822c15f5ebSChris Phlipot t = tuple_new(22); 883df919b40SAdrian Hunter 884df919b40SAdrian Hunter tuple_set_u64(t, 0, es->db_id); 885df919b40SAdrian Hunter tuple_set_u64(t, 1, es->evsel->db_id); 886df919b40SAdrian Hunter tuple_set_u64(t, 2, es->al->machine->db_id); 887b83e868dSArnaldo Carvalho de Melo tuple_set_u64(t, 3, es->al->thread->db_id); 888df919b40SAdrian Hunter tuple_set_u64(t, 4, es->comm_db_id); 889df919b40SAdrian Hunter tuple_set_u64(t, 5, es->dso_db_id); 890df919b40SAdrian Hunter tuple_set_u64(t, 6, es->sym_db_id); 891df919b40SAdrian Hunter tuple_set_u64(t, 7, es->offset); 892df919b40SAdrian Hunter tuple_set_u64(t, 8, es->sample->ip); 893df919b40SAdrian Hunter tuple_set_u64(t, 9, es->sample->time); 894df919b40SAdrian Hunter tuple_set_s32(t, 10, es->sample->cpu); 895df919b40SAdrian Hunter tuple_set_u64(t, 11, es->addr_dso_db_id); 896df919b40SAdrian Hunter tuple_set_u64(t, 12, es->addr_sym_db_id); 897df919b40SAdrian Hunter tuple_set_u64(t, 13, es->addr_offset); 898df919b40SAdrian Hunter tuple_set_u64(t, 14, es->sample->addr); 899df919b40SAdrian Hunter tuple_set_u64(t, 15, es->sample->period); 900df919b40SAdrian Hunter tuple_set_u64(t, 16, es->sample->weight); 901df919b40SAdrian Hunter tuple_set_u64(t, 17, es->sample->transaction); 902df919b40SAdrian Hunter tuple_set_u64(t, 18, es->sample->data_src); 903c29414f5SAdrian Hunter tuple_set_s32(t, 19, es->sample->flags & PERF_BRANCH_MASK); 904c29414f5SAdrian Hunter tuple_set_s32(t, 20, !!(es->sample->flags & PERF_IP_FLAG_IN_TX)); 9052c15f5ebSChris Phlipot tuple_set_u64(t, 21, es->call_path_id); 906df919b40SAdrian Hunter 907df919b40SAdrian Hunter call_object(tables->sample_handler, t, "sample_table"); 908df919b40SAdrian Hunter 909df919b40SAdrian Hunter Py_DECREF(t); 910df919b40SAdrian Hunter 911df919b40SAdrian Hunter return 0; 912df919b40SAdrian Hunter } 913df919b40SAdrian Hunter 9146a70307dSAdrian Hunter static int python_export_call_path(struct db_export *dbe, struct call_path *cp) 9156a70307dSAdrian Hunter { 9166a70307dSAdrian Hunter struct tables *tables = container_of(dbe, struct tables, dbe); 9176a70307dSAdrian Hunter PyObject *t; 9186a70307dSAdrian Hunter u64 parent_db_id, sym_db_id; 9196a70307dSAdrian Hunter 9206a70307dSAdrian Hunter parent_db_id = cp->parent ? cp->parent->db_id : 0; 9216a70307dSAdrian Hunter sym_db_id = cp->sym ? *(u64 *)symbol__priv(cp->sym) : 0; 9226a70307dSAdrian Hunter 9236a70307dSAdrian Hunter t = tuple_new(4); 9246a70307dSAdrian Hunter 9256a70307dSAdrian Hunter tuple_set_u64(t, 0, cp->db_id); 9266a70307dSAdrian Hunter tuple_set_u64(t, 1, parent_db_id); 9276a70307dSAdrian Hunter tuple_set_u64(t, 2, sym_db_id); 9286a70307dSAdrian Hunter tuple_set_u64(t, 3, cp->ip); 9296a70307dSAdrian Hunter 9306a70307dSAdrian Hunter call_object(tables->call_path_handler, t, "call_path_table"); 9316a70307dSAdrian Hunter 9326a70307dSAdrian Hunter Py_DECREF(t); 9336a70307dSAdrian Hunter 9346a70307dSAdrian Hunter return 0; 9356a70307dSAdrian Hunter } 9366a70307dSAdrian Hunter 9376a70307dSAdrian Hunter static int python_export_call_return(struct db_export *dbe, 9386a70307dSAdrian Hunter struct call_return *cr) 9396a70307dSAdrian Hunter { 9406a70307dSAdrian Hunter struct tables *tables = container_of(dbe, struct tables, dbe); 9416a70307dSAdrian Hunter u64 comm_db_id = cr->comm ? cr->comm->db_id : 0; 9426a70307dSAdrian Hunter PyObject *t; 9436a70307dSAdrian Hunter 9446a70307dSAdrian Hunter t = tuple_new(11); 9456a70307dSAdrian Hunter 9466a70307dSAdrian Hunter tuple_set_u64(t, 0, cr->db_id); 9476a70307dSAdrian Hunter tuple_set_u64(t, 1, cr->thread->db_id); 9486a70307dSAdrian Hunter tuple_set_u64(t, 2, comm_db_id); 9496a70307dSAdrian Hunter tuple_set_u64(t, 3, cr->cp->db_id); 9506a70307dSAdrian Hunter tuple_set_u64(t, 4, cr->call_time); 9516a70307dSAdrian Hunter tuple_set_u64(t, 5, cr->return_time); 9526a70307dSAdrian Hunter tuple_set_u64(t, 6, cr->branch_count); 9536a70307dSAdrian Hunter tuple_set_u64(t, 7, cr->call_ref); 9546a70307dSAdrian Hunter tuple_set_u64(t, 8, cr->return_ref); 9556a70307dSAdrian Hunter tuple_set_u64(t, 9, cr->cp->parent->db_id); 9566a70307dSAdrian Hunter tuple_set_s32(t, 10, cr->flags); 9576a70307dSAdrian Hunter 9586a70307dSAdrian Hunter call_object(tables->call_return_handler, t, "call_return_table"); 9596a70307dSAdrian Hunter 9606a70307dSAdrian Hunter Py_DECREF(t); 9616a70307dSAdrian Hunter 9626a70307dSAdrian Hunter return 0; 9636a70307dSAdrian Hunter } 9646a70307dSAdrian Hunter 9656a70307dSAdrian Hunter static int python_process_call_return(struct call_return *cr, void *data) 9666a70307dSAdrian Hunter { 9676a70307dSAdrian Hunter struct db_export *dbe = data; 9686a70307dSAdrian Hunter 9696a70307dSAdrian Hunter return db_export__call_return(dbe, cr); 9706a70307dSAdrian Hunter } 9716a70307dSAdrian Hunter 972b7fff6b5SArnaldo Carvalho de Melo static void python_process_general_event(struct perf_sample *sample, 9736a6daec2SFeng Tang struct perf_evsel *evsel, 97487b6a3adSFeng Tang struct addr_location *al) 9756a6daec2SFeng Tang { 976892e76b2SArun Kalyanasundaram PyObject *handler, *t, *dict, *callchain; 9776a6daec2SFeng Tang static char handler_name[64]; 9786a6daec2SFeng Tang unsigned n = 0; 9796a6daec2SFeng Tang 980e9f9a9caSArun Kalyanasundaram snprintf(handler_name, sizeof(handler_name), "%s", "process_event"); 981e9f9a9caSArun Kalyanasundaram 982e9f9a9caSArun Kalyanasundaram handler = get_handler(handler_name); 983e9f9a9caSArun Kalyanasundaram if (!handler) 984e9f9a9caSArun Kalyanasundaram return; 985e9f9a9caSArun Kalyanasundaram 986fd6b858aSFeng Tang /* 987fd6b858aSFeng Tang * Use the MAX_FIELDS to make the function expandable, though 98887b6a3adSFeng Tang * currently there is only one item for the tuple. 989fd6b858aSFeng Tang */ 9906a6daec2SFeng Tang t = PyTuple_New(MAX_FIELDS); 9916a6daec2SFeng Tang if (!t) 9926a6daec2SFeng Tang Py_FatalError("couldn't create Python tuple"); 9936a6daec2SFeng Tang 9940f5f5bcdSJoseph Schuchart /* ip unwinding */ 9950f5f5bcdSJoseph Schuchart callchain = python_process_callchain(sample, evsel, al); 996892e76b2SArun Kalyanasundaram dict = get_perf_sample_dict(sample, evsel, al, callchain); 9970f5f5bcdSJoseph Schuchart 998fd6b858aSFeng Tang PyTuple_SetItem(t, n++, dict); 9996a6daec2SFeng Tang if (_PyTuple_Resize(&t, n) == -1) 10006a6daec2SFeng Tang Py_FatalError("error resizing Python tuple"); 10016a6daec2SFeng Tang 1002a5563edfSAdrian Hunter call_object(handler, t, handler_name); 1003e9f9a9caSArun Kalyanasundaram 1004fd6b858aSFeng Tang Py_DECREF(dict); 10056a6daec2SFeng Tang Py_DECREF(t); 10066a6daec2SFeng Tang } 10076a6daec2SFeng Tang 1008df919b40SAdrian Hunter static void python_process_event(union perf_event *event, 10096a6daec2SFeng Tang struct perf_sample *sample, 10106a6daec2SFeng Tang struct perf_evsel *evsel, 101173994dc1SFeng Tang struct addr_location *al) 10126a6daec2SFeng Tang { 1013df919b40SAdrian Hunter struct tables *tables = &tables_global; 1014df919b40SAdrian Hunter 10156a6daec2SFeng Tang switch (evsel->attr.type) { 10166a6daec2SFeng Tang case PERF_TYPE_TRACEPOINT: 1017f9d5d549SArnaldo Carvalho de Melo python_process_tracepoint(sample, evsel, al); 10186a6daec2SFeng Tang break; 10196a6daec2SFeng Tang /* Reserve for future process_hw/sw/raw APIs */ 10206a6daec2SFeng Tang default: 1021df919b40SAdrian Hunter if (tables->db_export_mode) 10227327259dSArnaldo Carvalho de Melo db_export__sample(&tables->dbe, event, sample, evsel, al); 1023df919b40SAdrian Hunter else 1024f9d5d549SArnaldo Carvalho de Melo python_process_general_event(sample, evsel, al); 10256a6daec2SFeng Tang } 10266a6daec2SFeng Tang } 10276a6daec2SFeng Tang 1028aef90263SJiri Olsa static void get_handler_name(char *str, size_t size, 1029aef90263SJiri Olsa struct perf_evsel *evsel) 1030aef90263SJiri Olsa { 1031aef90263SJiri Olsa char *p = str; 1032aef90263SJiri Olsa 1033aef90263SJiri Olsa scnprintf(str, size, "stat__%s", perf_evsel__name(evsel)); 1034aef90263SJiri Olsa 1035aef90263SJiri Olsa while ((p = strchr(p, ':'))) { 1036aef90263SJiri Olsa *p = '_'; 1037aef90263SJiri Olsa p++; 1038aef90263SJiri Olsa } 1039aef90263SJiri Olsa } 1040aef90263SJiri Olsa 1041aef90263SJiri Olsa static void 1042aef90263SJiri Olsa process_stat(struct perf_evsel *counter, int cpu, int thread, u64 tstamp, 1043aef90263SJiri Olsa struct perf_counts_values *count) 1044aef90263SJiri Olsa { 1045aef90263SJiri Olsa PyObject *handler, *t; 1046aef90263SJiri Olsa static char handler_name[256]; 1047aef90263SJiri Olsa int n = 0; 1048aef90263SJiri Olsa 1049aef90263SJiri Olsa t = PyTuple_New(MAX_FIELDS); 1050aef90263SJiri Olsa if (!t) 1051aef90263SJiri Olsa Py_FatalError("couldn't create Python tuple"); 1052aef90263SJiri Olsa 1053aef90263SJiri Olsa get_handler_name(handler_name, sizeof(handler_name), 1054aef90263SJiri Olsa counter); 1055aef90263SJiri Olsa 1056aef90263SJiri Olsa handler = get_handler(handler_name); 1057aef90263SJiri Olsa if (!handler) { 1058aef90263SJiri Olsa pr_debug("can't find python handler %s\n", handler_name); 1059aef90263SJiri Olsa return; 1060aef90263SJiri Olsa } 1061aef90263SJiri Olsa 1062*66dfdff0SJaroslav Škarvada PyTuple_SetItem(t, n++, _PyLong_FromLong(cpu)); 1063*66dfdff0SJaroslav Škarvada PyTuple_SetItem(t, n++, _PyLong_FromLong(thread)); 1064aef90263SJiri Olsa 1065aef90263SJiri Olsa tuple_set_u64(t, n++, tstamp); 1066aef90263SJiri Olsa tuple_set_u64(t, n++, count->val); 1067aef90263SJiri Olsa tuple_set_u64(t, n++, count->ena); 1068aef90263SJiri Olsa tuple_set_u64(t, n++, count->run); 1069aef90263SJiri Olsa 1070aef90263SJiri Olsa if (_PyTuple_Resize(&t, n) == -1) 1071aef90263SJiri Olsa Py_FatalError("error resizing Python tuple"); 1072aef90263SJiri Olsa 1073aef90263SJiri Olsa call_object(handler, t, handler_name); 1074aef90263SJiri Olsa 1075aef90263SJiri Olsa Py_DECREF(t); 1076aef90263SJiri Olsa } 1077aef90263SJiri Olsa 1078aef90263SJiri Olsa static void python_process_stat(struct perf_stat_config *config, 1079aef90263SJiri Olsa struct perf_evsel *counter, u64 tstamp) 1080aef90263SJiri Olsa { 1081aef90263SJiri Olsa struct thread_map *threads = counter->threads; 1082aef90263SJiri Olsa struct cpu_map *cpus = counter->cpus; 1083aef90263SJiri Olsa int cpu, thread; 1084aef90263SJiri Olsa 1085aef90263SJiri Olsa if (config->aggr_mode == AGGR_GLOBAL) { 1086aef90263SJiri Olsa process_stat(counter, -1, -1, tstamp, 1087aef90263SJiri Olsa &counter->counts->aggr); 1088aef90263SJiri Olsa return; 1089aef90263SJiri Olsa } 1090aef90263SJiri Olsa 1091aef90263SJiri Olsa for (thread = 0; thread < threads->nr; thread++) { 1092aef90263SJiri Olsa for (cpu = 0; cpu < cpus->nr; cpu++) { 1093aef90263SJiri Olsa process_stat(counter, cpus->map[cpu], 1094aef90263SJiri Olsa thread_map__pid(threads, thread), tstamp, 1095aef90263SJiri Olsa perf_counts(counter->counts, cpu, thread)); 1096aef90263SJiri Olsa } 1097aef90263SJiri Olsa } 1098aef90263SJiri Olsa } 1099aef90263SJiri Olsa 1100aef90263SJiri Olsa static void python_process_stat_interval(u64 tstamp) 1101aef90263SJiri Olsa { 1102aef90263SJiri Olsa PyObject *handler, *t; 1103aef90263SJiri Olsa static const char handler_name[] = "stat__interval"; 1104aef90263SJiri Olsa int n = 0; 1105aef90263SJiri Olsa 1106aef90263SJiri Olsa t = PyTuple_New(MAX_FIELDS); 1107aef90263SJiri Olsa if (!t) 1108aef90263SJiri Olsa Py_FatalError("couldn't create Python tuple"); 1109aef90263SJiri Olsa 1110aef90263SJiri Olsa handler = get_handler(handler_name); 1111aef90263SJiri Olsa if (!handler) { 1112aef90263SJiri Olsa pr_debug("can't find python handler %s\n", handler_name); 1113aef90263SJiri Olsa return; 1114aef90263SJiri Olsa } 1115aef90263SJiri Olsa 1116aef90263SJiri Olsa tuple_set_u64(t, n++, tstamp); 1117aef90263SJiri Olsa 1118aef90263SJiri Olsa if (_PyTuple_Resize(&t, n) == -1) 1119aef90263SJiri Olsa Py_FatalError("error resizing Python tuple"); 1120aef90263SJiri Olsa 1121aef90263SJiri Olsa call_object(handler, t, handler_name); 1122aef90263SJiri Olsa 1123aef90263SJiri Olsa Py_DECREF(t); 1124aef90263SJiri Olsa } 1125aef90263SJiri Olsa 11267e4b21b8STom Zanussi static int run_start_sub(void) 11277e4b21b8STom Zanussi { 11287e4b21b8STom Zanussi main_module = PyImport_AddModule("__main__"); 11297e4b21b8STom Zanussi if (main_module == NULL) 11307e4b21b8STom Zanussi return -1; 11317e4b21b8STom Zanussi Py_INCREF(main_module); 11327e4b21b8STom Zanussi 11337e4b21b8STom Zanussi main_dict = PyModule_GetDict(main_module); 1134a5563edfSAdrian Hunter if (main_dict == NULL) 11357e4b21b8STom Zanussi goto error; 11367e4b21b8STom Zanussi Py_INCREF(main_dict); 11377e4b21b8STom Zanussi 1138a5563edfSAdrian Hunter try_call_object("trace_begin", NULL); 11397e4b21b8STom Zanussi 1140a5563edfSAdrian Hunter return 0; 11417e4b21b8STom Zanussi 11427e4b21b8STom Zanussi error: 11437e4b21b8STom Zanussi Py_XDECREF(main_dict); 11447e4b21b8STom Zanussi Py_XDECREF(main_module); 1145a5563edfSAdrian Hunter return -1; 11467e4b21b8STom Zanussi } 11477e4b21b8STom Zanussi 1148df919b40SAdrian Hunter #define SET_TABLE_HANDLER_(name, handler_name, table_name) do { \ 1149df919b40SAdrian Hunter tables->handler_name = get_handler(#table_name); \ 1150df919b40SAdrian Hunter if (tables->handler_name) \ 1151df919b40SAdrian Hunter tables->dbe.export_ ## name = python_export_ ## name; \ 1152df919b40SAdrian Hunter } while (0) 1153df919b40SAdrian Hunter 1154df919b40SAdrian Hunter #define SET_TABLE_HANDLER(name) \ 1155df919b40SAdrian Hunter SET_TABLE_HANDLER_(name, name ## _handler, name ## _table) 1156df919b40SAdrian Hunter 1157df919b40SAdrian Hunter static void set_table_handlers(struct tables *tables) 1158df919b40SAdrian Hunter { 1159df919b40SAdrian Hunter const char *perf_db_export_mode = "perf_db_export_mode"; 11606a70307dSAdrian Hunter const char *perf_db_export_calls = "perf_db_export_calls"; 11612c15f5ebSChris Phlipot const char *perf_db_export_callchains = "perf_db_export_callchains"; 11622c15f5ebSChris Phlipot PyObject *db_export_mode, *db_export_calls, *db_export_callchains; 11636a70307dSAdrian Hunter bool export_calls = false; 11642c15f5ebSChris Phlipot bool export_callchains = false; 1165df919b40SAdrian Hunter int ret; 1166df919b40SAdrian Hunter 1167df919b40SAdrian Hunter memset(tables, 0, sizeof(struct tables)); 1168df919b40SAdrian Hunter if (db_export__init(&tables->dbe)) 1169df919b40SAdrian Hunter Py_FatalError("failed to initialize export"); 1170df919b40SAdrian Hunter 1171df919b40SAdrian Hunter db_export_mode = PyDict_GetItemString(main_dict, perf_db_export_mode); 1172df919b40SAdrian Hunter if (!db_export_mode) 1173df919b40SAdrian Hunter return; 1174df919b40SAdrian Hunter 1175df919b40SAdrian Hunter ret = PyObject_IsTrue(db_export_mode); 1176df919b40SAdrian Hunter if (ret == -1) 1177df919b40SAdrian Hunter handler_call_die(perf_db_export_mode); 1178df919b40SAdrian Hunter if (!ret) 1179df919b40SAdrian Hunter return; 1180df919b40SAdrian Hunter 11812c15f5ebSChris Phlipot /* handle export calls */ 11826a70307dSAdrian Hunter tables->dbe.crp = NULL; 11836a70307dSAdrian Hunter db_export_calls = PyDict_GetItemString(main_dict, perf_db_export_calls); 11846a70307dSAdrian Hunter if (db_export_calls) { 11856a70307dSAdrian Hunter ret = PyObject_IsTrue(db_export_calls); 11866a70307dSAdrian Hunter if (ret == -1) 11876a70307dSAdrian Hunter handler_call_die(perf_db_export_calls); 11886a70307dSAdrian Hunter export_calls = !!ret; 11896a70307dSAdrian Hunter } 11906a70307dSAdrian Hunter 11916a70307dSAdrian Hunter if (export_calls) { 11926a70307dSAdrian Hunter tables->dbe.crp = 11936a70307dSAdrian Hunter call_return_processor__new(python_process_call_return, 11946a70307dSAdrian Hunter &tables->dbe); 11956a70307dSAdrian Hunter if (!tables->dbe.crp) 11966a70307dSAdrian Hunter Py_FatalError("failed to create calls processor"); 11976a70307dSAdrian Hunter } 11986a70307dSAdrian Hunter 11992c15f5ebSChris Phlipot /* handle export callchains */ 12002c15f5ebSChris Phlipot tables->dbe.cpr = NULL; 12012c15f5ebSChris Phlipot db_export_callchains = PyDict_GetItemString(main_dict, 12022c15f5ebSChris Phlipot perf_db_export_callchains); 12032c15f5ebSChris Phlipot if (db_export_callchains) { 12042c15f5ebSChris Phlipot ret = PyObject_IsTrue(db_export_callchains); 12052c15f5ebSChris Phlipot if (ret == -1) 12062c15f5ebSChris Phlipot handler_call_die(perf_db_export_callchains); 12072c15f5ebSChris Phlipot export_callchains = !!ret; 12082c15f5ebSChris Phlipot } 12092c15f5ebSChris Phlipot 12102c15f5ebSChris Phlipot if (export_callchains) { 12112c15f5ebSChris Phlipot /* 12122c15f5ebSChris Phlipot * Attempt to use the call path root from the call return 12132c15f5ebSChris Phlipot * processor, if the call return processor is in use. Otherwise, 12142c15f5ebSChris Phlipot * we allocate a new call path root. This prevents exporting 12152c15f5ebSChris Phlipot * duplicate call path ids when both are in use simultaniously. 12162c15f5ebSChris Phlipot */ 12172c15f5ebSChris Phlipot if (tables->dbe.crp) 12182c15f5ebSChris Phlipot tables->dbe.cpr = tables->dbe.crp->cpr; 12192c15f5ebSChris Phlipot else 12202c15f5ebSChris Phlipot tables->dbe.cpr = call_path_root__new(); 12212c15f5ebSChris Phlipot 12222c15f5ebSChris Phlipot if (!tables->dbe.cpr) 1223aff63340SChris Phlipot Py_FatalError("failed to create call path root"); 12242c15f5ebSChris Phlipot } 12252c15f5ebSChris Phlipot 1226df919b40SAdrian Hunter tables->db_export_mode = true; 1227df919b40SAdrian Hunter /* 1228df919b40SAdrian Hunter * Reserve per symbol space for symbol->db_id via symbol__priv() 1229df919b40SAdrian Hunter */ 1230df919b40SAdrian Hunter symbol_conf.priv_size = sizeof(u64); 1231df919b40SAdrian Hunter 1232df919b40SAdrian Hunter SET_TABLE_HANDLER(evsel); 1233df919b40SAdrian Hunter SET_TABLE_HANDLER(machine); 1234df919b40SAdrian Hunter SET_TABLE_HANDLER(thread); 1235df919b40SAdrian Hunter SET_TABLE_HANDLER(comm); 1236df919b40SAdrian Hunter SET_TABLE_HANDLER(comm_thread); 1237df919b40SAdrian Hunter SET_TABLE_HANDLER(dso); 1238df919b40SAdrian Hunter SET_TABLE_HANDLER(symbol); 1239c29414f5SAdrian Hunter SET_TABLE_HANDLER(branch_type); 1240df919b40SAdrian Hunter SET_TABLE_HANDLER(sample); 12416a70307dSAdrian Hunter SET_TABLE_HANDLER(call_path); 12426a70307dSAdrian Hunter SET_TABLE_HANDLER(call_return); 1243df919b40SAdrian Hunter } 1244df919b40SAdrian Hunter 1245*66dfdff0SJaroslav Škarvada #if PY_MAJOR_VERSION < 3 1246*66dfdff0SJaroslav Škarvada static void _free_command_line(const char **command_line, int num) 1247*66dfdff0SJaroslav Škarvada { 1248*66dfdff0SJaroslav Škarvada free(command_line); 1249*66dfdff0SJaroslav Škarvada } 1250*66dfdff0SJaroslav Škarvada #else 1251*66dfdff0SJaroslav Škarvada static void _free_command_line(wchar_t **command_line, int num) 1252*66dfdff0SJaroslav Škarvada { 1253*66dfdff0SJaroslav Škarvada int i; 1254*66dfdff0SJaroslav Škarvada for (i = 0; i < num; i++) 1255*66dfdff0SJaroslav Škarvada PyMem_RawFree(command_line[i]); 1256*66dfdff0SJaroslav Škarvada free(command_line); 1257*66dfdff0SJaroslav Škarvada } 1258*66dfdff0SJaroslav Škarvada #endif 1259*66dfdff0SJaroslav Škarvada 1260*66dfdff0SJaroslav Škarvada 12617e4b21b8STom Zanussi /* 12627e4b21b8STom Zanussi * Start trace script 12637e4b21b8STom Zanussi */ 12647e4b21b8STom Zanussi static int python_start_script(const char *script, int argc, const char **argv) 12657e4b21b8STom Zanussi { 1266df919b40SAdrian Hunter struct tables *tables = &tables_global; 1267*66dfdff0SJaroslav Škarvada #if PY_MAJOR_VERSION < 3 12687e4b21b8STom Zanussi const char **command_line; 1269*66dfdff0SJaroslav Škarvada #else 1270*66dfdff0SJaroslav Škarvada wchar_t **command_line; 1271*66dfdff0SJaroslav Škarvada #endif 12727e4b21b8STom Zanussi char buf[PATH_MAX]; 12737e4b21b8STom Zanussi int i, err = 0; 12747e4b21b8STom Zanussi FILE *fp; 12757e4b21b8STom Zanussi 1276*66dfdff0SJaroslav Škarvada #if PY_MAJOR_VERSION < 3 12777e4b21b8STom Zanussi command_line = malloc((argc + 1) * sizeof(const char *)); 12787e4b21b8STom Zanussi command_line[0] = script; 12797e4b21b8STom Zanussi for (i = 1; i < argc + 1; i++) 12807e4b21b8STom Zanussi command_line[i] = argv[i - 1]; 1281*66dfdff0SJaroslav Škarvada #else 1282*66dfdff0SJaroslav Škarvada command_line = malloc((argc + 1) * sizeof(wchar_t *)); 1283*66dfdff0SJaroslav Škarvada command_line[0] = Py_DecodeLocale(script, NULL); 1284*66dfdff0SJaroslav Škarvada for (i = 1; i < argc + 1; i++) 1285*66dfdff0SJaroslav Škarvada command_line[i] = Py_DecodeLocale(argv[i - 1], NULL); 1286*66dfdff0SJaroslav Škarvada #endif 12877e4b21b8STom Zanussi 12887e4b21b8STom Zanussi Py_Initialize(); 12897e4b21b8STom Zanussi 1290*66dfdff0SJaroslav Škarvada #if PY_MAJOR_VERSION < 3 12917e4b21b8STom Zanussi initperf_trace_context(); 12927e4b21b8STom Zanussi PySys_SetArgv(argc + 1, (char **)command_line); 1293*66dfdff0SJaroslav Škarvada #else 1294*66dfdff0SJaroslav Škarvada PyInit_perf_trace_context(); 1295*66dfdff0SJaroslav Škarvada PySys_SetArgv(argc + 1, command_line); 1296*66dfdff0SJaroslav Škarvada #endif 12977e4b21b8STom Zanussi 12987e4b21b8STom Zanussi fp = fopen(script, "r"); 12997e4b21b8STom Zanussi if (!fp) { 13007e4b21b8STom Zanussi sprintf(buf, "Can't open python script \"%s\"", script); 13017e4b21b8STom Zanussi perror(buf); 13027e4b21b8STom Zanussi err = -1; 13037e4b21b8STom Zanussi goto error; 13047e4b21b8STom Zanussi } 13057e4b21b8STom Zanussi 13067e4b21b8STom Zanussi err = PyRun_SimpleFile(fp, script); 13077e4b21b8STom Zanussi if (err) { 13087e4b21b8STom Zanussi fprintf(stderr, "Error running python script %s\n", script); 13097e4b21b8STom Zanussi goto error; 13107e4b21b8STom Zanussi } 13117e4b21b8STom Zanussi 13127e4b21b8STom Zanussi err = run_start_sub(); 13137e4b21b8STom Zanussi if (err) { 13147e4b21b8STom Zanussi fprintf(stderr, "Error starting python script %s\n", script); 13157e4b21b8STom Zanussi goto error; 13167e4b21b8STom Zanussi } 13177e4b21b8STom Zanussi 1318df919b40SAdrian Hunter set_table_handlers(tables); 1319df919b40SAdrian Hunter 1320c29414f5SAdrian Hunter if (tables->db_export_mode) { 1321c29414f5SAdrian Hunter err = db_export__branch_types(&tables->dbe); 1322c29414f5SAdrian Hunter if (err) 1323c29414f5SAdrian Hunter goto error; 1324c29414f5SAdrian Hunter } 1325c29414f5SAdrian Hunter 1326*66dfdff0SJaroslav Škarvada _free_command_line(command_line, argc + 1); 1327979ac257SColin Ian King 13287e4b21b8STom Zanussi return err; 13297e4b21b8STom Zanussi error: 13307e4b21b8STom Zanussi Py_Finalize(); 1331*66dfdff0SJaroslav Škarvada _free_command_line(command_line, argc + 1); 13327e4b21b8STom Zanussi 13337e4b21b8STom Zanussi return err; 13347e4b21b8STom Zanussi } 13357e4b21b8STom Zanussi 1336d445dd2aSAdrian Hunter static int python_flush_script(void) 1337d445dd2aSAdrian Hunter { 1338758008b2SAdrian Hunter struct tables *tables = &tables_global; 1339758008b2SAdrian Hunter 1340758008b2SAdrian Hunter return db_export__flush(&tables->dbe); 1341d445dd2aSAdrian Hunter } 1342d445dd2aSAdrian Hunter 13437e4b21b8STom Zanussi /* 13447e4b21b8STom Zanussi * Stop trace script 13457e4b21b8STom Zanussi */ 13467e4b21b8STom Zanussi static int python_stop_script(void) 13477e4b21b8STom Zanussi { 1348df919b40SAdrian Hunter struct tables *tables = &tables_global; 1349df919b40SAdrian Hunter 1350a5563edfSAdrian Hunter try_call_object("trace_end", NULL); 13517e4b21b8STom Zanussi 1352df919b40SAdrian Hunter db_export__exit(&tables->dbe); 1353df919b40SAdrian Hunter 13547e4b21b8STom Zanussi Py_XDECREF(main_dict); 13557e4b21b8STom Zanussi Py_XDECREF(main_module); 13567e4b21b8STom Zanussi Py_Finalize(); 13577e4b21b8STom Zanussi 1358a5563edfSAdrian Hunter return 0; 13597e4b21b8STom Zanussi } 13607e4b21b8STom Zanussi 1361da378962SArnaldo Carvalho de Melo static int python_generate_script(struct pevent *pevent, const char *outfile) 13627e4b21b8STom Zanussi { 1363aaf045f7SSteven Rostedt struct event_format *event = NULL; 13647e4b21b8STom Zanussi struct format_field *f; 13657e4b21b8STom Zanussi char fname[PATH_MAX]; 13667e4b21b8STom Zanussi int not_first, count; 13677e4b21b8STom Zanussi FILE *ofp; 13687e4b21b8STom Zanussi 13697e4b21b8STom Zanussi sprintf(fname, "%s.py", outfile); 13707e4b21b8STom Zanussi ofp = fopen(fname, "w"); 13717e4b21b8STom Zanussi if (ofp == NULL) { 13727e4b21b8STom Zanussi fprintf(stderr, "couldn't open %s\n", fname); 13737e4b21b8STom Zanussi return -1; 13747e4b21b8STom Zanussi } 1375133dc4c3SIngo Molnar fprintf(ofp, "# perf script event handlers, " 1376133dc4c3SIngo Molnar "generated by perf script -g python\n"); 13777e4b21b8STom Zanussi 13787e4b21b8STom Zanussi fprintf(ofp, "# Licensed under the terms of the GNU GPL" 13797e4b21b8STom Zanussi " License version 2\n\n"); 13807e4b21b8STom Zanussi 13817e4b21b8STom Zanussi fprintf(ofp, "# The common_* event handler fields are the most useful " 13827e4b21b8STom Zanussi "fields common to\n"); 13837e4b21b8STom Zanussi 13847e4b21b8STom Zanussi fprintf(ofp, "# all events. They don't necessarily correspond to " 13857e4b21b8STom Zanussi "the 'common_*' fields\n"); 13867e4b21b8STom Zanussi 13877e4b21b8STom Zanussi fprintf(ofp, "# in the format files. Those fields not available as " 13887e4b21b8STom Zanussi "handler params can\n"); 13897e4b21b8STom Zanussi 13907e4b21b8STom Zanussi fprintf(ofp, "# be retrieved using Python functions of the form " 13917e4b21b8STom Zanussi "common_*(context).\n"); 13927e4b21b8STom Zanussi 1393c76132dcSSeongJae Park fprintf(ofp, "# See the perf-script-python Documentation for the list " 13947e4b21b8STom Zanussi "of available functions.\n\n"); 13957e4b21b8STom Zanussi 13967e4b21b8STom Zanussi fprintf(ofp, "import os\n"); 13977e4b21b8STom Zanussi fprintf(ofp, "import sys\n\n"); 13987e4b21b8STom Zanussi 13997e4b21b8STom Zanussi fprintf(ofp, "sys.path.append(os.environ['PERF_EXEC_PATH'] + \\\n"); 14007e4b21b8STom Zanussi fprintf(ofp, "\t'/scripts/python/Perf-Trace-Util/lib/Perf/Trace')\n"); 14017e4b21b8STom Zanussi fprintf(ofp, "\nfrom perf_trace_context import *\n"); 14027e4b21b8STom Zanussi fprintf(ofp, "from Core import *\n\n\n"); 14037e4b21b8STom Zanussi 14047e4b21b8STom Zanussi fprintf(ofp, "def trace_begin():\n"); 14057e4b21b8STom Zanussi fprintf(ofp, "\tprint \"in trace_begin\"\n\n"); 14067e4b21b8STom Zanussi 14077e4b21b8STom Zanussi fprintf(ofp, "def trace_end():\n"); 14087e4b21b8STom Zanussi fprintf(ofp, "\tprint \"in trace_end\"\n\n"); 14097e4b21b8STom Zanussi 1410da378962SArnaldo Carvalho de Melo while ((event = trace_find_next_event(pevent, event))) { 14117e4b21b8STom Zanussi fprintf(ofp, "def %s__%s(", event->system, event->name); 14127e4b21b8STom Zanussi fprintf(ofp, "event_name, "); 14137e4b21b8STom Zanussi fprintf(ofp, "context, "); 14147e4b21b8STom Zanussi fprintf(ofp, "common_cpu,\n"); 14157e4b21b8STom Zanussi fprintf(ofp, "\tcommon_secs, "); 14167e4b21b8STom Zanussi fprintf(ofp, "common_nsecs, "); 14177e4b21b8STom Zanussi fprintf(ofp, "common_pid, "); 14187e4b21b8STom Zanussi fprintf(ofp, "common_comm,\n\t"); 14190f5f5bcdSJoseph Schuchart fprintf(ofp, "common_callchain, "); 14207e4b21b8STom Zanussi 14217e4b21b8STom Zanussi not_first = 0; 14227e4b21b8STom Zanussi count = 0; 14237e4b21b8STom Zanussi 14247e4b21b8STom Zanussi for (f = event->format.fields; f; f = f->next) { 14257e4b21b8STom Zanussi if (not_first++) 14267e4b21b8STom Zanussi fprintf(ofp, ", "); 14277e4b21b8STom Zanussi if (++count % 5 == 0) 14287e4b21b8STom Zanussi fprintf(ofp, "\n\t"); 14297e4b21b8STom Zanussi 14307e4b21b8STom Zanussi fprintf(ofp, "%s", f->name); 14317e4b21b8STom Zanussi } 1432a6418605SArun Kalyanasundaram if (not_first++) 1433a6418605SArun Kalyanasundaram fprintf(ofp, ", "); 1434a6418605SArun Kalyanasundaram if (++count % 5 == 0) 1435a6418605SArun Kalyanasundaram fprintf(ofp, "\n\t\t"); 1436a6418605SArun Kalyanasundaram fprintf(ofp, "perf_sample_dict"); 1437a6418605SArun Kalyanasundaram 14387e4b21b8STom Zanussi fprintf(ofp, "):\n"); 14397e4b21b8STom Zanussi 14407e4b21b8STom Zanussi fprintf(ofp, "\t\tprint_header(event_name, common_cpu, " 14417e4b21b8STom Zanussi "common_secs, common_nsecs,\n\t\t\t" 14427e4b21b8STom Zanussi "common_pid, common_comm)\n\n"); 14437e4b21b8STom Zanussi 14447e4b21b8STom Zanussi fprintf(ofp, "\t\tprint \""); 14457e4b21b8STom Zanussi 14467e4b21b8STom Zanussi not_first = 0; 14477e4b21b8STom Zanussi count = 0; 14487e4b21b8STom Zanussi 14497e4b21b8STom Zanussi for (f = event->format.fields; f; f = f->next) { 14507e4b21b8STom Zanussi if (not_first++) 14517e4b21b8STom Zanussi fprintf(ofp, ", "); 14527e4b21b8STom Zanussi if (count && count % 3 == 0) { 14537e4b21b8STom Zanussi fprintf(ofp, "\" \\\n\t\t\""); 14547e4b21b8STom Zanussi } 14557e4b21b8STom Zanussi count++; 14567e4b21b8STom Zanussi 14577e4b21b8STom Zanussi fprintf(ofp, "%s=", f->name); 14587e4b21b8STom Zanussi if (f->flags & FIELD_IS_STRING || 14597e4b21b8STom Zanussi f->flags & FIELD_IS_FLAG || 1460e646fe73SNamhyung Kim f->flags & FIELD_IS_ARRAY || 14617e4b21b8STom Zanussi f->flags & FIELD_IS_SYMBOLIC) 14627e4b21b8STom Zanussi fprintf(ofp, "%%s"); 14637e4b21b8STom Zanussi else if (f->flags & FIELD_IS_SIGNED) 14647e4b21b8STom Zanussi fprintf(ofp, "%%d"); 14657e4b21b8STom Zanussi else 14667e4b21b8STom Zanussi fprintf(ofp, "%%u"); 14677e4b21b8STom Zanussi } 14687e4b21b8STom Zanussi 14690f5f5bcdSJoseph Schuchart fprintf(ofp, "\" %% \\\n\t\t("); 14707e4b21b8STom Zanussi 14717e4b21b8STom Zanussi not_first = 0; 14727e4b21b8STom Zanussi count = 0; 14737e4b21b8STom Zanussi 14747e4b21b8STom Zanussi for (f = event->format.fields; f; f = f->next) { 14757e4b21b8STom Zanussi if (not_first++) 14767e4b21b8STom Zanussi fprintf(ofp, ", "); 14777e4b21b8STom Zanussi 14787e4b21b8STom Zanussi if (++count % 5 == 0) 14797e4b21b8STom Zanussi fprintf(ofp, "\n\t\t"); 14807e4b21b8STom Zanussi 14817e4b21b8STom Zanussi if (f->flags & FIELD_IS_FLAG) { 14827e4b21b8STom Zanussi if ((count - 1) % 5 != 0) { 14837e4b21b8STom Zanussi fprintf(ofp, "\n\t\t"); 14847e4b21b8STom Zanussi count = 4; 14857e4b21b8STom Zanussi } 14867e4b21b8STom Zanussi fprintf(ofp, "flag_str(\""); 14877e4b21b8STom Zanussi fprintf(ofp, "%s__%s\", ", event->system, 14887e4b21b8STom Zanussi event->name); 14897e4b21b8STom Zanussi fprintf(ofp, "\"%s\", %s)", f->name, 14907e4b21b8STom Zanussi f->name); 14917e4b21b8STom Zanussi } else if (f->flags & FIELD_IS_SYMBOLIC) { 14927e4b21b8STom Zanussi if ((count - 1) % 5 != 0) { 14937e4b21b8STom Zanussi fprintf(ofp, "\n\t\t"); 14947e4b21b8STom Zanussi count = 4; 14957e4b21b8STom Zanussi } 14967e4b21b8STom Zanussi fprintf(ofp, "symbol_str(\""); 14977e4b21b8STom Zanussi fprintf(ofp, "%s__%s\", ", event->system, 14987e4b21b8STom Zanussi event->name); 14997e4b21b8STom Zanussi fprintf(ofp, "\"%s\", %s)", f->name, 15007e4b21b8STom Zanussi f->name); 15017e4b21b8STom Zanussi } else 15027e4b21b8STom Zanussi fprintf(ofp, "%s", f->name); 15037e4b21b8STom Zanussi } 15047e4b21b8STom Zanussi 15050f5f5bcdSJoseph Schuchart fprintf(ofp, ")\n\n"); 15060f5f5bcdSJoseph Schuchart 1507a6418605SArun Kalyanasundaram fprintf(ofp, "\t\tprint 'Sample: {'+" 1508a6418605SArun Kalyanasundaram "get_dict_as_string(perf_sample_dict['sample'], ', ')+'}'\n\n"); 1509a6418605SArun Kalyanasundaram 15100f5f5bcdSJoseph Schuchart fprintf(ofp, "\t\tfor node in common_callchain:"); 15110f5f5bcdSJoseph Schuchart fprintf(ofp, "\n\t\t\tif 'sym' in node:"); 15120f5f5bcdSJoseph Schuchart fprintf(ofp, "\n\t\t\t\tprint \"\\t[%%x] %%s\" %% (node['ip'], node['sym']['name'])"); 15130f5f5bcdSJoseph Schuchart fprintf(ofp, "\n\t\t\telse:"); 15140f5f5bcdSJoseph Schuchart fprintf(ofp, "\n\t\t\t\tprint \"\t[%%x]\" %% (node['ip'])\n\n"); 15150f5f5bcdSJoseph Schuchart fprintf(ofp, "\t\tprint \"\\n\"\n\n"); 15160f5f5bcdSJoseph Schuchart 15177e4b21b8STom Zanussi } 15187e4b21b8STom Zanussi 15197e4b21b8STom Zanussi fprintf(ofp, "def trace_unhandled(event_name, context, " 1520a6418605SArun Kalyanasundaram "event_fields_dict, perf_sample_dict):\n"); 15217e4b21b8STom Zanussi 1522a6418605SArun Kalyanasundaram fprintf(ofp, "\t\tprint get_dict_as_string(event_fields_dict)\n"); 1523a6418605SArun Kalyanasundaram fprintf(ofp, "\t\tprint 'Sample: {'+" 1524a6418605SArun Kalyanasundaram "get_dict_as_string(perf_sample_dict['sample'], ', ')+'}'\n\n"); 15257e4b21b8STom Zanussi 15267e4b21b8STom Zanussi fprintf(ofp, "def print_header(" 15277e4b21b8STom Zanussi "event_name, cpu, secs, nsecs, pid, comm):\n" 15287e4b21b8STom Zanussi "\tprint \"%%-20s %%5u %%05u.%%09u %%8u %%-20s \" %% \\\n\t" 1529a6418605SArun Kalyanasundaram "(event_name, cpu, secs, nsecs, pid, comm),\n\n"); 1530a6418605SArun Kalyanasundaram 1531a6418605SArun Kalyanasundaram fprintf(ofp, "def get_dict_as_string(a_dict, delimiter=' '):\n" 1532a6418605SArun Kalyanasundaram "\treturn delimiter.join" 1533a6418605SArun Kalyanasundaram "(['%%s=%%s'%%(k,str(v))for k,v in sorted(a_dict.items())])\n"); 15347e4b21b8STom Zanussi 15357e4b21b8STom Zanussi fclose(ofp); 15367e4b21b8STom Zanussi 15377e4b21b8STom Zanussi fprintf(stderr, "generated Python script: %s\n", fname); 15387e4b21b8STom Zanussi 15397e4b21b8STom Zanussi return 0; 15407e4b21b8STom Zanussi } 15417e4b21b8STom Zanussi 15427e4b21b8STom Zanussi struct scripting_ops python_scripting_ops = { 15437e4b21b8STom Zanussi .name = "Python", 15447e4b21b8STom Zanussi .start_script = python_start_script, 1545d445dd2aSAdrian Hunter .flush_script = python_flush_script, 15467e4b21b8STom Zanussi .stop_script = python_stop_script, 15477e4b21b8STom Zanussi .process_event = python_process_event, 1548aef90263SJiri Olsa .process_stat = python_process_stat, 1549aef90263SJiri Olsa .process_stat_interval = python_process_stat_interval, 15507e4b21b8STom Zanussi .generate_script = python_generate_script, 15517e4b21b8STom Zanussi }; 1552