17e4b21b8STom Zanussi /*
27e4b21b8STom Zanussi * trace-event-python. Feed trace events to an embedded Python interpreter.
37e4b21b8STom Zanussi *
47e4b21b8STom Zanussi * Copyright (C) 2010 Tom Zanussi <tzanussi@gmail.com>
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>
3380c3a7d9SAdrian Hunter #ifdef HAVE_LIBTRACEEVENT
34378ef0f5SIan Rogers #include <traceevent/event-parse.h>
3580c3a7d9SAdrian Hunter #endif
367e4b21b8STom Zanussi
374a3cec84SArnaldo Carvalho de Melo #include "../build-id.h"
38430482c2SArnaldo Carvalho de Melo #include "../counts.h"
3984f5d36fSJiri Olsa #include "../debug.h"
404a3cec84SArnaldo Carvalho de Melo #include "../dso.h"
418f651eaeSArnaldo Carvalho de Melo #include "../callchain.h"
4283869019SGerman Gomez #include "../env.h"
43fcf65bf1SArnaldo Carvalho de Melo #include "../evsel.h"
44743eb868SArnaldo Carvalho de Melo #include "../event.h"
45743eb868SArnaldo Carvalho de Melo #include "../thread.h"
46df919b40SAdrian Hunter #include "../comm.h"
47df919b40SAdrian Hunter #include "../machine.h"
48df919b40SAdrian Hunter #include "../db-export.h"
496a70307dSAdrian Hunter #include "../thread-stack.h"
507e4b21b8STom Zanussi #include "../trace-event.h"
51451db126SChris Phlipot #include "../call-path.h"
521101f69aSArnaldo Carvalho de Melo #include "map.h"
53daecf9e0SArnaldo Carvalho de Melo #include "symbol.h"
54aef90263SJiri Olsa #include "thread_map.h"
55fea01392SArnaldo Carvalho de Melo #include "print_binary.h"
56aef90263SJiri Olsa #include "stat.h"
5748a1f565SJin Yao #include "mem-events.h"
5806bf28cbSArnaldo Carvalho de Melo #include "util/perf_regs.h"
597e4b21b8STom Zanussi
6066dfdff0SJaroslav Škarvada #if PY_MAJOR_VERSION < 3
6166dfdff0SJaroslav Škarvada #define _PyUnicode_FromString(arg) \
6266dfdff0SJaroslav Škarvada PyString_FromString(arg)
6366dfdff0SJaroslav Škarvada #define _PyUnicode_FromStringAndSize(arg1, arg2) \
6466dfdff0SJaroslav Škarvada PyString_FromStringAndSize((arg1), (arg2))
6566dfdff0SJaroslav Škarvada #define _PyBytes_FromStringAndSize(arg1, arg2) \
6666dfdff0SJaroslav Škarvada PyString_FromStringAndSize((arg1), (arg2))
6766dfdff0SJaroslav Škarvada #define _PyLong_FromLong(arg) \
6866dfdff0SJaroslav Škarvada PyInt_FromLong(arg)
6966dfdff0SJaroslav Škarvada #define _PyLong_AsLong(arg) \
7066dfdff0SJaroslav Škarvada PyInt_AsLong(arg)
7166dfdff0SJaroslav Škarvada #define _PyCapsule_New(arg1, arg2, arg3) \
7266dfdff0SJaroslav Škarvada PyCObject_FromVoidPtr((arg1), (arg2))
7366dfdff0SJaroslav Škarvada
747e4b21b8STom Zanussi PyMODINIT_FUNC initperf_trace_context(void);
7566dfdff0SJaroslav Škarvada #else
7666dfdff0SJaroslav Škarvada #define _PyUnicode_FromString(arg) \
7766dfdff0SJaroslav Škarvada PyUnicode_FromString(arg)
7866dfdff0SJaroslav Škarvada #define _PyUnicode_FromStringAndSize(arg1, arg2) \
7966dfdff0SJaroslav Škarvada PyUnicode_FromStringAndSize((arg1), (arg2))
8066dfdff0SJaroslav Škarvada #define _PyBytes_FromStringAndSize(arg1, arg2) \
8166dfdff0SJaroslav Škarvada PyBytes_FromStringAndSize((arg1), (arg2))
8266dfdff0SJaroslav Škarvada #define _PyLong_FromLong(arg) \
8366dfdff0SJaroslav Škarvada PyLong_FromLong(arg)
8466dfdff0SJaroslav Škarvada #define _PyLong_AsLong(arg) \
8566dfdff0SJaroslav Škarvada PyLong_AsLong(arg)
8666dfdff0SJaroslav Škarvada #define _PyCapsule_New(arg1, arg2, arg3) \
8766dfdff0SJaroslav Škarvada PyCapsule_New((arg1), (arg2), (arg3))
8866dfdff0SJaroslav Škarvada
8966dfdff0SJaroslav Škarvada PyMODINIT_FUNC PyInit_perf_trace_context(void);
9066dfdff0SJaroslav Škarvada #endif
917e4b21b8STom Zanussi
9280c3a7d9SAdrian Hunter #ifdef HAVE_LIBTRACEEVENT
93609a7404SSteven Rostedt (Red Hat) #define TRACE_EVENT_TYPE_MAX \
947e4b21b8STom Zanussi ((1 << (sizeof(unsigned short) * 8)) - 1)
957e4b21b8STom Zanussi
96609a7404SSteven Rostedt (Red Hat) #define N_COMMON_FIELDS 7
977e4b21b8STom Zanussi
987e4b21b8STom Zanussi static char *cur_field_name;
997e4b21b8STom Zanussi static int zero_flag_atom;
1007e4b21b8STom Zanussi #endif
1017e4b21b8STom Zanussi
10280c3a7d9SAdrian Hunter #define MAX_FIELDS 64
10380c3a7d9SAdrian Hunter
10480c3a7d9SAdrian Hunter extern struct scripting_context *scripting_context;
10580c3a7d9SAdrian Hunter
10680c3a7d9SAdrian Hunter static PyObject *main_module, *main_dict;
1077e4b21b8STom Zanussi
1087e4b21b8STom Zanussi struct tables {
1097e4b21b8STom Zanussi struct db_export dbe;
110df919b40SAdrian Hunter PyObject *evsel_handler;
111df919b40SAdrian Hunter PyObject *machine_handler;
112df919b40SAdrian Hunter PyObject *thread_handler;
113df919b40SAdrian Hunter PyObject *comm_handler;
114df919b40SAdrian Hunter PyObject *comm_thread_handler;
115df919b40SAdrian Hunter PyObject *dso_handler;
116df919b40SAdrian Hunter PyObject *symbol_handler;
117df919b40SAdrian Hunter PyObject *branch_type_handler;
118df919b40SAdrian Hunter PyObject *sample_handler;
119c29414f5SAdrian Hunter PyObject *call_path_handler;
120df919b40SAdrian Hunter PyObject *call_return_handler;
1216a70307dSAdrian Hunter PyObject *synth_handler;
1226a70307dSAdrian Hunter PyObject *context_switch_handler;
123b9322cabSAdrian Hunter bool db_export_mode;
124abde8722SAdrian Hunter };
125df919b40SAdrian Hunter
126df919b40SAdrian Hunter static struct tables tables_global;
127df919b40SAdrian Hunter
128df919b40SAdrian Hunter static void handler_call_die(const char *handler_name) __noreturn;
handler_call_die(const char * handler_name)129df919b40SAdrian Hunter static void handler_call_die(const char *handler_name)
1306c346643SArnaldo Carvalho de Melo {
1317e4b21b8STom Zanussi PyErr_Print();
1327e4b21b8STom Zanussi Py_FatalError("problem in Python trace event handler");
1337e4b21b8STom Zanussi // Py_FatalError does not return
1347e4b21b8STom Zanussi // but we have to make the compiler happy
13505f832e3SJoseph Schuchart abort();
13605f832e3SJoseph Schuchart }
13705f832e3SJoseph Schuchart
1387e4b21b8STom Zanussi /*
1397e4b21b8STom Zanussi * Insert val into the dictionary and decrement the reference counter.
140c0268e8dSJoseph Schuchart * This is necessary for dictionaries since PyDict_SetItemString() does not
1410029e8acSshaomin Deng * steal a reference, as opposed to PyTuple_SetItem().
142c0268e8dSJoseph Schuchart */
pydict_set_item_string_decref(PyObject * dict,const char * key,PyObject * val)143c0268e8dSJoseph Schuchart static void pydict_set_item_string_decref(PyObject *dict, const char *key, PyObject *val)
144c0268e8dSJoseph Schuchart {
145c0268e8dSJoseph Schuchart PyDict_SetItemString(dict, key, val);
146c0268e8dSJoseph Schuchart Py_DECREF(val);
147c0268e8dSJoseph Schuchart }
148c0268e8dSJoseph Schuchart
get_handler(const char * handler_name)149c0268e8dSJoseph Schuchart static PyObject *get_handler(const char *handler_name)
150c0268e8dSJoseph Schuchart {
151a5563edfSAdrian Hunter PyObject *handler;
152a5563edfSAdrian Hunter
153a5563edfSAdrian Hunter handler = PyDict_GetItemString(main_dict, handler_name);
154a5563edfSAdrian Hunter if (handler && !PyCallable_Check(handler))
155a5563edfSAdrian Hunter return NULL;
156a5563edfSAdrian Hunter return handler;
157a5563edfSAdrian Hunter }
158a5563edfSAdrian Hunter
call_object(PyObject * handler,PyObject * args,const char * die_msg)159a5563edfSAdrian Hunter static void call_object(PyObject *handler, PyObject *args, const char *die_msg)
160a5563edfSAdrian Hunter {
16180c3a7d9SAdrian Hunter PyObject *retval;
16280c3a7d9SAdrian Hunter
16380c3a7d9SAdrian Hunter retval = PyObject_CallObject(handler, args);
16480c3a7d9SAdrian Hunter if (retval == NULL)
16580c3a7d9SAdrian Hunter handler_call_die(die_msg);
16680c3a7d9SAdrian Hunter Py_DECREF(retval);
16780c3a7d9SAdrian Hunter }
16880c3a7d9SAdrian Hunter
try_call_object(const char * handler_name,PyObject * args)16980c3a7d9SAdrian Hunter static void try_call_object(const char *handler_name, PyObject *args)
17080c3a7d9SAdrian Hunter {
17180c3a7d9SAdrian Hunter PyObject *handler;
17280c3a7d9SAdrian Hunter
17380c3a7d9SAdrian Hunter handler = get_handler(handler_name);
17480c3a7d9SAdrian Hunter if (handler)
17580c3a7d9SAdrian Hunter call_object(handler, args, handler_name);
17680c3a7d9SAdrian Hunter }
17780c3a7d9SAdrian Hunter
17880c3a7d9SAdrian Hunter #ifdef HAVE_LIBTRACEEVENT
get_argument_count(PyObject * handler)17980c3a7d9SAdrian Hunter static int get_argument_count(PyObject *handler)
18080c3a7d9SAdrian Hunter {
181f38d2816SArun Kalyanasundaram int arg_count = 0;
182f38d2816SArun Kalyanasundaram
183f38d2816SArun Kalyanasundaram /*
184f38d2816SArun Kalyanasundaram * The attribute for the code object is func_code in Python 2,
185f38d2816SArun Kalyanasundaram * whereas it is __code__ in Python 3.0+.
186f38d2816SArun Kalyanasundaram */
187f38d2816SArun Kalyanasundaram PyObject *code_obj = PyObject_GetAttrString(handler,
188f38d2816SArun Kalyanasundaram "func_code");
189f38d2816SArun Kalyanasundaram if (PyErr_Occurred()) {
190f38d2816SArun Kalyanasundaram PyErr_Clear();
191f38d2816SArun Kalyanasundaram code_obj = PyObject_GetAttrString(handler,
192f38d2816SArun Kalyanasundaram "__code__");
193f38d2816SArun Kalyanasundaram }
194f38d2816SArun Kalyanasundaram PyErr_Clear();
195f38d2816SArun Kalyanasundaram if (code_obj) {
196f38d2816SArun Kalyanasundaram PyObject *arg_count_obj = PyObject_GetAttrString(code_obj,
197f38d2816SArun Kalyanasundaram "co_argcount");
198f38d2816SArun Kalyanasundaram if (arg_count_obj) {
199f38d2816SArun Kalyanasundaram arg_count = (int) _PyLong_AsLong(arg_count_obj);
200f38d2816SArun Kalyanasundaram Py_DECREF(arg_count_obj);
20166dfdff0SJaroslav Škarvada }
202f38d2816SArun Kalyanasundaram Py_DECREF(code_obj);
203f38d2816SArun Kalyanasundaram }
204f38d2816SArun Kalyanasundaram return arg_count;
205f38d2816SArun Kalyanasundaram }
206f38d2816SArun Kalyanasundaram
define_value(enum tep_print_arg_type field_type,const char * ev_name,const char * field_name,const char * field_value,const char * field_str)207f38d2816SArun Kalyanasundaram static void define_value(enum tep_print_arg_type field_type,
208f38d2816SArun Kalyanasundaram const char *ev_name,
2091e97216fSTzvetomir Stoyanov (VMware) const char *field_name,
2107e4b21b8STom Zanussi const char *field_value,
2117e4b21b8STom Zanussi const char *field_str)
2127e4b21b8STom Zanussi {
2137e4b21b8STom Zanussi const char *handler_name = "define_flag_value";
2147e4b21b8STom Zanussi PyObject *t;
2157e4b21b8STom Zanussi unsigned long long value;
216a5563edfSAdrian Hunter unsigned n = 0;
2177e4b21b8STom Zanussi
2187e4b21b8STom Zanussi if (field_type == TEP_PRINT_SYMBOL)
2197e4b21b8STom Zanussi handler_name = "define_symbolic_value";
2201e97216fSTzvetomir Stoyanov (VMware)
2217e4b21b8STom Zanussi t = PyTuple_New(4);
2227e4b21b8STom Zanussi if (!t)
22344ad9cd8STom Zanussi Py_FatalError("couldn't create Python tuple");
2247e4b21b8STom Zanussi
2257e4b21b8STom Zanussi value = eval_flag(field_value);
2267e4b21b8STom Zanussi
2277e4b21b8STom Zanussi PyTuple_SetItem(t, n++, _PyUnicode_FromString(ev_name));
2287e4b21b8STom Zanussi PyTuple_SetItem(t, n++, _PyUnicode_FromString(field_name));
22966dfdff0SJaroslav Škarvada PyTuple_SetItem(t, n++, _PyLong_FromLong(value));
23066dfdff0SJaroslav Škarvada PyTuple_SetItem(t, n++, _PyUnicode_FromString(field_str));
23166dfdff0SJaroslav Škarvada
23266dfdff0SJaroslav Škarvada try_call_object(handler_name, t);
2337e4b21b8STom Zanussi
234a5563edfSAdrian Hunter Py_DECREF(t);
2357e4b21b8STom Zanussi }
2367e4b21b8STom Zanussi
define_values(enum tep_print_arg_type field_type,struct tep_print_flag_sym * field,const char * ev_name,const char * field_name)2377e4b21b8STom Zanussi static void define_values(enum tep_print_arg_type field_type,
2387e4b21b8STom Zanussi struct tep_print_flag_sym *field,
2391e97216fSTzvetomir Stoyanov (VMware) const char *ev_name,
2405647f94bSTzvetomir Stoyanov (VMware) const char *field_name)
2417e4b21b8STom Zanussi {
2427e4b21b8STom Zanussi define_value(field_type, ev_name, field_name, field->value,
2437e4b21b8STom Zanussi field->str);
2447e4b21b8STom Zanussi
2457e4b21b8STom Zanussi if (field->next)
2467e4b21b8STom Zanussi define_values(field_type, field->next, ev_name, field_name);
2477e4b21b8STom Zanussi }
2487e4b21b8STom Zanussi
define_field(enum tep_print_arg_type field_type,const char * ev_name,const char * field_name,const char * delim)2497e4b21b8STom Zanussi static void define_field(enum tep_print_arg_type field_type,
2507e4b21b8STom Zanussi const char *ev_name,
2511e97216fSTzvetomir Stoyanov (VMware) const char *field_name,
2527e4b21b8STom Zanussi const char *delim)
2537e4b21b8STom Zanussi {
2547e4b21b8STom Zanussi const char *handler_name = "define_flag_field";
2557e4b21b8STom Zanussi PyObject *t;
2567e4b21b8STom Zanussi unsigned n = 0;
257a5563edfSAdrian Hunter
2587e4b21b8STom Zanussi if (field_type == TEP_PRINT_SYMBOL)
2597e4b21b8STom Zanussi handler_name = "define_symbolic_field";
2601e97216fSTzvetomir Stoyanov (VMware)
2617e4b21b8STom Zanussi if (field_type == TEP_PRINT_FLAGS)
2627e4b21b8STom Zanussi t = PyTuple_New(3);
2631e97216fSTzvetomir Stoyanov (VMware) else
26444ad9cd8STom Zanussi t = PyTuple_New(2);
26544ad9cd8STom Zanussi if (!t)
26644ad9cd8STom Zanussi Py_FatalError("couldn't create Python tuple");
2677e4b21b8STom Zanussi
2687e4b21b8STom Zanussi PyTuple_SetItem(t, n++, _PyUnicode_FromString(ev_name));
2697e4b21b8STom Zanussi PyTuple_SetItem(t, n++, _PyUnicode_FromString(field_name));
27066dfdff0SJaroslav Škarvada if (field_type == TEP_PRINT_FLAGS)
27166dfdff0SJaroslav Škarvada PyTuple_SetItem(t, n++, _PyUnicode_FromString(delim));
2721e97216fSTzvetomir Stoyanov (VMware)
27366dfdff0SJaroslav Škarvada try_call_object(handler_name, t);
2747e4b21b8STom Zanussi
275a5563edfSAdrian Hunter Py_DECREF(t);
2767e4b21b8STom Zanussi }
2777e4b21b8STom Zanussi
define_event_symbols(struct tep_event * event,const char * ev_name,struct tep_print_arg * args)2787e4b21b8STom Zanussi static void define_event_symbols(struct tep_event *event,
2797e4b21b8STom Zanussi const char *ev_name,
28097fbf3f0STzvetomir Stoyanov struct tep_print_arg *args)
2817e4b21b8STom Zanussi {
2825647f94bSTzvetomir Stoyanov (VMware) if (args == NULL)
2837e4b21b8STom Zanussi return;
2848579aca3STaeung Song
2858579aca3STaeung Song switch (args->type) {
2868579aca3STaeung Song case TEP_PRINT_NULL:
2877e4b21b8STom Zanussi break;
2881e97216fSTzvetomir Stoyanov (VMware) case TEP_PRINT_ATOM:
2897e4b21b8STom Zanussi define_value(TEP_PRINT_FLAGS, ev_name, cur_field_name, "0",
2901e97216fSTzvetomir Stoyanov (VMware) args->atom.atom);
2911e97216fSTzvetomir Stoyanov (VMware) zero_flag_atom = 0;
2927e4b21b8STom Zanussi break;
2937e4b21b8STom Zanussi case TEP_PRINT_FIELD:
2947e4b21b8STom Zanussi free(cur_field_name);
2951e97216fSTzvetomir Stoyanov (VMware) cur_field_name = strdup(args->field.name);
2967e4b21b8STom Zanussi break;
2977e4b21b8STom Zanussi case TEP_PRINT_FLAGS:
2987e4b21b8STom Zanussi define_event_symbols(event, ev_name, args->flags.field);
2991e97216fSTzvetomir Stoyanov (VMware) define_field(TEP_PRINT_FLAGS, ev_name, cur_field_name,
3007e4b21b8STom Zanussi args->flags.delim);
3011e97216fSTzvetomir Stoyanov (VMware) define_values(TEP_PRINT_FLAGS, args->flags.flags, ev_name,
3027e4b21b8STom Zanussi cur_field_name);
3031e97216fSTzvetomir Stoyanov (VMware) break;
3047e4b21b8STom Zanussi case TEP_PRINT_SYMBOL:
3057e4b21b8STom Zanussi define_event_symbols(event, ev_name, args->symbol.field);
3061e97216fSTzvetomir Stoyanov (VMware) define_field(TEP_PRINT_SYMBOL, ev_name, cur_field_name, NULL);
3077e4b21b8STom Zanussi define_values(TEP_PRINT_SYMBOL, args->symbol.symbols, ev_name,
3081e97216fSTzvetomir Stoyanov (VMware) cur_field_name);
3091e97216fSTzvetomir Stoyanov (VMware) break;
3107e4b21b8STom Zanussi case TEP_PRINT_HEX:
3117e4b21b8STom Zanussi case TEP_PRINT_HEX_STR:
3121e97216fSTzvetomir Stoyanov (VMware) define_event_symbols(event, ev_name, args->hex.field);
3131e97216fSTzvetomir Stoyanov (VMware) define_event_symbols(event, ev_name, args->hex.size);
314e080e6f1SNamhyung Kim break;
315e080e6f1SNamhyung Kim case TEP_PRINT_INT_ARRAY:
316e080e6f1SNamhyung Kim define_event_symbols(event, ev_name, args->int_array.field);
3171e97216fSTzvetomir Stoyanov (VMware) define_event_symbols(event, ev_name, args->int_array.count);
318b839e1e8SJavi Merino define_event_symbols(event, ev_name, args->int_array.el_size);
319b839e1e8SJavi Merino break;
320b839e1e8SJavi Merino case TEP_PRINT_STRING:
321b839e1e8SJavi Merino break;
3221e97216fSTzvetomir Stoyanov (VMware) case TEP_PRINT_TYPE:
3237e4b21b8STom Zanussi define_event_symbols(event, ev_name, args->typecast.item);
3241e97216fSTzvetomir Stoyanov (VMware) break;
3257e4b21b8STom Zanussi case TEP_PRINT_OP:
3267e4b21b8STom Zanussi if (strcmp(args->op.op, ":") == 0)
3271e97216fSTzvetomir Stoyanov (VMware) zero_flag_atom = 1;
3287e4b21b8STom Zanussi define_event_symbols(event, ev_name, args->op.left);
3297e4b21b8STom Zanussi define_event_symbols(event, ev_name, args->op.right);
3307e4b21b8STom Zanussi break;
3317e4b21b8STom Zanussi default:
3327e4b21b8STom Zanussi /* gcc warns for these? */
3337e4b21b8STom Zanussi case TEP_PRINT_BSTRING:
334aaf045f7SSteven Rostedt case TEP_PRINT_DYNAMIC_ARRAY:
3351e97216fSTzvetomir Stoyanov (VMware) case TEP_PRINT_DYNAMIC_ARRAY_LEN:
3361e97216fSTzvetomir Stoyanov (VMware) case TEP_PRINT_FUNC:
3371e97216fSTzvetomir Stoyanov (VMware) case TEP_PRINT_BITMASK:
3381e97216fSTzvetomir Stoyanov (VMware) /* we should warn... */
3391e97216fSTzvetomir Stoyanov (VMware) return;
3407e4b21b8STom Zanussi }
3417e4b21b8STom Zanussi
3427e4b21b8STom Zanussi if (args->next)
3437e4b21b8STom Zanussi define_event_symbols(event, ev_name, args->next);
3447e4b21b8STom Zanussi }
3457e4b21b8STom Zanussi
get_field_numeric_entry(struct tep_event * event,struct tep_format_field * field,void * data)3467e4b21b8STom Zanussi static PyObject *get_field_numeric_entry(struct tep_event *event,
3477e4b21b8STom Zanussi struct tep_format_field *field, void *data)
34897fbf3f0STzvetomir Stoyanov {
3492c92f982STzvetomir Stoyanov (VMware) bool is_array = field->flags & TEP_FIELD_IS_ARRAY;
35033058b94SSebastian Andrzej Siewior PyObject *obj = NULL, *list = NULL;
351bb39ccb2STzvetomir Stoyanov (VMware) unsigned long long val;
35239f54862SArnaldo Carvalho de Melo unsigned int item_size, n_items, i;
35333058b94SSebastian Andrzej Siewior
3548ac631cdSSebastian Andrzej Siewior if (is_array) {
35533058b94SSebastian Andrzej Siewior list = PyList_New(field->arraylen);
3568ac631cdSSebastian Andrzej Siewior item_size = field->size / field->arraylen;
3578ac631cdSSebastian Andrzej Siewior n_items = field->arraylen;
3588ac631cdSSebastian Andrzej Siewior } else {
3598ac631cdSSebastian Andrzej Siewior item_size = field->size;
3608ac631cdSSebastian Andrzej Siewior n_items = 1;
3618ac631cdSSebastian Andrzej Siewior }
3628ac631cdSSebastian Andrzej Siewior
3638ac631cdSSebastian Andrzej Siewior for (i = 0; i < n_items; i++) {
3648ac631cdSSebastian Andrzej Siewior
3658ac631cdSSebastian Andrzej Siewior val = read_size(event, data + field->offset + i * item_size,
3668ac631cdSSebastian Andrzej Siewior item_size);
3678ac631cdSSebastian Andrzej Siewior if (field->flags & TEP_FIELD_IS_SIGNED) {
3688ac631cdSSebastian Andrzej Siewior if ((long long)val >= LONG_MIN &&
369bb39ccb2STzvetomir Stoyanov (VMware) (long long)val <= LONG_MAX)
37033058b94SSebastian Andrzej Siewior obj = _PyLong_FromLong(val);
37133058b94SSebastian Andrzej Siewior else
37266dfdff0SJaroslav Škarvada obj = PyLong_FromLongLong(val);
37333058b94SSebastian Andrzej Siewior } else {
37433058b94SSebastian Andrzej Siewior if (val <= LONG_MAX)
37533058b94SSebastian Andrzej Siewior obj = _PyLong_FromLong(val);
37633058b94SSebastian Andrzej Siewior else
37766dfdff0SJaroslav Škarvada obj = PyLong_FromUnsignedLongLong(val);
37833058b94SSebastian Andrzej Siewior }
37933058b94SSebastian Andrzej Siewior if (is_array)
38033058b94SSebastian Andrzej Siewior PyList_SET_ITEM(list, i, obj);
3818ac631cdSSebastian Andrzej Siewior }
3828ac631cdSSebastian Andrzej Siewior if (is_array)
3838ac631cdSSebastian Andrzej Siewior obj = list;
3848ac631cdSSebastian Andrzej Siewior return obj;
3858ac631cdSSebastian Andrzej Siewior }
38633058b94SSebastian Andrzej Siewior #endif
38733058b94SSebastian Andrzej Siewior
get_dsoname(struct map * map)38880c3a7d9SAdrian Hunter static const char *get_dsoname(struct map *map)
38933058b94SSebastian Andrzej Siewior {
3905f9e0f31SJin Yao const char *dsoname = "[unknown]";
3915f9e0f31SJin Yao struct dso *dso = map ? map__dso(map) : NULL;
3925f9e0f31SJin Yao
39363df0e4bSIan Rogers if (dso) {
3945f9e0f31SJin Yao if (symbol_conf.show_kernel_path && dso->long_name)
39563df0e4bSIan Rogers dsoname = dso->long_name;
39663df0e4bSIan Rogers else
39763df0e4bSIan Rogers dsoname = dso->name;
3985f9e0f31SJin Yao }
39963df0e4bSIan Rogers
4005f9e0f31SJin Yao return dsoname;
4015f9e0f31SJin Yao }
4025f9e0f31SJin Yao
get_offset(struct symbol * sym,struct addr_location * al)4035f9e0f31SJin Yao static unsigned long get_offset(struct symbol *sym, struct addr_location *al)
4040f5f5bcdSJoseph Schuchart {
405ae24e9b5SEelco Chaudron unsigned long offset;
406ae24e9b5SEelco Chaudron
407ae24e9b5SEelco Chaudron if (al->addr < sym->end)
408ae24e9b5SEelco Chaudron offset = al->addr - sym->start;
409ae24e9b5SEelco Chaudron else
410ae24e9b5SEelco Chaudron offset = al->addr - map__start(al->map) - sym->start;
411ae24e9b5SEelco Chaudron
412e5116f46SIan Rogers return offset;
413ae24e9b5SEelco Chaudron }
414ae24e9b5SEelco Chaudron
python_process_callchain(struct perf_sample * sample,struct evsel * evsel,struct addr_location * al)415ae24e9b5SEelco Chaudron static PyObject *python_process_callchain(struct perf_sample *sample,
416ae24e9b5SEelco Chaudron struct evsel *evsel,
4170f5f5bcdSJoseph Schuchart struct addr_location *al)
41832dcd021SJiri Olsa {
4190f5f5bcdSJoseph Schuchart PyObject *pylist;
4200f5f5bcdSJoseph Schuchart struct callchain_cursor *cursor;
4210f5f5bcdSJoseph Schuchart
4220f5f5bcdSJoseph Schuchart pylist = PyList_New(0);
4230f5f5bcdSJoseph Schuchart if (!pylist)
4240f5f5bcdSJoseph Schuchart Py_FatalError("couldn't create Python list");
4250f5f5bcdSJoseph Schuchart
4260f5f5bcdSJoseph Schuchart if (!symbol_conf.use_callchain || !sample->callchain)
4270f5f5bcdSJoseph Schuchart goto exit;
4280f5f5bcdSJoseph Schuchart
4290f5f5bcdSJoseph Schuchart cursor = get_tls_callchain_cursor();
43091d7b2deSArnaldo Carvalho de Melo if (thread__resolve_callchain(al->thread, cursor, evsel,
4310f5f5bcdSJoseph Schuchart sample, NULL, NULL,
43244cbe729SAdrian Hunter scripting_max_stack) != 0) {
4330f5f5bcdSJoseph Schuchart pr_err("Failed to resolve callchain. Skipping\n");
4340f5f5bcdSJoseph Schuchart goto exit;
4350f5f5bcdSJoseph Schuchart }
4360f5f5bcdSJoseph Schuchart callchain_cursor_commit(cursor);
4370f5f5bcdSJoseph Schuchart
4380f5f5bcdSJoseph Schuchart
4390f5f5bcdSJoseph Schuchart while (1) {
4400f5f5bcdSJoseph Schuchart PyObject *pyelem;
4410f5f5bcdSJoseph Schuchart struct callchain_cursor_node *node;
4420f5f5bcdSJoseph Schuchart node = callchain_cursor_current(cursor);
4430f5f5bcdSJoseph Schuchart if (!node)
4440f5f5bcdSJoseph Schuchart break;
4450f5f5bcdSJoseph Schuchart
4460f5f5bcdSJoseph Schuchart pyelem = PyDict_New();
4470f5f5bcdSJoseph Schuchart if (!pyelem)
4480f5f5bcdSJoseph Schuchart Py_FatalError("couldn't create Python dictionary");
4490f5f5bcdSJoseph Schuchart
4500f5f5bcdSJoseph Schuchart
4510f5f5bcdSJoseph Schuchart pydict_set_item_string_decref(pyelem, "ip",
4520f5f5bcdSJoseph Schuchart PyLong_FromUnsignedLongLong(node->ip));
4530f5f5bcdSJoseph Schuchart
4545f0fef8aSArnaldo Carvalho de Melo if (node->ms.sym) {
4550f5f5bcdSJoseph Schuchart PyObject *pysym = PyDict_New();
4560f5f5bcdSJoseph Schuchart if (!pysym)
4570f5f5bcdSJoseph Schuchart Py_FatalError("couldn't create Python dictionary");
4580f5f5bcdSJoseph Schuchart pydict_set_item_string_decref(pysym, "start",
4595f0fef8aSArnaldo Carvalho de Melo PyLong_FromUnsignedLongLong(node->ms.sym->start));
4600f5f5bcdSJoseph Schuchart pydict_set_item_string_decref(pysym, "end",
4615f0fef8aSArnaldo Carvalho de Melo PyLong_FromUnsignedLongLong(node->ms.sym->end));
4620f5f5bcdSJoseph Schuchart pydict_set_item_string_decref(pysym, "binding",
4635f0fef8aSArnaldo Carvalho de Melo _PyLong_FromLong(node->ms.sym->binding));
4640f5f5bcdSJoseph Schuchart pydict_set_item_string_decref(pysym, "name",
4655f0fef8aSArnaldo Carvalho de Melo _PyUnicode_FromStringAndSize(node->ms.sym->name,
4665f0fef8aSArnaldo Carvalho de Melo node->ms.sym->namelen));
4670f5f5bcdSJoseph Schuchart pydict_set_item_string_decref(pyelem, "sym", pysym);
468ae24e9b5SEelco Chaudron
469ae24e9b5SEelco Chaudron if (node->ms.map) {
470ae24e9b5SEelco Chaudron struct map *map = node->ms.map;
471ae24e9b5SEelco Chaudron struct addr_location node_al;
472ae24e9b5SEelco Chaudron unsigned long offset;
473ae24e9b5SEelco Chaudron
474*78a1f7cdSIan Rogers addr_location__init(&node_al);
475ae24e9b5SEelco Chaudron node_al.addr = map__map_ip(map, node->ip);
476ae24e9b5SEelco Chaudron node_al.map = map__get(map);
477ae24e9b5SEelco Chaudron offset = get_offset(node->ms.sym, &node_al);
478ae24e9b5SEelco Chaudron addr_location__exit(&node_al);
479ae24e9b5SEelco Chaudron
480ae24e9b5SEelco Chaudron pydict_set_item_string_decref(
481ae24e9b5SEelco Chaudron pyelem, "sym_off",
482ae24e9b5SEelco Chaudron PyLong_FromUnsignedLongLong(offset));
483ae24e9b5SEelco Chaudron }
484ae24e9b5SEelco Chaudron if (node->srcline && strcmp(":0", node->srcline)) {
485ae24e9b5SEelco Chaudron pydict_set_item_string_decref(
486ae24e9b5SEelco Chaudron pyelem, "sym_srcline",
4870f5f5bcdSJoseph Schuchart _PyUnicode_FromString(node->srcline));
4880f5f5bcdSJoseph Schuchart }
4895f0fef8aSArnaldo Carvalho de Melo }
4905f0fef8aSArnaldo Carvalho de Melo
4915f9e0f31SJin Yao if (node->ms.map) {
4920f5f5bcdSJoseph Schuchart const char *dsoname = get_dsoname(node->ms.map);
49366dfdff0SJaroslav Škarvada
4940f5f5bcdSJoseph Schuchart pydict_set_item_string_decref(pyelem, "dso",
4950f5f5bcdSJoseph Schuchart _PyUnicode_FromString(dsoname));
4960f5f5bcdSJoseph Schuchart }
4970f5f5bcdSJoseph Schuchart
4980f5f5bcdSJoseph Schuchart callchain_cursor_advance(cursor);
4990f5f5bcdSJoseph Schuchart PyList_Append(pylist, pyelem);
5000f5f5bcdSJoseph Schuchart Py_DECREF(pyelem);
5010f5f5bcdSJoseph Schuchart }
5020f5f5bcdSJoseph Schuchart
5030f5f5bcdSJoseph Schuchart exit:
5040f5f5bcdSJoseph Schuchart return pylist;
50548a1f565SJin Yao }
50648a1f565SJin Yao
python_process_brstack(struct perf_sample * sample,struct thread * thread)50748a1f565SJin Yao static PyObject *python_process_brstack(struct perf_sample *sample,
50848a1f565SJin Yao struct thread *thread)
50942bbabedSKan Liang {
51048a1f565SJin Yao struct branch_stack *br = sample->branch_stack;
51148a1f565SJin Yao struct branch_entry *entries = perf_sample__branch_entries(sample);
51248a1f565SJin Yao PyObject *pylist;
51348a1f565SJin Yao u64 i;
51448a1f565SJin Yao
51548a1f565SJin Yao pylist = PyList_New(0);
51648a1f565SJin Yao if (!pylist)
51748a1f565SJin Yao Py_FatalError("couldn't create Python list");
51848a1f565SJin Yao
51948a1f565SJin Yao if (!(br && br->nr))
52048a1f565SJin Yao goto exit;
52148a1f565SJin Yao
52248a1f565SJin Yao for (i = 0; i < br->nr; i++) {
52348a1f565SJin Yao PyObject *pyelem;
52448a1f565SJin Yao struct addr_location al;
52548a1f565SJin Yao const char *dsoname;
52648a1f565SJin Yao
52748a1f565SJin Yao pyelem = PyDict_New();
52848a1f565SJin Yao if (!pyelem)
52948a1f565SJin Yao Py_FatalError("couldn't create Python dictionary");
53042bbabedSKan Liang
53148a1f565SJin Yao pydict_set_item_string_decref(pyelem, "from",
53242bbabedSKan Liang PyLong_FromUnsignedLongLong(entries[i].from));
53348a1f565SJin Yao pydict_set_item_string_decref(pyelem, "to",
53442bbabedSKan Liang PyLong_FromUnsignedLongLong(entries[i].to));
53548a1f565SJin Yao pydict_set_item_string_decref(pyelem, "mispred",
53642bbabedSKan Liang PyBool_FromLong(entries[i].flags.mispred));
53748a1f565SJin Yao pydict_set_item_string_decref(pyelem, "predicted",
53842bbabedSKan Liang PyBool_FromLong(entries[i].flags.predicted));
53948a1f565SJin Yao pydict_set_item_string_decref(pyelem, "in_tx",
54042bbabedSKan Liang PyBool_FromLong(entries[i].flags.in_tx));
54148a1f565SJin Yao pydict_set_item_string_decref(pyelem, "abort",
54242bbabedSKan Liang PyBool_FromLong(entries[i].flags.abort));
54348a1f565SJin Yao pydict_set_item_string_decref(pyelem, "cycles",
544692d0e63SAdrian Hunter PyLong_FromUnsignedLongLong(entries[i].flags.cycles));
54542bbabedSKan Liang
54648a1f565SJin Yao addr_location__init(&al);
54748a1f565SJin Yao thread__find_map_fb(thread, sample->cpumode,
54848a1f565SJin Yao entries[i].from, &al);
54948a1f565SJin Yao dsoname = get_dsoname(al.map);
550692d0e63SAdrian Hunter pydict_set_item_string_decref(pyelem, "from_dsoname",
55142bbabedSKan Liang _PyUnicode_FromString(dsoname));
55248a1f565SJin Yao
55348a1f565SJin Yao thread__find_map_fb(thread, sample->cpumode,
55448a1f565SJin Yao entries[i].to, &al);
55548a1f565SJin Yao dsoname = get_dsoname(al.map);
55648a1f565SJin Yao pydict_set_item_string_decref(pyelem, "to_dsoname",
55748a1f565SJin Yao _PyUnicode_FromString(dsoname));
55848a1f565SJin Yao
55948a1f565SJin Yao addr_location__exit(&al);
56048a1f565SJin Yao PyList_Append(pylist, pyelem);
56148a1f565SJin Yao Py_DECREF(pyelem);
56248a1f565SJin Yao }
56348a1f565SJin Yao
56448a1f565SJin Yao exit:
56548a1f565SJin Yao return pylist;
56648a1f565SJin Yao }
56748a1f565SJin Yao
get_symoff(struct symbol * sym,struct addr_location * al,bool print_off,char * bf,int size)56848a1f565SJin Yao static int get_symoff(struct symbol *sym, struct addr_location *al,
56948a1f565SJin Yao bool print_off, char *bf, int size)
57048a1f565SJin Yao {
57148a1f565SJin Yao unsigned long offset;
57248a1f565SJin Yao
57348a1f565SJin Yao if (!sym || !sym->name[0])
57448a1f565SJin Yao return scnprintf(bf, size, "%s", "[unknown]");
57548a1f565SJin Yao
57648a1f565SJin Yao if (!print_off)
57748a1f565SJin Yao return scnprintf(bf, size, "%s", sym->name);
57848a1f565SJin Yao
57948a1f565SJin Yao offset = get_offset(sym, al);
58048a1f565SJin Yao
58148a1f565SJin Yao return scnprintf(bf, size, "%s+0x%x", sym->name, offset);
58248a1f565SJin Yao }
58348a1f565SJin Yao
get_br_mspred(struct branch_flags * flags,char * bf,int size)58448a1f565SJin Yao static int get_br_mspred(struct branch_flags *flags, char *bf, int size)
58548a1f565SJin Yao {
58648a1f565SJin Yao if (!flags->mispred && !flags->predicted)
58748a1f565SJin Yao return scnprintf(bf, size, "%s", "-");
58848a1f565SJin Yao
58948a1f565SJin Yao if (flags->mispred)
59048a1f565SJin Yao return scnprintf(bf, size, "%s", "M");
59148a1f565SJin Yao
59248a1f565SJin Yao return scnprintf(bf, size, "%s", "P");
59348a1f565SJin Yao }
59448a1f565SJin Yao
python_process_brstacksym(struct perf_sample * sample,struct thread * thread)59542bbabedSKan Liang static PyObject *python_process_brstacksym(struct perf_sample *sample,
59648a1f565SJin Yao struct thread *thread)
59748a1f565SJin Yao {
59848a1f565SJin Yao struct branch_stack *br = sample->branch_stack;
59948a1f565SJin Yao struct branch_entry *entries = perf_sample__branch_entries(sample);
60048a1f565SJin Yao PyObject *pylist;
60148a1f565SJin Yao u64 i;
60248a1f565SJin Yao char bf[512];
60348a1f565SJin Yao
60448a1f565SJin Yao pylist = PyList_New(0);
60548a1f565SJin Yao if (!pylist)
60648a1f565SJin Yao Py_FatalError("couldn't create Python list");
60748a1f565SJin Yao
60848a1f565SJin Yao if (!(br && br->nr))
60948a1f565SJin Yao goto exit;
61048a1f565SJin Yao
61148a1f565SJin Yao for (i = 0; i < br->nr; i++) {
61248a1f565SJin Yao PyObject *pyelem;
61348a1f565SJin Yao struct addr_location al;
61448a1f565SJin Yao
615692d0e63SAdrian Hunter addr_location__init(&al);
61642bbabedSKan Liang pyelem = PyDict_New();
61748a1f565SJin Yao if (!pyelem)
61848a1f565SJin Yao Py_FatalError("couldn't create Python dictionary");
61948a1f565SJin Yao
62048a1f565SJin Yao thread__find_symbol_fb(thread, sample->cpumode,
621692d0e63SAdrian Hunter entries[i].from, &al);
62242bbabedSKan Liang get_symoff(al.sym, &al, true, bf, sizeof(bf));
62348a1f565SJin Yao pydict_set_item_string_decref(pyelem, "from",
62448a1f565SJin Yao _PyUnicode_FromString(bf));
62548a1f565SJin Yao
62648a1f565SJin Yao thread__find_symbol_fb(thread, sample->cpumode,
62742bbabedSKan Liang entries[i].to, &al);
62848a1f565SJin Yao get_symoff(al.sym, &al, true, bf, sizeof(bf));
62948a1f565SJin Yao pydict_set_item_string_decref(pyelem, "to",
63048a1f565SJin Yao _PyUnicode_FromString(bf));
63142bbabedSKan Liang
63248a1f565SJin Yao get_br_mspred(&entries[i].flags, bf, sizeof(bf));
63348a1f565SJin Yao pydict_set_item_string_decref(pyelem, "pred",
63448a1f565SJin Yao _PyUnicode_FromString(bf));
63548a1f565SJin Yao
63648a1f565SJin Yao if (entries[i].flags.in_tx) {
63748a1f565SJin Yao pydict_set_item_string_decref(pyelem, "in_tx",
63848a1f565SJin Yao _PyUnicode_FromString("X"));
63942bbabedSKan Liang } else {
64048a1f565SJin Yao pydict_set_item_string_decref(pyelem, "in_tx",
64148a1f565SJin Yao _PyUnicode_FromString("-"));
64248a1f565SJin Yao }
64348a1f565SJin Yao
64448a1f565SJin Yao if (entries[i].flags.abort) {
64548a1f565SJin Yao pydict_set_item_string_decref(pyelem, "abort",
64648a1f565SJin Yao _PyUnicode_FromString("A"));
64748a1f565SJin Yao } else {
64848a1f565SJin Yao pydict_set_item_string_decref(pyelem, "abort",
64948a1f565SJin Yao _PyUnicode_FromString("-"));
65048a1f565SJin Yao }
65148a1f565SJin Yao
65248a1f565SJin Yao PyList_Append(pylist, pyelem);
65348a1f565SJin Yao Py_DECREF(pyelem);
65448a1f565SJin Yao addr_location__exit(&al);
655f52679b7SNamhyung Kim }
656f52679b7SNamhyung Kim
65774ec14f3SArun Kalyanasundaram exit:
65874ec14f3SArun Kalyanasundaram return pylist;
65974ec14f3SArun Kalyanasundaram }
660f52679b7SNamhyung Kim
get_sample_value_as_tuple(struct sample_read_value * value,u64 read_format)66174ec14f3SArun Kalyanasundaram static PyObject *get_sample_value_as_tuple(struct sample_read_value *value,
66274ec14f3SArun Kalyanasundaram u64 read_format)
66374ec14f3SArun Kalyanasundaram {
66474ec14f3SArun Kalyanasundaram PyObject *t;
665f52679b7SNamhyung Kim
666f52679b7SNamhyung Kim t = PyTuple_New(3);
667f52679b7SNamhyung Kim if (!t)
66874ec14f3SArun Kalyanasundaram Py_FatalError("couldn't create Python tuple");
66974ec14f3SArun Kalyanasundaram PyTuple_SetItem(t, 0, PyLong_FromUnsignedLongLong(value->id));
67074ec14f3SArun Kalyanasundaram PyTuple_SetItem(t, 1, PyLong_FromUnsignedLongLong(value->value));
67174ec14f3SArun Kalyanasundaram if (read_format & PERF_FORMAT_LOST)
67274ec14f3SArun Kalyanasundaram PyTuple_SetItem(t, 2, PyLong_FromUnsignedLongLong(value->lost));
67332dcd021SJiri Olsa
67474ec14f3SArun Kalyanasundaram return t;
6751fc632ceSJiri Olsa }
67674ec14f3SArun Kalyanasundaram
set_sample_read_in_dict(PyObject * dict_sample,struct perf_sample * sample,struct evsel * evsel)67774ec14f3SArun Kalyanasundaram static void set_sample_read_in_dict(PyObject *dict_sample,
67874ec14f3SArun Kalyanasundaram struct perf_sample *sample,
67974ec14f3SArun Kalyanasundaram struct evsel *evsel)
68074ec14f3SArun Kalyanasundaram {
68174ec14f3SArun Kalyanasundaram u64 read_format = evsel->core.attr.read_format;
68274ec14f3SArun Kalyanasundaram PyObject *values;
68374ec14f3SArun Kalyanasundaram unsigned int i;
68474ec14f3SArun Kalyanasundaram
68574ec14f3SArun Kalyanasundaram if (read_format & PERF_FORMAT_TOTAL_TIME_ENABLED) {
68674ec14f3SArun Kalyanasundaram pydict_set_item_string_decref(dict_sample, "time_enabled",
68774ec14f3SArun Kalyanasundaram PyLong_FromUnsignedLongLong(sample->read.time_enabled));
68874ec14f3SArun Kalyanasundaram }
68974ec14f3SArun Kalyanasundaram
69074ec14f3SArun Kalyanasundaram if (read_format & PERF_FORMAT_TOTAL_TIME_RUNNING) {
69174ec14f3SArun Kalyanasundaram pydict_set_item_string_decref(dict_sample, "time_running",
69274ec14f3SArun Kalyanasundaram PyLong_FromUnsignedLongLong(sample->read.time_running));
69374ec14f3SArun Kalyanasundaram }
69474ec14f3SArun Kalyanasundaram
69574ec14f3SArun Kalyanasundaram if (read_format & PERF_FORMAT_GROUP)
69674ec14f3SArun Kalyanasundaram values = PyList_New(sample->read.group.nr);
69774ec14f3SArun Kalyanasundaram else
698f52679b7SNamhyung Kim values = PyList_New(1);
699f52679b7SNamhyung Kim
700f52679b7SNamhyung Kim if (!values)
701f52679b7SNamhyung Kim Py_FatalError("couldn't create Python list");
702f52679b7SNamhyung Kim
70374ec14f3SArun Kalyanasundaram if (read_format & PERF_FORMAT_GROUP) {
704f52679b7SNamhyung Kim struct sample_read_value *v = sample->read.group.values;
70574ec14f3SArun Kalyanasundaram
70674ec14f3SArun Kalyanasundaram i = 0;
707f52679b7SNamhyung Kim sample_read_group__for_each(v, sample->read.group.nr, read_format) {
708f52679b7SNamhyung Kim PyObject *t = get_sample_value_as_tuple(v, read_format);
70974ec14f3SArun Kalyanasundaram PyList_SET_ITEM(values, i, t);
71074ec14f3SArun Kalyanasundaram i++;
71174ec14f3SArun Kalyanasundaram }
71274ec14f3SArun Kalyanasundaram } else {
71374ec14f3SArun Kalyanasundaram PyObject *t = get_sample_value_as_tuple(&sample->read.one,
71448a1f565SJin Yao read_format);
71548a1f565SJin Yao PyList_SET_ITEM(values, 0, t);
71648a1f565SJin Yao }
71748a1f565SJin Yao pydict_set_item_string_decref(dict_sample, "values", values);
71848a1f565SJin Yao }
71948a1f565SJin Yao
set_sample_datasrc_in_dict(PyObject * dict,struct perf_sample * sample)72048a1f565SJin Yao static void set_sample_datasrc_in_dict(PyObject *dict,
72148a1f565SJin Yao struct perf_sample *sample)
72248a1f565SJin Yao {
72348a1f565SJin Yao struct mem_info mi = { .data_src.val = sample->data_src };
72448a1f565SJin Yao char decode[100];
72548a1f565SJin Yao
72648a1f565SJin Yao pydict_set_item_string_decref(dict, "datasrc",
72748a1f565SJin Yao PyLong_FromUnsignedLongLong(sample->data_src));
72848a1f565SJin Yao
72983869019SGerman Gomez perf_script__meminfo_scnprintf(decode, 100, &mi);
73048a1f565SJin Yao
73148a1f565SJin Yao pydict_set_item_string_decref(dict, "datasrc_decode",
73248a1f565SJin Yao _PyUnicode_FromString(decode));
73348a1f565SJin Yao }
73448a1f565SJin Yao
regs_map(struct regs_dump * regs,uint64_t mask,const char * arch,char * bf,int size)73548a1f565SJin Yao static void regs_map(struct regs_dump *regs, uint64_t mask, const char *arch, char *bf, int size)
7361a4025f0SAndreas Gerstmayr {
737dea8cfccSKajol Jain unsigned int i = 0, r;
7381a4025f0SAndreas Gerstmayr int printed = 0;
73948a1f565SJin Yao
74048a1f565SJin Yao bf[0] = 0;
74148a1f565SJin Yao
74248a1f565SJin Yao if (size <= 0)
74348a1f565SJin Yao return;
74483869019SGerman Gomez
74548a1f565SJin Yao if (!regs || !regs->regs)
74648a1f565SJin Yao return;
74748a1f565SJin Yao
74848a1f565SJin Yao for_each_set_bit(r, (unsigned long *) &mask, sizeof(mask) * 8) {
74948a1f565SJin Yao u64 val = regs->regs[i++];
75032dcd021SJiri Olsa
75148a1f565SJin Yao printed += scnprintf(bf + printed, size - printed,
7521fc632ceSJiri Olsa "%5s:0x%" PRIx64 " ",
75383869019SGerman Gomez perf_reg_name(r, arch), val);
754dea8cfccSKajol Jain }
755dea8cfccSKajol Jain }
756dea8cfccSKajol Jain
set_regs_in_dict(PyObject * dict,struct perf_sample * sample,struct evsel * evsel)757dea8cfccSKajol Jain static void set_regs_in_dict(PyObject *dict,
758dea8cfccSKajol Jain struct perf_sample *sample,
759dea8cfccSKajol Jain struct evsel *evsel)
760dea8cfccSKajol Jain {
761dea8cfccSKajol Jain struct perf_event_attr *attr = &evsel->core.attr;
762dea8cfccSKajol Jain const char *arch = perf_env__arch(evsel__env(evsel));
763dea8cfccSKajol Jain
76448a1f565SJin Yao /*
76583869019SGerman Gomez * Here value 28 is a constant size which can be used to print
76648a1f565SJin Yao * one register value and its corresponds to:
76748a1f565SJin Yao * 16 chars is to specify 64 bit register in hexadecimal.
76848a1f565SJin Yao * 2 chars is for appending "0x" to the hexadecimal value and
76948a1f565SJin Yao * 10 chars is for register name.
77083869019SGerman Gomez */
77148a1f565SJin Yao int size = __sw_hweight64(attr->sample_regs_intr) * 28;
77248a1f565SJin Yao char *bf = malloc(size);
77348a1f565SJin Yao
77448a1f565SJin Yao regs_map(&sample->intr_regs, attr->sample_regs_intr, arch, bf, size);
77548a1f565SJin Yao
7768271b509SAdrian Hunter pydict_set_item_string_decref(dict, "iregs",
777c4f46223SLeo Yan _PyUnicode_FromString(bf));
778c4f46223SLeo Yan
779c4f46223SLeo Yan regs_map(&sample->user_regs, attr->sample_regs_user, arch, bf, size);
7808271b509SAdrian Hunter
781c4f46223SLeo Yan pydict_set_item_string_decref(dict, "uregs",
782c4f46223SLeo Yan _PyUnicode_FromString(bf));
7838271b509SAdrian Hunter free(bf);
78463df0e4bSIan Rogers }
78563df0e4bSIan Rogers
set_sym_in_dict(PyObject * dict,struct addr_location * al,const char * dso_field,const char * dso_bid_field,const char * dso_map_start,const char * dso_map_end,const char * sym_field,const char * symoff_field)78663df0e4bSIan Rogers static void set_sym_in_dict(PyObject *dict, struct addr_location *al,
78763df0e4bSIan Rogers const char *dso_field, const char *dso_bid_field,
788c4f46223SLeo Yan const char *dso_map_start, const char *dso_map_end,
789c4f46223SLeo Yan const char *sym_field, const char *symoff_field)
790c4f46223SLeo Yan {
791e5116f46SIan Rogers char sbuild_id[SBUILD_ID_SIZE];
792c4f46223SLeo Yan
793e5116f46SIan Rogers if (al->map) {
7948271b509SAdrian Hunter struct dso *dso = map__dso(al->map);
7958271b509SAdrian Hunter
7968271b509SAdrian Hunter pydict_set_item_string_decref(dict, dso_field, _PyUnicode_FromString(dso->name));
7978271b509SAdrian Hunter build_id__sprintf(&dso->bid, sbuild_id);
7988271b509SAdrian Hunter pydict_set_item_string_decref(dict, dso_bid_field,
7998271b509SAdrian Hunter _PyUnicode_FromString(sbuild_id));
8008271b509SAdrian Hunter pydict_set_item_string_decref(dict, dso_map_start,
8018271b509SAdrian Hunter PyLong_FromUnsignedLong(map__start(al->map)));
8028271b509SAdrian Hunter pydict_set_item_string_decref(dict, dso_map_end,
803bee272afSAdrian Hunter PyLong_FromUnsignedLong(map__end(al->map)));
804bee272afSAdrian Hunter }
805bee272afSAdrian Hunter if (al->sym) {
806bee272afSAdrian Hunter pydict_set_item_string_decref(dict, sym_field,
807bee272afSAdrian Hunter _PyUnicode_FromString(al->sym->name));
808bee272afSAdrian Hunter pydict_set_item_string_decref(dict, symoff_field,
809bee272afSAdrian Hunter PyLong_FromUnsignedLong(get_offset(al->sym, al)));
810bee272afSAdrian Hunter }
811bee272afSAdrian Hunter }
812bee272afSAdrian Hunter
set_sample_flags(PyObject * dict,u32 flags)813bee272afSAdrian Hunter static void set_sample_flags(PyObject *dict, u32 flags)
814bee272afSAdrian Hunter {
815bee272afSAdrian Hunter const char *ch = PERF_IP_FLAG_CHARS;
816bee272afSAdrian Hunter char *p, str[33];
817bee272afSAdrian Hunter
818bee272afSAdrian Hunter for (p = str; *ch; ch++, flags >>= 1) {
819bee272afSAdrian Hunter if (flags & 1)
820bee272afSAdrian Hunter *p++ = *ch;
821bee272afSAdrian Hunter }
822bee272afSAdrian Hunter *p = 0;
823bee272afSAdrian Hunter pydict_set_item_string_decref(dict, "flags", _PyUnicode_FromString(str));
824bee272afSAdrian Hunter }
825bee272afSAdrian Hunter
python_process_sample_flags(struct perf_sample * sample,PyObject * dict_sample)826892e76b2SArun Kalyanasundaram static void python_process_sample_flags(struct perf_sample *sample, PyObject *dict_sample)
82732dcd021SJiri Olsa {
828892e76b2SArun Kalyanasundaram char flags_disp[SAMPLE_FLAGS_BUF_SIZE];
8293f8e009eSAdrian Hunter
830892e76b2SArun Kalyanasundaram set_sample_flags(dict_sample, sample->flags);
831892e76b2SArun Kalyanasundaram perf_sample__sprintf_flags(sample->flags, flags_disp, sizeof(flags_disp));
83248a1f565SJin Yao pydict_set_item_string_decref(dict_sample, "flags_disp",
833892e76b2SArun Kalyanasundaram _PyUnicode_FromString(flags_disp));
834892e76b2SArun Kalyanasundaram }
835892e76b2SArun Kalyanasundaram
get_perf_sample_dict(struct perf_sample * sample,struct evsel * evsel,struct addr_location * al,struct addr_location * addr_al,PyObject * callchain)836892e76b2SArun Kalyanasundaram static PyObject *get_perf_sample_dict(struct perf_sample *sample,
837892e76b2SArun Kalyanasundaram struct evsel *evsel,
838892e76b2SArun Kalyanasundaram struct addr_location *al,
839892e76b2SArun Kalyanasundaram struct addr_location *addr_al,
840892e76b2SArun Kalyanasundaram PyObject *callchain)
841892e76b2SArun Kalyanasundaram {
8428ab2e96dSArnaldo Carvalho de Melo PyObject *dict, *dict_sample, *brstack, *brstacksym;
8431fc632ceSJiri Olsa
844892e76b2SArun Kalyanasundaram dict = PyDict_New();
845892e76b2SArun Kalyanasundaram if (!dict)
84666dfdff0SJaroslav Škarvada Py_FatalError("couldn't create Python dictionary");
847892e76b2SArun Kalyanasundaram
84866dfdff0SJaroslav Škarvada dict_sample = PyDict_New();
849892e76b2SArun Kalyanasundaram if (!dict_sample)
85066dfdff0SJaroslav Škarvada Py_FatalError("couldn't create Python dictionary");
851892e76b2SArun Kalyanasundaram
852892e76b2SArun Kalyanasundaram pydict_set_item_string_decref(dict, "ev_name", _PyUnicode_FromString(evsel__name(evsel)));
853892e76b2SArun Kalyanasundaram pydict_set_item_string_decref(dict, "attr", _PyBytes_FromStringAndSize((const char *)&evsel->core.attr, sizeof(evsel->core.attr)));
854892e76b2SArun Kalyanasundaram
855892e76b2SArun Kalyanasundaram pydict_set_item_string_decref(dict_sample, "pid",
856892e76b2SArun Kalyanasundaram _PyLong_FromLong(sample->pid));
85741013f0cSKan Liang pydict_set_item_string_decref(dict_sample, "tid",
85841013f0cSKan Liang _PyLong_FromLong(sample->tid));
859943f32a0SLeo Yan pydict_set_item_string_decref(dict_sample, "cpu",
860943f32a0SLeo Yan _PyLong_FromLong(sample->cpu));
86174ec14f3SArun Kalyanasundaram pydict_set_item_string_decref(dict_sample, "ip",
86248a1f565SJin Yao PyLong_FromUnsignedLongLong(sample->ip));
86348a1f565SJin Yao pydict_set_item_string_decref(dict_sample, "time",
86448a1f565SJin Yao PyLong_FromUnsignedLongLong(sample->time));
86548a1f565SJin Yao pydict_set_item_string_decref(dict_sample, "period",
86648a1f565SJin Yao PyLong_FromUnsignedLongLong(sample->period));
867892e76b2SArun Kalyanasundaram pydict_set_item_string_decref(dict_sample, "phys_addr",
868892e76b2SArun Kalyanasundaram PyLong_FromUnsignedLongLong(sample->phys_addr));
86966dfdff0SJaroslav Škarvada pydict_set_item_string_decref(dict_sample, "addr",
870892e76b2SArun Kalyanasundaram PyLong_FromUnsignedLongLong(sample->addr));
871892e76b2SArun Kalyanasundaram set_sample_read_in_dict(dict_sample, sample, evsel);
87266dfdff0SJaroslav Škarvada pydict_set_item_string_decref(dict_sample, "weight",
873c4f46223SLeo Yan PyLong_FromUnsignedLongLong(sample->weight));
874c4f46223SLeo Yan pydict_set_item_string_decref(dict_sample, "transaction",
875892e76b2SArun Kalyanasundaram PyLong_FromUnsignedLongLong(sample->transaction));
876892e76b2SArun Kalyanasundaram set_sample_datasrc_in_dict(dict_sample, sample);
877892e76b2SArun Kalyanasundaram pydict_set_item_string_decref(dict, "sample", dict_sample);
87848a1f565SJin Yao
87948a1f565SJin Yao pydict_set_item_string_decref(dict, "raw_buf", _PyBytes_FromStringAndSize(
88048a1f565SJin Yao (const char *)sample->raw_data, sample->raw_size));
88148a1f565SJin Yao pydict_set_item_string_decref(dict, "comm",
88248a1f565SJin Yao _PyUnicode_FromString(thread__comm_str(al->thread)));
88348a1f565SJin Yao set_sym_in_dict(dict, al, "dso", "dso_bid", "dso_map_start", "dso_map_end",
8846de306b7SAdrian Hunter "symbol", "symoff");
8856de306b7SAdrian Hunter
8866de306b7SAdrian Hunter pydict_set_item_string_decref(dict, "callchain", callchain);
8876de306b7SAdrian Hunter
8886de306b7SAdrian Hunter brstack = python_process_brstack(sample, al->thread);
8896de306b7SAdrian Hunter pydict_set_item_string_decref(dict, "brstack", brstack);
8906de306b7SAdrian Hunter
89122cc2f74SAdrian Hunter brstacksym = python_process_brstacksym(sample, al->thread);
89222cc2f74SAdrian Hunter pydict_set_item_string_decref(dict, "brstacksym", brstacksym);
89322cc2f74SAdrian Hunter
8943f8e009eSAdrian Hunter if (sample->machine_pid) {
8953f8e009eSAdrian Hunter pydict_set_item_string_decref(dict_sample, "machine_pid",
8963f8e009eSAdrian Hunter _PyLong_FromLong(sample->machine_pid));
897c4f46223SLeo Yan pydict_set_item_string_decref(dict_sample, "vcpu",
898c4f46223SLeo Yan _PyLong_FromLong(sample->vcpu));
899c4f46223SLeo Yan }
9003f8e009eSAdrian Hunter
9013f8e009eSAdrian Hunter pydict_set_item_string_decref(dict_sample, "cpumode",
902bee272afSAdrian Hunter _PyLong_FromLong((unsigned long)sample->cpumode));
903bee272afSAdrian Hunter
904bee272afSAdrian Hunter if (addr_al) {
905142b0518SAdrian Hunter pydict_set_item_string_decref(dict_sample, "addr_correlates_sym",
906142b0518SAdrian Hunter PyBool_FromLong(1));
907142b0518SAdrian Hunter set_sym_in_dict(dict_sample, addr_al, "addr_dso", "addr_dso_bid",
908142b0518SAdrian Hunter "addr_dso_map_start", "addr_dso_map_end",
909142b0518SAdrian Hunter "addr_symbol", "addr_symoff");
910142b0518SAdrian Hunter }
911142b0518SAdrian Hunter
912142b0518SAdrian Hunter if (sample->flags)
91348a1f565SJin Yao python_process_sample_flags(sample, dict_sample);
91448a1f565SJin Yao
915892e76b2SArun Kalyanasundaram /* Instructions per cycle (IPC) */
916892e76b2SArun Kalyanasundaram if (sample->insn_cnt && sample->cyc_cnt) {
917892e76b2SArun Kalyanasundaram pydict_set_item_string_decref(dict_sample, "insn_cnt",
91880c3a7d9SAdrian Hunter PyLong_FromUnsignedLongLong(sample->insn_cnt));
919b7fff6b5SArnaldo Carvalho de Melo pydict_set_item_string_decref(dict_sample, "cyc_cnt",
92032dcd021SJiri Olsa PyLong_FromUnsignedLongLong(sample->cyc_cnt));
9213f8e009eSAdrian Hunter }
9223f8e009eSAdrian Hunter
9237e4b21b8STom Zanussi set_regs_in_dict(dict, sample, evsel);
92497fbf3f0STzvetomir Stoyanov
92539f54862SArnaldo Carvalho de Melo return dict;
926f38d2816SArun Kalyanasundaram }
9277e4b21b8STom Zanussi
9282c92f982STzvetomir Stoyanov (VMware) #ifdef HAVE_LIBTRACEEVENT
python_process_tracepoint(struct perf_sample * sample,struct evsel * evsel,struct addr_location * al,struct addr_location * addr_al)9297e4b21b8STom Zanussi static void python_process_tracepoint(struct perf_sample *sample,
9307e4b21b8STom Zanussi struct evsel *evsel,
9317e4b21b8STom Zanussi struct addr_location *al,
932be6d842aSDavid Ahern struct addr_location *addr_al)
933be6d842aSDavid Ahern {
934be6d842aSDavid Ahern struct tep_event *event = evsel->tp_format;
935f9d5d549SArnaldo Carvalho de Melo PyObject *handler, *context, *t, *obj = NULL, *callchain;
936e9f9a9caSArun Kalyanasundaram PyObject *dict = NULL, *all_entries_dict = NULL;
9377e4b21b8STom Zanussi static char handler_name[256];
93862665dffSArnaldo Carvalho de Melo struct tep_format_field *field;
93962665dffSArnaldo Carvalho de Melo unsigned long s, ns;
9401fc632ceSJiri Olsa unsigned n = 0;
94162665dffSArnaldo Carvalho de Melo int pid;
94262665dffSArnaldo Carvalho de Melo int cpu = sample->cpu;
9437e4b21b8STom Zanussi void *data = sample->raw_data;
94497822433SArnaldo Carvalho de Melo unsigned long long nsecs = sample->time;
9457e4b21b8STom Zanussi const char *comm = thread__comm_str(al->thread);
9467e4b21b8STom Zanussi const char *default_handler_name = "trace_unhandled";
9477e4b21b8STom Zanussi DECLARE_BITMAP(events_defined, TRACE_EVENT_TYPE_MAX);
94849bd97c2SSean Christopherson
949adf5bcf3SJiri Olsa bitmap_zero(events_defined, TRACE_EVENT_TYPE_MAX);
950adf5bcf3SJiri Olsa
951a5563edfSAdrian Hunter if (!event) {
952c0251485SPierre Tardy snprintf(handler_name, sizeof(handler_name),
953e9f9a9caSArun Kalyanasundaram "ug! no event found for type %" PRIu64, (u64)evsel->core.attr.config);
954e9f9a9caSArun Kalyanasundaram Py_FatalError(handler_name);
955e9f9a9caSArun Kalyanasundaram }
956c0251485SPierre Tardy
957c0251485SPierre Tardy pid = raw_field_value(event, "common_pid", data);
958c0251485SPierre Tardy
959c0251485SPierre Tardy sprintf(handler_name, "%s__%s", event->system, event->name);
960e9f9a9caSArun Kalyanasundaram
961e9f9a9caSArun Kalyanasundaram if (!__test_and_set_bit(event->id, events_defined))
962e9f9a9caSArun Kalyanasundaram define_event_symbols(event, handler_name, event->print_fmt.args);
963e9f9a9caSArun Kalyanasundaram
964e9f9a9caSArun Kalyanasundaram handler = get_handler(handler_name);
965e9f9a9caSArun Kalyanasundaram if (!handler) {
966bd48c63eSArnaldo Carvalho de Melo handler = get_handler(default_handler_name);
967bd48c63eSArnaldo Carvalho de Melo if (!handler)
9687e4b21b8STom Zanussi return;
96966dfdff0SJaroslav Škarvada dict = PyDict_New();
9707e4b21b8STom Zanussi if (!dict)
97166dfdff0SJaroslav Škarvada Py_FatalError("couldn't create Python dict");
972fb7d0b3cSKyle McMartin }
973c0251485SPierre Tardy
9740f5f5bcdSJoseph Schuchart t = PyTuple_New(MAX_FIELDS);
9750f5f5bcdSJoseph Schuchart if (!t)
976f38d2816SArun Kalyanasundaram Py_FatalError("couldn't create Python tuple");
977f38d2816SArun Kalyanasundaram
9780f5f5bcdSJoseph Schuchart
979e9f9a9caSArun Kalyanasundaram s = nsecs / NSEC_PER_SEC;
98066dfdff0SJaroslav Škarvada ns = nsecs - s * NSEC_PER_SEC;
98166dfdff0SJaroslav Škarvada
98266dfdff0SJaroslav Škarvada context = _PyCapsule_New(scripting_context, NULL, NULL);
98366dfdff0SJaroslav Škarvada
98466dfdff0SJaroslav Škarvada PyTuple_SetItem(t, n++, _PyUnicode_FromString(handler_name));
9850f5f5bcdSJoseph Schuchart PyTuple_SetItem(t, n++, context);
986c0251485SPierre Tardy
98766dfdff0SJaroslav Škarvada /* ip unwinding */
98866dfdff0SJaroslav Škarvada callchain = python_process_callchain(sample, evsel, al);
98966dfdff0SJaroslav Škarvada /* Need an additional reference for the perf_sample dict */
99066dfdff0SJaroslav Škarvada Py_INCREF(callchain);
99166dfdff0SJaroslav Škarvada
9920f5f5bcdSJoseph Schuchart if (!dict) {
993c0251485SPierre Tardy PyTuple_SetItem(t, n++, _PyLong_FromLong(cpu));
9947e4b21b8STom Zanussi PyTuple_SetItem(t, n++, _PyLong_FromLong(s));
995249de6e0SJiri Olsa PyTuple_SetItem(t, n++, _PyLong_FromLong(ns));
996249de6e0SJiri Olsa PyTuple_SetItem(t, n++, _PyLong_FromLong(pid));
997249de6e0SJiri Olsa PyTuple_SetItem(t, n++, _PyUnicode_FromString(comm));
998bb39ccb2STzvetomir Stoyanov (VMware) PyTuple_SetItem(t, n++, callchain);
9997e4b21b8STom Zanussi } else {
1000249de6e0SJiri Olsa pydict_set_item_string_decref(dict, "common_cpu", _PyLong_FromLong(cpu));
1001bb39ccb2STzvetomir Stoyanov (VMware) pydict_set_item_string_decref(dict, "common_s", _PyLong_FromLong(s));
100259c1baeeSTzvetomir Stoyanov (VMware) pydict_set_item_string_decref(dict, "common_ns", _PyLong_FromLong(ns));
1003249de6e0SJiri Olsa pydict_set_item_string_decref(dict, "common_pid", _PyLong_FromLong(pid));
1004249de6e0SJiri Olsa pydict_set_item_string_decref(dict, "common_comm", _PyUnicode_FromString(comm));
1005249de6e0SJiri Olsa pydict_set_item_string_decref(dict, "common_callchain", callchain);
1006249de6e0SJiri Olsa }
10071634bad3SIan Rogers for (field = event->format.fields; field; field = field->next) {
10087c689c83SMasami Hiramatsu unsigned int offset, len;
1009249de6e0SJiri Olsa unsigned long long val;
1010bb39ccb2STzvetomir Stoyanov (VMware)
1011249de6e0SJiri Olsa if (field->flags & TEP_FIELD_IS_ARRAY) {
101266dfdff0SJaroslav Škarvada offset = field->offset;
1013249de6e0SJiri Olsa len = field->size;
1014249de6e0SJiri Olsa if (field->flags & TEP_FIELD_IS_DYNAMIC) {
1015bb39ccb2STzvetomir Stoyanov (VMware) val = tep_read_number(scripting_context->pevent,
1016249de6e0SJiri Olsa data + offset, len);
10177e4b21b8STom Zanussi offset = val;
101833058b94SSebastian Andrzej Siewior len = offset >> 16;
10197e4b21b8STom Zanussi offset &= 0xffff;
1020e9f9a9caSArun Kalyanasundaram if (tep_field_is_relative(field->flags))
1021b1dcc03cSTom Zanussi offset += field->offset + field->size;
1022c0251485SPierre Tardy }
1023c0268e8dSJoseph Schuchart if (field->flags & TEP_FIELD_IS_STRING &&
1024c0251485SPierre Tardy is_printable_array(data + offset, len)) {
10257e4b21b8STom Zanussi obj = _PyUnicode_FromString((char *) data + offset);
10260f5f5bcdSJoseph Schuchart } else {
1027e9f9a9caSArun Kalyanasundaram obj = PyByteArray_FromStringAndSize((const char *) data + offset, len);
1028c0251485SPierre Tardy field->flags &= ~TEP_FIELD_IS_STRING;
10297e4b21b8STom Zanussi }
1030f38d2816SArun Kalyanasundaram } else { /* FIELD_IS_NUMERIC */
10313f8e009eSAdrian Hunter obj = get_field_numeric_entry(event, field, data);
1032f38d2816SArun Kalyanasundaram }
1033f38d2816SArun Kalyanasundaram if (!dict)
1034f38d2816SArun Kalyanasundaram PyTuple_SetItem(t, n++, obj);
1035f38d2816SArun Kalyanasundaram else
1036f38d2816SArun Kalyanasundaram pydict_set_item_string_decref(dict, field->name, obj);
1037f38d2816SArun Kalyanasundaram
10387e4b21b8STom Zanussi }
10397e4b21b8STom Zanussi
10407e4b21b8STom Zanussi if (dict)
1041db0ba84cSJanne Huttunen PyTuple_SetItem(t, n++, dict);
1042a5563edfSAdrian Hunter
1043db0ba84cSJanne Huttunen if (get_argument_count(handler) == (int) n + 1) {
1044e9f9a9caSArun Kalyanasundaram all_entries_dict = get_perf_sample_dict(sample, evsel, al, addr_al,
10457e4b21b8STom Zanussi callchain);
10467e4b21b8STom Zanussi PyTuple_SetItem(t, n++, all_entries_dict);
10477e4b21b8STom Zanussi } else {
104880c3a7d9SAdrian Hunter Py_DECREF(callchain);
104980c3a7d9SAdrian Hunter }
105080c3a7d9SAdrian Hunter
105180c3a7d9SAdrian Hunter if (_PyTuple_Resize(&t, n) == -1)
105280c3a7d9SAdrian Hunter Py_FatalError("error resizing Python tuple");
105380c3a7d9SAdrian Hunter
105480c3a7d9SAdrian Hunter if (!dict)
105580c3a7d9SAdrian Hunter call_object(handler, t, handler_name);
105680c3a7d9SAdrian Hunter else
105780c3a7d9SAdrian Hunter call_object(handler, t, default_handler_name);
10587e4b21b8STom Zanussi
1059df919b40SAdrian Hunter Py_DECREF(t);
1060df919b40SAdrian Hunter }
1061df919b40SAdrian Hunter #else
python_process_tracepoint(struct perf_sample * sample __maybe_unused,struct evsel * evsel __maybe_unused,struct addr_location * al __maybe_unused,struct addr_location * addr_al __maybe_unused)1062df919b40SAdrian Hunter static void python_process_tracepoint(struct perf_sample *sample __maybe_unused,
1063df919b40SAdrian Hunter struct evsel *evsel __maybe_unused,
1064df919b40SAdrian Hunter struct addr_location *al __maybe_unused,
1065df919b40SAdrian Hunter struct addr_location *addr_al __maybe_unused)
1066df919b40SAdrian Hunter {
1067df919b40SAdrian Hunter fprintf(stderr, "Tracepoint events are not supported because "
1068df919b40SAdrian Hunter "perf is not linked with libtraceevent.\n");
1069d04c1ff0SAdrian Hunter }
1070df919b40SAdrian Hunter #endif
1071df919b40SAdrian Hunter
tuple_new(unsigned int sz)107266dfdff0SJaroslav Škarvada static PyObject *tuple_new(unsigned int sz)
1073df919b40SAdrian Hunter {
1074df919b40SAdrian Hunter PyObject *t;
1075df919b40SAdrian Hunter
1076df919b40SAdrian Hunter t = PyTuple_New(sz);
1077df919b40SAdrian Hunter if (!t)
1078df919b40SAdrian Hunter Py_FatalError("couldn't create Python tuple");
1079d04c1ff0SAdrian Hunter return t;
1080d04c1ff0SAdrian Hunter }
1081d04c1ff0SAdrian Hunter
tuple_set_s64(PyObject * t,unsigned int pos,s64 val)1082d04c1ff0SAdrian Hunter static int tuple_set_s64(PyObject *t, unsigned int pos, s64 val)
1083d04c1ff0SAdrian Hunter {
1084d04c1ff0SAdrian Hunter #if BITS_PER_LONG == 64
1085d04c1ff0SAdrian Hunter return PyTuple_SetItem(t, pos, _PyLong_FromLong(val));
1086d04c1ff0SAdrian Hunter #endif
1087d04c1ff0SAdrian Hunter #if BITS_PER_LONG == 32
1088d04c1ff0SAdrian Hunter return PyTuple_SetItem(t, pos, PyLong_FromLongLong(val));
1089d04c1ff0SAdrian Hunter #endif
1090d04c1ff0SAdrian Hunter }
1091d04c1ff0SAdrian Hunter
1092d04c1ff0SAdrian Hunter /*
1093d04c1ff0SAdrian Hunter * Databases support only signed 64-bit numbers, so even though we are
1094d04c1ff0SAdrian Hunter * exporting a u64, it must be as s64.
10952ede9217SAdrian Hunter */
10962ede9217SAdrian Hunter #define tuple_set_d64 tuple_set_s64
10972ede9217SAdrian Hunter
tuple_set_u64(PyObject * t,unsigned int pos,u64 val)10982ede9217SAdrian Hunter static int tuple_set_u64(PyObject *t, unsigned int pos, u64 val)
10992ede9217SAdrian Hunter {
1100df919b40SAdrian Hunter #if BITS_PER_LONG == 64
1101df919b40SAdrian Hunter return PyTuple_SetItem(t, pos, PyLong_FromUnsignedLong(val));
110266dfdff0SJaroslav Škarvada #endif
1103df919b40SAdrian Hunter #if BITS_PER_LONG == 32
1104df919b40SAdrian Hunter return PyTuple_SetItem(t, pos, PyLong_FromUnsignedLongLong(val));
11050db21340SAdrian Hunter #endif
11060db21340SAdrian Hunter }
11070db21340SAdrian Hunter
tuple_set_u32(PyObject * t,unsigned int pos,u32 val)11080db21340SAdrian Hunter static int tuple_set_u32(PyObject *t, unsigned int pos, u32 val)
11090db21340SAdrian Hunter {
1110df919b40SAdrian Hunter return PyTuple_SetItem(t, pos, PyLong_FromUnsignedLong(val));
1111df919b40SAdrian Hunter }
111266dfdff0SJaroslav Škarvada
tuple_set_s32(PyObject * t,unsigned int pos,s32 val)1113df919b40SAdrian Hunter static int tuple_set_s32(PyObject *t, unsigned int pos, s32 val)
1114df919b40SAdrian Hunter {
1115b9322cabSAdrian Hunter return PyTuple_SetItem(t, pos, _PyLong_FromLong(val));
1116b9322cabSAdrian Hunter }
1117b9322cabSAdrian Hunter
tuple_set_bool(PyObject * t,unsigned int pos,bool val)1118b9322cabSAdrian Hunter static int tuple_set_bool(PyObject *t, unsigned int pos, bool val)
1119b9322cabSAdrian Hunter {
1120b9322cabSAdrian Hunter return PyTuple_SetItem(t, pos, PyBool_FromLong(val));
112132dcd021SJiri Olsa }
1122df919b40SAdrian Hunter
tuple_set_string(PyObject * t,unsigned int pos,const char * s)1123df919b40SAdrian Hunter static int tuple_set_string(PyObject *t, unsigned int pos, const char *s)
1124df919b40SAdrian Hunter {
1125df919b40SAdrian Hunter return PyTuple_SetItem(t, pos, _PyUnicode_FromString(s));
1126df919b40SAdrian Hunter }
1127df919b40SAdrian Hunter
tuple_set_bytes(PyObject * t,unsigned int pos,void * bytes,unsigned int sz)1128d04c1ff0SAdrian Hunter static int tuple_set_bytes(PyObject *t, unsigned int pos, void *bytes,
11298ab2e96dSArnaldo Carvalho de Melo unsigned int sz)
1130df919b40SAdrian Hunter {
1131df919b40SAdrian Hunter return PyTuple_SetItem(t, pos, _PyBytes_FromStringAndSize(bytes, sz));
1132df919b40SAdrian Hunter }
1133df919b40SAdrian Hunter
python_export_evsel(struct db_export * dbe,struct evsel * evsel)1134df919b40SAdrian Hunter static int python_export_evsel(struct db_export *dbe, struct evsel *evsel)
1135df919b40SAdrian Hunter {
1136df919b40SAdrian Hunter struct tables *tables = container_of(dbe, struct tables, dbe);
1137df919b40SAdrian Hunter PyObject *t;
1138df919b40SAdrian Hunter
1139df919b40SAdrian Hunter t = tuple_new(2);
1140df919b40SAdrian Hunter
1141df919b40SAdrian Hunter tuple_set_d64(t, 0, evsel->db_id);
1142df919b40SAdrian Hunter tuple_set_string(t, 1, evsel__name(evsel));
1143df919b40SAdrian Hunter
1144df919b40SAdrian Hunter call_object(tables->evsel_handler, t, "evsel_table");
1145df919b40SAdrian Hunter
1146d04c1ff0SAdrian Hunter Py_DECREF(t);
1147df919b40SAdrian Hunter
1148df919b40SAdrian Hunter return 0;
1149df919b40SAdrian Hunter }
1150df919b40SAdrian Hunter
python_export_machine(struct db_export * dbe,struct machine * machine)1151df919b40SAdrian Hunter static int python_export_machine(struct db_export *dbe,
1152df919b40SAdrian Hunter struct machine *machine)
1153df919b40SAdrian Hunter {
1154df919b40SAdrian Hunter struct tables *tables = container_of(dbe, struct tables, dbe);
1155df919b40SAdrian Hunter PyObject *t;
1156df919b40SAdrian Hunter
1157df919b40SAdrian Hunter t = tuple_new(3);
1158df919b40SAdrian Hunter
1159df919b40SAdrian Hunter tuple_set_d64(t, 0, machine->db_id);
1160df919b40SAdrian Hunter tuple_set_s32(t, 1, machine->pid);
1161df919b40SAdrian Hunter tuple_set_string(t, 2, machine->root_dir ? machine->root_dir : "");
1162df919b40SAdrian Hunter
1163df919b40SAdrian Hunter call_object(tables->machine_handler, t, "machine_table");
1164df919b40SAdrian Hunter
1165d04c1ff0SAdrian Hunter Py_DECREF(t);
1166d04c1ff0SAdrian Hunter
1167d04c1ff0SAdrian Hunter return 0;
1168df919b40SAdrian Hunter }
1169df919b40SAdrian Hunter
python_export_thread(struct db_export * dbe,struct thread * thread,u64 main_thread_db_id,struct machine * machine)1170df919b40SAdrian Hunter static int python_export_thread(struct db_export *dbe, struct thread *thread,
1171df919b40SAdrian Hunter u64 main_thread_db_id, struct machine *machine)
1172df919b40SAdrian Hunter {
1173df919b40SAdrian Hunter struct tables *tables = container_of(dbe, struct tables, dbe);
1174df919b40SAdrian Hunter PyObject *t;
1175df919b40SAdrian Hunter
1176df919b40SAdrian Hunter t = tuple_new(5);
1177df919b40SAdrian Hunter
11788ebf5cc0SAdrian Hunter tuple_set_d64(t, 0, thread__db_id(thread));
11798ebf5cc0SAdrian Hunter tuple_set_d64(t, 1, machine->db_id);
1180df919b40SAdrian Hunter tuple_set_d64(t, 2, main_thread_db_id);
1181df919b40SAdrian Hunter tuple_set_s32(t, 3, thread__pid(thread));
1182df919b40SAdrian Hunter tuple_set_s32(t, 4, thread__tid(thread));
1183df919b40SAdrian Hunter
11848ebf5cc0SAdrian Hunter call_object(tables->thread_handler, t, "thread_table");
1185df919b40SAdrian Hunter
1186d04c1ff0SAdrian Hunter Py_DECREF(t);
1187df919b40SAdrian Hunter
1188d04c1ff0SAdrian Hunter return 0;
1189d04c1ff0SAdrian Hunter }
11908ebf5cc0SAdrian Hunter
python_export_comm(struct db_export * dbe,struct comm * comm,struct thread * thread)1191df919b40SAdrian Hunter static int python_export_comm(struct db_export *dbe, struct comm *comm,
1192df919b40SAdrian Hunter struct thread *thread)
1193df919b40SAdrian Hunter {
1194df919b40SAdrian Hunter struct tables *tables = container_of(dbe, struct tables, dbe);
1195df919b40SAdrian Hunter PyObject *t;
1196df919b40SAdrian Hunter
1197df919b40SAdrian Hunter t = tuple_new(5);
1198df919b40SAdrian Hunter
1199df919b40SAdrian Hunter tuple_set_d64(t, 0, comm->db_id);
1200df919b40SAdrian Hunter tuple_set_string(t, 1, comm__str(comm));
1201df919b40SAdrian Hunter tuple_set_d64(t, 2, thread__db_id(thread));
1202df919b40SAdrian Hunter tuple_set_d64(t, 3, comm->start);
1203df919b40SAdrian Hunter tuple_set_s32(t, 4, comm->exec);
1204df919b40SAdrian Hunter
1205df919b40SAdrian Hunter call_object(tables->comm_handler, t, "comm_table");
1206df919b40SAdrian Hunter
1207d04c1ff0SAdrian Hunter Py_DECREF(t);
1208d04c1ff0SAdrian Hunter
1209d04c1ff0SAdrian Hunter return 0;
1210df919b40SAdrian Hunter }
1211df919b40SAdrian Hunter
python_export_comm_thread(struct db_export * dbe,u64 db_id,struct comm * comm,struct thread * thread)1212df919b40SAdrian Hunter static int python_export_comm_thread(struct db_export *dbe, u64 db_id,
1213df919b40SAdrian Hunter struct comm *comm, struct thread *thread)
1214df919b40SAdrian Hunter {
1215df919b40SAdrian Hunter struct tables *tables = container_of(dbe, struct tables, dbe);
1216df919b40SAdrian Hunter PyObject *t;
1217df919b40SAdrian Hunter
1218df919b40SAdrian Hunter t = tuple_new(3);
1219df919b40SAdrian Hunter
1220df919b40SAdrian Hunter tuple_set_d64(t, 0, db_id);
1221df919b40SAdrian Hunter tuple_set_d64(t, 1, comm->db_id);
1222b5d8bbe8SMasami Hiramatsu tuple_set_d64(t, 2, thread__db_id(thread));
1223df919b40SAdrian Hunter
1224df919b40SAdrian Hunter call_object(tables->comm_thread_handler, t, "comm_thread_table");
1225bf541169SJiri Olsa
1226df919b40SAdrian Hunter Py_DECREF(t);
1227df919b40SAdrian Hunter
1228df919b40SAdrian Hunter return 0;
1229d04c1ff0SAdrian Hunter }
1230d04c1ff0SAdrian Hunter
python_export_dso(struct db_export * dbe,struct dso * dso,struct machine * machine)1231df919b40SAdrian Hunter static int python_export_dso(struct db_export *dbe, struct dso *dso,
1232df919b40SAdrian Hunter struct machine *machine)
1233df919b40SAdrian Hunter {
1234df919b40SAdrian Hunter struct tables *tables = container_of(dbe, struct tables, dbe);
1235df919b40SAdrian Hunter char sbuild_id[SBUILD_ID_SIZE];
1236df919b40SAdrian Hunter PyObject *t;
1237df919b40SAdrian Hunter
1238df919b40SAdrian Hunter build_id__sprintf(&dso->bid, sbuild_id);
1239df919b40SAdrian Hunter
1240df919b40SAdrian Hunter t = tuple_new(5);
1241df919b40SAdrian Hunter
1242df919b40SAdrian Hunter tuple_set_d64(t, 0, dso->db_id);
1243df919b40SAdrian Hunter tuple_set_d64(t, 1, machine->db_id);
1244df919b40SAdrian Hunter tuple_set_string(t, 2, dso->short_name);
1245df919b40SAdrian Hunter tuple_set_string(t, 3, dso->long_name);
1246df919b40SAdrian Hunter tuple_set_string(t, 4, sbuild_id);
1247df919b40SAdrian Hunter
1248df919b40SAdrian Hunter call_object(tables->dso_handler, t, "dso_table");
1249df919b40SAdrian Hunter
1250df919b40SAdrian Hunter Py_DECREF(t);
1251d04c1ff0SAdrian Hunter
1252d04c1ff0SAdrian Hunter return 0;
1253d04c1ff0SAdrian Hunter }
1254d04c1ff0SAdrian Hunter
python_export_symbol(struct db_export * dbe,struct symbol * sym,struct dso * dso)1255df919b40SAdrian Hunter static int python_export_symbol(struct db_export *dbe, struct symbol *sym,
1256df919b40SAdrian Hunter struct dso *dso)
1257df919b40SAdrian Hunter {
1258df919b40SAdrian Hunter struct tables *tables = container_of(dbe, struct tables, dbe);
1259df919b40SAdrian Hunter u64 *sym_db_id = symbol__priv(sym);
1260df919b40SAdrian Hunter PyObject *t;
1261df919b40SAdrian Hunter
1262df919b40SAdrian Hunter t = tuple_new(6);
1263df919b40SAdrian Hunter
1264df919b40SAdrian Hunter tuple_set_d64(t, 0, *sym_db_id);
1265c29414f5SAdrian Hunter tuple_set_d64(t, 1, dso->db_id);
1266c29414f5SAdrian Hunter tuple_set_d64(t, 2, sym->start);
1267c29414f5SAdrian Hunter tuple_set_d64(t, 3, sym->end);
1268c29414f5SAdrian Hunter tuple_set_s32(t, 4, sym->binding);
1269c29414f5SAdrian Hunter tuple_set_string(t, 5, sym->name);
1270c29414f5SAdrian Hunter
1271c29414f5SAdrian Hunter call_object(tables->symbol_handler, t, "symbol_table");
1272c29414f5SAdrian Hunter
1273c29414f5SAdrian Hunter Py_DECREF(t);
1274c29414f5SAdrian Hunter
1275c29414f5SAdrian Hunter return 0;
1276c29414f5SAdrian Hunter }
1277c29414f5SAdrian Hunter
python_export_branch_type(struct db_export * dbe,u32 branch_type,const char * name)1278c29414f5SAdrian Hunter static int python_export_branch_type(struct db_export *dbe, u32 branch_type,
1279c29414f5SAdrian Hunter const char *name)
1280c29414f5SAdrian Hunter {
1281c29414f5SAdrian Hunter struct tables *tables = container_of(dbe, struct tables, dbe);
1282c29414f5SAdrian Hunter PyObject *t;
1283b9322cabSAdrian Hunter
1284df919b40SAdrian Hunter t = tuple_new(2);
1285df919b40SAdrian Hunter
1286df919b40SAdrian Hunter tuple_set_s32(t, 0, branch_type);
1287df919b40SAdrian Hunter tuple_set_string(t, 1, name);
1288df919b40SAdrian Hunter
1289c096fff6SAdrian Hunter call_object(tables->branch_type_handler, t, "branch_type_table");
1290df919b40SAdrian Hunter
1291d04c1ff0SAdrian Hunter Py_DECREF(t);
1292d04c1ff0SAdrian Hunter
12935ab6d715SIan Rogers return 0;
1294d04c1ff0SAdrian Hunter }
1295d04c1ff0SAdrian Hunter
python_export_sample_table(struct db_export * dbe,struct export_sample * es)1296d04c1ff0SAdrian Hunter static void python_export_sample_table(struct db_export *dbe,
1297d04c1ff0SAdrian Hunter struct export_sample *es)
1298d04c1ff0SAdrian Hunter {
1299d04c1ff0SAdrian Hunter struct tables *tables = container_of(dbe, struct tables, dbe);
1300d04c1ff0SAdrian Hunter PyObject *t;
1301df919b40SAdrian Hunter
1302d04c1ff0SAdrian Hunter t = tuple_new(25);
1303d04c1ff0SAdrian Hunter
1304d04c1ff0SAdrian Hunter tuple_set_d64(t, 0, es->db_id);
1305d04c1ff0SAdrian Hunter tuple_set_d64(t, 1, es->evsel->db_id);
1306d04c1ff0SAdrian Hunter tuple_set_d64(t, 2, maps__machine(es->al->maps)->db_id);
1307d04c1ff0SAdrian Hunter tuple_set_d64(t, 3, thread__db_id(es->al->thread));
1308d04c1ff0SAdrian Hunter tuple_set_d64(t, 4, es->comm_db_id);
1309d04c1ff0SAdrian Hunter tuple_set_d64(t, 5, es->dso_db_id);
1310c29414f5SAdrian Hunter tuple_set_d64(t, 6, es->sym_db_id);
1311c29414f5SAdrian Hunter tuple_set_d64(t, 7, es->offset);
1312d04c1ff0SAdrian Hunter tuple_set_d64(t, 8, es->sample->ip);
1313d04c1ff0SAdrian Hunter tuple_set_d64(t, 9, es->sample->time);
1314d04c1ff0SAdrian Hunter tuple_set_s32(t, 10, es->sample->cpu);
1315c096fff6SAdrian Hunter tuple_set_d64(t, 11, es->addr_dso_db_id);
1316df919b40SAdrian Hunter tuple_set_d64(t, 12, es->addr_sym_db_id);
1317df919b40SAdrian Hunter tuple_set_d64(t, 13, es->addr_offset);
1318df919b40SAdrian Hunter tuple_set_d64(t, 14, es->sample->addr);
1319df919b40SAdrian Hunter tuple_set_d64(t, 15, es->sample->period);
1320b9322cabSAdrian Hunter tuple_set_d64(t, 16, es->sample->weight);
1321b9322cabSAdrian Hunter tuple_set_d64(t, 17, es->sample->transaction);
1322b9322cabSAdrian Hunter tuple_set_d64(t, 18, es->sample->data_src);
1323b9322cabSAdrian Hunter tuple_set_s32(t, 19, es->sample->flags & PERF_BRANCH_MASK);
1324b9322cabSAdrian Hunter tuple_set_s32(t, 20, !!(es->sample->flags & PERF_IP_FLAG_IN_TX));
1325b9322cabSAdrian Hunter tuple_set_d64(t, 21, es->call_path_id);
1326b9322cabSAdrian Hunter tuple_set_d64(t, 22, es->sample->insn_cnt);
1327b9322cabSAdrian Hunter tuple_set_d64(t, 23, es->sample->cyc_cnt);
1328b9322cabSAdrian Hunter tuple_set_s32(t, 24, es->sample->flags);
1329d04c1ff0SAdrian Hunter
1330d04c1ff0SAdrian Hunter call_object(tables->sample_handler, t, "sample_table");
1331b9322cabSAdrian Hunter
1332b9322cabSAdrian Hunter Py_DECREF(t);
1333b9322cabSAdrian Hunter }
1334b9322cabSAdrian Hunter
python_export_synth(struct db_export * dbe,struct export_sample * es)1335b9322cabSAdrian Hunter static void python_export_synth(struct db_export *dbe, struct export_sample *es)
1336b9322cabSAdrian Hunter {
1337b9322cabSAdrian Hunter struct tables *tables = container_of(dbe, struct tables, dbe);
1338b9322cabSAdrian Hunter PyObject *t;
1339b9322cabSAdrian Hunter
1340b9322cabSAdrian Hunter t = tuple_new(3);
1341b9322cabSAdrian Hunter
1342b9322cabSAdrian Hunter tuple_set_d64(t, 0, es->db_id);
1343b9322cabSAdrian Hunter tuple_set_d64(t, 1, es->evsel->core.attr.config);
1344b9322cabSAdrian Hunter tuple_set_bytes(t, 2, es->sample->raw_data, es->sample->raw_size);
13451fc632ceSJiri Olsa
1346b9322cabSAdrian Hunter call_object(tables->synth_handler, t, "synth_data");
1347df919b40SAdrian Hunter
1348df919b40SAdrian Hunter Py_DECREF(t);
1349df919b40SAdrian Hunter }
1350df919b40SAdrian Hunter
python_export_sample(struct db_export * dbe,struct export_sample * es)13516a70307dSAdrian Hunter static int python_export_sample(struct db_export *dbe,
13526a70307dSAdrian Hunter struct export_sample *es)
13536a70307dSAdrian Hunter {
13546a70307dSAdrian Hunter struct tables *tables = container_of(dbe, struct tables, dbe);
13556a70307dSAdrian Hunter
13566a70307dSAdrian Hunter python_export_sample_table(dbe, es);
13576a70307dSAdrian Hunter
13586a70307dSAdrian Hunter if (es->evsel->core.attr.type == PERF_TYPE_SYNTH && tables->synth_handler)
13596a70307dSAdrian Hunter python_export_synth(dbe, es);
13606a70307dSAdrian Hunter
13616a70307dSAdrian Hunter return 0;
1362d04c1ff0SAdrian Hunter }
1363d04c1ff0SAdrian Hunter
python_export_call_path(struct db_export * dbe,struct call_path * cp)1364d04c1ff0SAdrian Hunter static int python_export_call_path(struct db_export *dbe, struct call_path *cp)
1365d04c1ff0SAdrian Hunter {
13666a70307dSAdrian Hunter struct tables *tables = container_of(dbe, struct tables, dbe);
13676a70307dSAdrian Hunter PyObject *t;
13686a70307dSAdrian Hunter u64 parent_db_id, sym_db_id;
13696a70307dSAdrian Hunter
13706a70307dSAdrian Hunter parent_db_id = cp->parent ? cp->parent->db_id : 0;
13716a70307dSAdrian Hunter sym_db_id = cp->sym ? *(u64 *)symbol__priv(cp->sym) : 0;
13726a70307dSAdrian Hunter
13736a70307dSAdrian Hunter t = tuple_new(4);
13746a70307dSAdrian Hunter
13756a70307dSAdrian Hunter tuple_set_d64(t, 0, cp->db_id);
13766a70307dSAdrian Hunter tuple_set_d64(t, 1, parent_db_id);
13776a70307dSAdrian Hunter tuple_set_d64(t, 2, sym_db_id);
13786a70307dSAdrian Hunter tuple_set_d64(t, 3, cp->ip);
13796a70307dSAdrian Hunter
13806a70307dSAdrian Hunter call_object(tables->call_path_handler, t, "call_path_table");
138152a2ab6fSAdrian Hunter
13826a70307dSAdrian Hunter Py_DECREF(t);
1383d04c1ff0SAdrian Hunter
1384d04c1ff0SAdrian Hunter return 0;
1385d04c1ff0SAdrian Hunter }
1386d04c1ff0SAdrian Hunter
python_export_call_return(struct db_export * dbe,struct call_return * cr)1387d04c1ff0SAdrian Hunter static int python_export_call_return(struct db_export *dbe,
1388d04c1ff0SAdrian Hunter struct call_return *cr)
1389d04c1ff0SAdrian Hunter {
1390d04c1ff0SAdrian Hunter struct tables *tables = container_of(dbe, struct tables, dbe);
1391d04c1ff0SAdrian Hunter u64 comm_db_id = cr->comm ? cr->comm->db_id : 0;
1392d04c1ff0SAdrian Hunter PyObject *t;
13936a70307dSAdrian Hunter
1394d04c1ff0SAdrian Hunter t = tuple_new(14);
1395d04c1ff0SAdrian Hunter
1396d04c1ff0SAdrian Hunter tuple_set_d64(t, 0, cr->db_id);
13976a70307dSAdrian Hunter tuple_set_d64(t, 1, thread__db_id(cr->thread));
13986a70307dSAdrian Hunter tuple_set_d64(t, 2, comm_db_id);
13996a70307dSAdrian Hunter tuple_set_d64(t, 3, cr->cp->db_id);
14006a70307dSAdrian Hunter tuple_set_d64(t, 4, cr->call_time);
14016a70307dSAdrian Hunter tuple_set_d64(t, 5, cr->return_time);
14026a70307dSAdrian Hunter tuple_set_d64(t, 6, cr->branch_count);
14036a70307dSAdrian Hunter tuple_set_d64(t, 7, cr->call_ref);
14046a70307dSAdrian Hunter tuple_set_d64(t, 8, cr->return_ref);
1405abde8722SAdrian Hunter tuple_set_d64(t, 9, cr->cp->parent->db_id);
1406abde8722SAdrian Hunter tuple_set_s32(t, 10, cr->flags);
1407abde8722SAdrian Hunter tuple_set_d64(t, 11, cr->parent_db_id);
1408abde8722SAdrian Hunter tuple_set_d64(t, 12, cr->insn_count);
1409abde8722SAdrian Hunter tuple_set_d64(t, 13, cr->cyc_count);
1410abde8722SAdrian Hunter
1411abde8722SAdrian Hunter call_object(tables->call_return_handler, t, "call_return_table");
1412abde8722SAdrian Hunter
1413abde8722SAdrian Hunter Py_DECREF(t);
1414abde8722SAdrian Hunter
1415abde8722SAdrian Hunter return 0;
1416d04c1ff0SAdrian Hunter }
1417d04c1ff0SAdrian Hunter
python_export_context_switch(struct db_export * dbe,u64 db_id,struct machine * machine,struct perf_sample * sample,u64 th_out_id,u64 comm_out_id,u64 th_in_id,u64 comm_in_id,int flags)1418d04c1ff0SAdrian Hunter static int python_export_context_switch(struct db_export *dbe, u64 db_id,
1419abde8722SAdrian Hunter struct machine *machine,
1420d04c1ff0SAdrian Hunter struct perf_sample *sample,
1421d04c1ff0SAdrian Hunter u64 th_out_id, u64 comm_out_id,
1422d04c1ff0SAdrian Hunter u64 th_in_id, u64 comm_in_id, int flags)
1423d04c1ff0SAdrian Hunter {
1424abde8722SAdrian Hunter struct tables *tables = container_of(dbe, struct tables, dbe);
1425abde8722SAdrian Hunter PyObject *t;
1426abde8722SAdrian Hunter
1427abde8722SAdrian Hunter t = tuple_new(9);
1428abde8722SAdrian Hunter
1429abde8722SAdrian Hunter tuple_set_d64(t, 0, db_id);
1430abde8722SAdrian Hunter tuple_set_d64(t, 1, machine->db_id);
1431abde8722SAdrian Hunter tuple_set_d64(t, 2, sample->time);
1432abde8722SAdrian Hunter tuple_set_s32(t, 3, sample->cpu);
1433f435887eSAdrian Hunter tuple_set_d64(t, 4, th_out_id);
1434f435887eSAdrian Hunter tuple_set_d64(t, 5, comm_out_id);
14356a70307dSAdrian Hunter tuple_set_d64(t, 6, th_in_id);
14366a70307dSAdrian Hunter tuple_set_d64(t, 7, comm_in_id);
14376a70307dSAdrian Hunter tuple_set_s32(t, 8, flags);
1438f435887eSAdrian Hunter
14396a70307dSAdrian Hunter call_object(tables->context_switch_handler, t, "context_switch");
14406a70307dSAdrian Hunter
1441b7fff6b5SArnaldo Carvalho de Melo Py_DECREF(t);
144232dcd021SJiri Olsa
14433f8e009eSAdrian Hunter return 0;
14443f8e009eSAdrian Hunter }
14456a6daec2SFeng Tang
python_process_call_return(struct call_return * cr,u64 * parent_db_id,void * data)1446892e76b2SArun Kalyanasundaram static int python_process_call_return(struct call_return *cr, u64 *parent_db_id,
14476a6daec2SFeng Tang void *data)
14486a6daec2SFeng Tang {
14496a6daec2SFeng Tang struct db_export *dbe = data;
1450e9f9a9caSArun Kalyanasundaram
1451e9f9a9caSArun Kalyanasundaram return db_export__call_return(dbe, cr, parent_db_id);
1452e9f9a9caSArun Kalyanasundaram }
1453e9f9a9caSArun Kalyanasundaram
python_process_general_event(struct perf_sample * sample,struct evsel * evsel,struct addr_location * al,struct addr_location * addr_al)1454e9f9a9caSArun Kalyanasundaram static void python_process_general_event(struct perf_sample *sample,
1455e9f9a9caSArun Kalyanasundaram struct evsel *evsel,
1456fd6b858aSFeng Tang struct addr_location *al,
1457fd6b858aSFeng Tang struct addr_location *addr_al)
145887b6a3adSFeng Tang {
1459fd6b858aSFeng Tang PyObject *handler, *t, *dict, *callchain;
14606a6daec2SFeng Tang static char handler_name[64];
14616a6daec2SFeng Tang unsigned n = 0;
14626a6daec2SFeng Tang
14636a6daec2SFeng Tang snprintf(handler_name, sizeof(handler_name), "%s", "process_event");
14640f5f5bcdSJoseph Schuchart
14650f5f5bcdSJoseph Schuchart handler = get_handler(handler_name);
14663f8e009eSAdrian Hunter if (!handler)
14670f5f5bcdSJoseph Schuchart return;
1468fd6b858aSFeng Tang
14696a6daec2SFeng Tang /*
14706a6daec2SFeng Tang * Use the MAX_FIELDS to make the function expandable, though
14716a6daec2SFeng Tang * currently there is only one item for the tuple.
1472a5563edfSAdrian Hunter */
1473e9f9a9caSArun Kalyanasundaram t = PyTuple_New(MAX_FIELDS);
14746a6daec2SFeng Tang if (!t)
14756a6daec2SFeng Tang Py_FatalError("couldn't create Python tuple");
14766a6daec2SFeng Tang
1477df919b40SAdrian Hunter /* ip unwinding */
14786a6daec2SFeng Tang callchain = python_process_callchain(sample, evsel, al);
147932dcd021SJiri Olsa dict = get_perf_sample_dict(sample, evsel, al, addr_al, callchain);
14803f8e009eSAdrian Hunter
14813f8e009eSAdrian Hunter PyTuple_SetItem(t, n++, dict);
14826a6daec2SFeng Tang if (_PyTuple_Resize(&t, n) == -1)
1483df919b40SAdrian Hunter Py_FatalError("error resizing Python tuple");
1484df919b40SAdrian Hunter
1485cac30400SAdrian Hunter call_object(handler, t, handler_name);
1486cac30400SAdrian Hunter
14871fc632ceSJiri Olsa Py_DECREF(t);
14886a6daec2SFeng Tang }
14893f8e009eSAdrian Hunter
python_process_event(union perf_event * event,struct perf_sample * sample,struct evsel * evsel,struct addr_location * al,struct addr_location * addr_al)14906a6daec2SFeng Tang static void python_process_event(union perf_event *event,
14916a6daec2SFeng Tang struct perf_sample *sample,
14926a6daec2SFeng Tang struct evsel *evsel,
1493df919b40SAdrian Hunter struct addr_location *al,
14943f8e009eSAdrian Hunter struct addr_location *addr_al)
1495df919b40SAdrian Hunter {
14963f8e009eSAdrian Hunter struct tables *tables = &tables_global;
14976a6daec2SFeng Tang
14986a6daec2SFeng Tang scripting_context__update(scripting_context, event, sample, evsel, al, addr_al);
14996a6daec2SFeng Tang
1500538d9c18SStephen Brennan switch (evsel->core.attr.type) {
1501538d9c18SStephen Brennan case PERF_TYPE_TRACEPOINT:
1502538d9c18SStephen Brennan python_process_tracepoint(sample, evsel, al, addr_al);
1503538d9c18SStephen Brennan break;
1504538d9c18SStephen Brennan /* Reserve for future process_hw/sw/raw APIs */
1505538d9c18SStephen Brennan default:
1506538d9c18SStephen Brennan if (tables->db_export_mode)
1507538d9c18SStephen Brennan db_export__sample(&tables->dbe, event, sample, evsel, al, addr_al);
1508538d9c18SStephen Brennan else
1509538d9c18SStephen Brennan python_process_general_event(sample, evsel, al, addr_al);
1510538d9c18SStephen Brennan }
1511538d9c18SStephen Brennan }
1512538d9c18SStephen Brennan
python_process_throttle(union perf_event * event,struct perf_sample * sample,struct machine * machine)1513538d9c18SStephen Brennan static void python_process_throttle(union perf_event *event,
1514538d9c18SStephen Brennan struct perf_sample *sample,
1515538d9c18SStephen Brennan struct machine *machine)
1516538d9c18SStephen Brennan {
1517538d9c18SStephen Brennan const char *handler_name;
1518538d9c18SStephen Brennan PyObject *handler, *t;
1519538d9c18SStephen Brennan
1520538d9c18SStephen Brennan if (event->header.type == PERF_RECORD_THROTTLE)
1521538d9c18SStephen Brennan handler_name = "throttle";
1522538d9c18SStephen Brennan else
1523538d9c18SStephen Brennan handler_name = "unthrottle";
1524538d9c18SStephen Brennan handler = get_handler(handler_name);
1525538d9c18SStephen Brennan if (!handler)
1526538d9c18SStephen Brennan return;
1527538d9c18SStephen Brennan
1528538d9c18SStephen Brennan t = tuple_new(6);
1529538d9c18SStephen Brennan if (!t)
1530538d9c18SStephen Brennan return;
15310db21340SAdrian Hunter
15320db21340SAdrian Hunter tuple_set_u64(t, 0, event->throttle.time);
15330db21340SAdrian Hunter tuple_set_u64(t, 1, event->throttle.id);
15340db21340SAdrian Hunter tuple_set_u64(t, 2, event->throttle.stream_id);
15350db21340SAdrian Hunter tuple_set_s32(t, 3, sample->cpu);
15360db21340SAdrian Hunter tuple_set_s32(t, 4, sample->pid);
15370db21340SAdrian Hunter tuple_set_s32(t, 5, sample->tid);
15380db21340SAdrian Hunter
15390db21340SAdrian Hunter call_object(handler, t, handler_name);
15400db21340SAdrian Hunter
15410db21340SAdrian Hunter Py_DECREF(t);
15420db21340SAdrian Hunter }
15430db21340SAdrian Hunter
python_do_process_switch(union perf_event * event,struct perf_sample * sample,struct machine * machine)15440db21340SAdrian Hunter static void python_do_process_switch(union perf_event *event,
15450db21340SAdrian Hunter struct perf_sample *sample,
15460db21340SAdrian Hunter struct machine *machine)
15470db21340SAdrian Hunter {
15480db21340SAdrian Hunter const char *handler_name = "context_switch";
15490db21340SAdrian Hunter bool out = event->header.misc & PERF_RECORD_MISC_SWITCH_OUT;
15506de306b7SAdrian Hunter bool out_preempt = out && (event->header.misc & PERF_RECORD_MISC_SWITCH_OUT_PREEMPT);
15510db21340SAdrian Hunter pid_t np_pid = -1, np_tid = -1;
15520db21340SAdrian Hunter PyObject *handler, *t;
15530db21340SAdrian Hunter
15540db21340SAdrian Hunter handler = get_handler(handler_name);
15550db21340SAdrian Hunter if (!handler)
15560db21340SAdrian Hunter return;
15570db21340SAdrian Hunter
15580db21340SAdrian Hunter if (event->header.type == PERF_RECORD_SWITCH_CPU_WIDE) {
15590db21340SAdrian Hunter np_pid = event->context_switch.next_prev_pid;
15600db21340SAdrian Hunter np_tid = event->context_switch.next_prev_tid;
15610db21340SAdrian Hunter }
15620db21340SAdrian Hunter
15636de306b7SAdrian Hunter t = tuple_new(11);
15646de306b7SAdrian Hunter if (!t)
15650db21340SAdrian Hunter return;
15660db21340SAdrian Hunter
15670db21340SAdrian Hunter tuple_set_u64(t, 0, sample->time);
15680db21340SAdrian Hunter tuple_set_s32(t, 1, sample->cpu);
15690db21340SAdrian Hunter tuple_set_s32(t, 2, sample->pid);
15700db21340SAdrian Hunter tuple_set_s32(t, 3, sample->tid);
1571abde8722SAdrian Hunter tuple_set_s32(t, 4, np_pid);
1572abde8722SAdrian Hunter tuple_set_s32(t, 5, np_tid);
1573abde8722SAdrian Hunter tuple_set_s32(t, 6, machine->pid);
1574abde8722SAdrian Hunter tuple_set_bool(t, 7, out);
1575abde8722SAdrian Hunter tuple_set_bool(t, 8, out_preempt);
1576abde8722SAdrian Hunter tuple_set_s32(t, 9, sample->machine_pid);
1577abde8722SAdrian Hunter tuple_set_s32(t, 10, sample->vcpu);
1578abde8722SAdrian Hunter
15790db21340SAdrian Hunter call_object(handler, t, handler_name);
15800db21340SAdrian Hunter
1581abde8722SAdrian Hunter Py_DECREF(t);
1582abde8722SAdrian Hunter }
15832ede9217SAdrian Hunter
python_process_switch(union perf_event * event,struct perf_sample * sample,struct machine * machine)15842ede9217SAdrian Hunter static void python_process_switch(union perf_event *event,
15852ede9217SAdrian Hunter struct perf_sample *sample,
15862ede9217SAdrian Hunter struct machine *machine)
15872ede9217SAdrian Hunter {
15882ede9217SAdrian Hunter struct tables *tables = &tables_global;
15892ede9217SAdrian Hunter
15902ede9217SAdrian Hunter if (tables->db_export_mode)
15912ede9217SAdrian Hunter db_export__switch(&tables->dbe, event, sample, machine);
15922ede9217SAdrian Hunter else
15932ede9217SAdrian Hunter python_do_process_switch(event, sample, machine);
15942ede9217SAdrian Hunter }
15952ede9217SAdrian Hunter
python_process_auxtrace_error(struct perf_session * session __maybe_unused,union perf_event * event)15962ede9217SAdrian Hunter static void python_process_auxtrace_error(struct perf_session *session __maybe_unused,
15972ede9217SAdrian Hunter union perf_event *event)
15982ede9217SAdrian Hunter {
15992ede9217SAdrian Hunter struct perf_record_auxtrace_error *e = &event->auxtrace_error;
16002ede9217SAdrian Hunter u8 cpumode = e->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
16012ede9217SAdrian Hunter const char *handler_name = "auxtrace_error";
16027151c1d1SAdrian Hunter unsigned long long tm = e->time;
16032ede9217SAdrian Hunter const char *msg = e->msg;
16042ede9217SAdrian Hunter PyObject *handler, *t;
16052ede9217SAdrian Hunter
16062ede9217SAdrian Hunter handler = get_handler(handler_name);
16072ede9217SAdrian Hunter if (!handler)
16082ede9217SAdrian Hunter return;
16092ede9217SAdrian Hunter
16102ede9217SAdrian Hunter if (!e->fmt) {
16112ede9217SAdrian Hunter tm = 0;
16122ede9217SAdrian Hunter msg = (const char *)&e->time;
16137151c1d1SAdrian Hunter }
16147151c1d1SAdrian Hunter
16152ede9217SAdrian Hunter t = tuple_new(11);
16162ede9217SAdrian Hunter
16172ede9217SAdrian Hunter tuple_set_u32(t, 0, e->type);
16182ede9217SAdrian Hunter tuple_set_u32(t, 1, e->code);
16192ede9217SAdrian Hunter tuple_set_s32(t, 2, e->cpu);
16202ede9217SAdrian Hunter tuple_set_s32(t, 3, e->pid);
1621aef90263SJiri Olsa tuple_set_s32(t, 4, e->tid);
162232dcd021SJiri Olsa tuple_set_u64(t, 5, e->ip);
1623aef90263SJiri Olsa tuple_set_u64(t, 6, tm);
1624aef90263SJiri Olsa tuple_set_string(t, 7, msg);
1625aef90263SJiri Olsa tuple_set_u32(t, 8, cpumode);
16268ab2e96dSArnaldo Carvalho de Melo tuple_set_s32(t, 9, e->machine_pid);
1627aef90263SJiri Olsa tuple_set_s32(t, 10, e->vcpu);
1628aef90263SJiri Olsa
1629aef90263SJiri Olsa call_object(handler, t, handler_name);
1630aef90263SJiri Olsa
1631aef90263SJiri Olsa Py_DECREF(t);
1632aef90263SJiri Olsa }
1633aef90263SJiri Olsa
get_handler_name(char * str,size_t size,struct evsel * evsel)1634aef90263SJiri Olsa static void get_handler_name(char *str, size_t size,
16356d18804bSIan Rogers struct evsel *evsel)
1636aef90263SJiri Olsa {
1637aef90263SJiri Olsa char *p = str;
1638aef90263SJiri Olsa
1639aef90263SJiri Olsa scnprintf(str, size, "stat__%s", evsel__name(evsel));
1640aef90263SJiri Olsa
1641aef90263SJiri Olsa while ((p = strchr(p, ':'))) {
1642aef90263SJiri Olsa *p = '_';
1643aef90263SJiri Olsa p++;
1644aef90263SJiri Olsa }
1645aef90263SJiri Olsa }
1646aef90263SJiri Olsa
1647aef90263SJiri Olsa static void
process_stat(struct evsel * counter,struct perf_cpu cpu,int thread,u64 tstamp,struct perf_counts_values * count)1648aef90263SJiri Olsa process_stat(struct evsel *counter, struct perf_cpu cpu, int thread, u64 tstamp,
1649aef90263SJiri Olsa struct perf_counts_values *count)
1650aef90263SJiri Olsa {
1651aef90263SJiri Olsa PyObject *handler, *t;
1652aef90263SJiri Olsa static char handler_name[256];
1653aef90263SJiri Olsa int n = 0;
1654aef90263SJiri Olsa
16556d18804bSIan Rogers t = PyTuple_New(MAX_FIELDS);
165666dfdff0SJaroslav Škarvada if (!t)
1657aef90263SJiri Olsa Py_FatalError("couldn't create Python tuple");
1658aef90263SJiri Olsa
1659aef90263SJiri Olsa get_handler_name(handler_name, sizeof(handler_name),
1660aef90263SJiri Olsa counter);
1661aef90263SJiri Olsa
1662aef90263SJiri Olsa handler = get_handler(handler_name);
1663aef90263SJiri Olsa if (!handler) {
1664aef90263SJiri Olsa pr_debug("can't find python handler %s\n", handler_name);
1665aef90263SJiri Olsa return;
1666aef90263SJiri Olsa }
1667aef90263SJiri Olsa
1668aef90263SJiri Olsa PyTuple_SetItem(t, n++, _PyLong_FromLong(cpu.cpu));
1669aef90263SJiri Olsa PyTuple_SetItem(t, n++, _PyLong_FromLong(thread));
1670aef90263SJiri Olsa
1671aef90263SJiri Olsa tuple_set_u64(t, n++, tstamp);
167232dcd021SJiri Olsa tuple_set_u64(t, n++, count->val);
1673aef90263SJiri Olsa tuple_set_u64(t, n++, count->ena);
1674af663bd0SJiri Olsa tuple_set_u64(t, n++, count->run);
1675d400bd3aSJiri Olsa
1676aef90263SJiri Olsa if (_PyTuple_Resize(&t, n) == -1)
1677aef90263SJiri Olsa Py_FatalError("error resizing Python tuple");
1678fd3f518fSIan Rogers
167944028699SIan Rogers call_object(handler, t, handler_name);
168044028699SIan Rogers
1681a2f354e3SJiri Olsa Py_DECREF(t);
1682aef90263SJiri Olsa }
1683aef90263SJiri Olsa
python_process_stat(struct perf_stat_config * config,struct evsel * counter,u64 tstamp)1684aef90263SJiri Olsa static void python_process_stat(struct perf_stat_config *config,
1685aef90263SJiri Olsa struct evsel *counter, u64 tstamp)
1686aef90263SJiri Olsa {
1687aef90263SJiri Olsa struct perf_thread_map *threads = counter->core.threads;
1688aef90263SJiri Olsa struct perf_cpu_map *cpus = counter->core.cpus;
1689aef90263SJiri Olsa int cpu, thread;
1690aef90263SJiri Olsa
1691aef90263SJiri Olsa for (thread = 0; thread < perf_thread_map__nr(threads); thread++) {
1692aef90263SJiri Olsa for (cpu = 0; cpu < perf_cpu_map__nr(cpus); cpu++) {
1693aef90263SJiri Olsa process_stat(counter, perf_cpu_map__cpu(cpus, cpu),
1694aef90263SJiri Olsa perf_thread_map__pid(threads, thread), tstamp,
1695aef90263SJiri Olsa perf_counts(counter->counts, cpu, thread));
1696aef90263SJiri Olsa }
1697aef90263SJiri Olsa }
1698aef90263SJiri Olsa }
1699aef90263SJiri Olsa
python_process_stat_interval(u64 tstamp)1700aef90263SJiri Olsa static void python_process_stat_interval(u64 tstamp)
1701aef90263SJiri Olsa {
1702aef90263SJiri Olsa PyObject *handler, *t;
1703aef90263SJiri Olsa static const char handler_name[] = "stat__interval";
1704aef90263SJiri Olsa int n = 0;
1705aef90263SJiri Olsa
1706aef90263SJiri Olsa t = PyTuple_New(MAX_FIELDS);
1707aef90263SJiri Olsa if (!t)
1708aef90263SJiri Olsa Py_FatalError("couldn't create Python tuple");
1709aef90263SJiri Olsa
1710aef90263SJiri Olsa handler = get_handler(handler_name);
1711aef90263SJiri Olsa if (!handler) {
1712aef90263SJiri Olsa pr_debug("can't find python handler %s\n", handler_name);
1713cf9bfa6cSAdrian Hunter return;
1714cf9bfa6cSAdrian Hunter }
1715cf9bfa6cSAdrian Hunter
1716cf9bfa6cSAdrian Hunter tuple_set_u64(t, n++, tstamp);
1717cf9bfa6cSAdrian Hunter
1718cf9bfa6cSAdrian Hunter if (_PyTuple_Resize(&t, n) == -1)
1719cf9bfa6cSAdrian Hunter Py_FatalError("error resizing Python tuple");
1720cf9bfa6cSAdrian Hunter
1721cf9bfa6cSAdrian Hunter call_object(handler, t, handler_name);
1722cf9bfa6cSAdrian Hunter
1723cf9bfa6cSAdrian Hunter Py_DECREF(t);
1724cf9bfa6cSAdrian Hunter }
1725cf9bfa6cSAdrian Hunter
perf_script_context_init(void)1726cf9bfa6cSAdrian Hunter static int perf_script_context_init(void)
1727cf9bfa6cSAdrian Hunter {
1728cf9bfa6cSAdrian Hunter PyObject *perf_script_context;
1729cf9bfa6cSAdrian Hunter PyObject *perf_trace_context;
1730cf9bfa6cSAdrian Hunter PyObject *dict;
1731cf9bfa6cSAdrian Hunter int ret;
1732cf9bfa6cSAdrian Hunter
1733cf9bfa6cSAdrian Hunter perf_trace_context = PyImport_AddModule("perf_trace_context");
1734cf9bfa6cSAdrian Hunter if (!perf_trace_context)
1735cf9bfa6cSAdrian Hunter return -1;
1736cf9bfa6cSAdrian Hunter dict = PyModule_GetDict(perf_trace_context);
1737cf9bfa6cSAdrian Hunter if (!dict)
17387e4b21b8STom Zanussi return -1;
17397e4b21b8STom Zanussi
17407e4b21b8STom Zanussi perf_script_context = _PyCapsule_New(scripting_context, NULL, NULL);
17417e4b21b8STom Zanussi if (!perf_script_context)
17427e4b21b8STom Zanussi return -1;
17437e4b21b8STom Zanussi
17447e4b21b8STom Zanussi ret = PyDict_SetItemString(dict, "perf_script_context", perf_script_context);
17457e4b21b8STom Zanussi if (!ret)
1746a5563edfSAdrian Hunter ret = PyDict_SetItemString(main_dict, "perf_script_context", perf_script_context);
17477e4b21b8STom Zanussi Py_DECREF(perf_script_context);
17487e4b21b8STom Zanussi return ret;
17497e4b21b8STom Zanussi }
1750cf9bfa6cSAdrian Hunter
run_start_sub(void)1751cf9bfa6cSAdrian Hunter static int run_start_sub(void)
1752cf9bfa6cSAdrian Hunter {
1753a5563edfSAdrian Hunter main_module = PyImport_AddModule("__main__");
17547e4b21b8STom Zanussi if (main_module == NULL)
1755a5563edfSAdrian Hunter return -1;
17567e4b21b8STom Zanussi Py_INCREF(main_module);
17577e4b21b8STom Zanussi
17587e4b21b8STom Zanussi main_dict = PyModule_GetDict(main_module);
17597e4b21b8STom Zanussi if (main_dict == NULL)
1760a5563edfSAdrian Hunter goto error;
17617e4b21b8STom Zanussi Py_INCREF(main_dict);
17627e4b21b8STom Zanussi
1763df919b40SAdrian Hunter if (perf_script_context_init())
1764df919b40SAdrian Hunter goto error;
1765df919b40SAdrian Hunter
1766df919b40SAdrian Hunter try_call_object("trace_begin", NULL);
1767df919b40SAdrian Hunter
1768df919b40SAdrian Hunter return 0;
1769df919b40SAdrian Hunter
1770df919b40SAdrian Hunter error:
1771df919b40SAdrian Hunter Py_XDECREF(main_dict);
1772df919b40SAdrian Hunter Py_XDECREF(main_module);
1773df919b40SAdrian Hunter return -1;
1774df919b40SAdrian Hunter }
17756a70307dSAdrian Hunter
17762c15f5ebSChris Phlipot #define SET_TABLE_HANDLER_(name, handler_name, table_name) do { \
17772c15f5ebSChris Phlipot tables->handler_name = get_handler(#table_name); \
17786a70307dSAdrian Hunter if (tables->handler_name) \
17792c15f5ebSChris Phlipot tables->dbe.export_ ## name = python_export_ ## name; \
1780df919b40SAdrian Hunter } while (0)
1781df919b40SAdrian Hunter
1782df919b40SAdrian Hunter #define SET_TABLE_HANDLER(name) \
1783df919b40SAdrian Hunter SET_TABLE_HANDLER_(name, name ## _handler, name ## _table)
1784df919b40SAdrian Hunter
set_table_handlers(struct tables * tables)1785df919b40SAdrian Hunter static void set_table_handlers(struct tables *tables)
1786df919b40SAdrian Hunter {
1787df919b40SAdrian Hunter const char *perf_db_export_mode = "perf_db_export_mode";
1788df919b40SAdrian Hunter const char *perf_db_export_calls = "perf_db_export_calls";
1789df919b40SAdrian Hunter const char *perf_db_export_callchains = "perf_db_export_callchains";
1790df919b40SAdrian Hunter PyObject *db_export_mode, *db_export_calls, *db_export_callchains;
1791df919b40SAdrian Hunter bool export_calls = false;
1792df919b40SAdrian Hunter bool export_callchains = false;
1793df919b40SAdrian Hunter int ret;
1794df919b40SAdrian Hunter
1795df919b40SAdrian Hunter memset(tables, 0, sizeof(struct tables));
17962c15f5ebSChris Phlipot if (db_export__init(&tables->dbe))
17976a70307dSAdrian Hunter Py_FatalError("failed to initialize export");
17986a70307dSAdrian Hunter
17996a70307dSAdrian Hunter db_export_mode = PyDict_GetItemString(main_dict, perf_db_export_mode);
18006a70307dSAdrian Hunter if (!db_export_mode)
18016a70307dSAdrian Hunter return;
18026a70307dSAdrian Hunter
18036a70307dSAdrian Hunter ret = PyObject_IsTrue(db_export_mode);
18046a70307dSAdrian Hunter if (ret == -1)
18056a70307dSAdrian Hunter handler_call_die(perf_db_export_mode);
18066a70307dSAdrian Hunter if (!ret)
18076a70307dSAdrian Hunter return;
18086a70307dSAdrian Hunter
18096a70307dSAdrian Hunter /* handle export calls */
18106a70307dSAdrian Hunter tables->dbe.crp = NULL;
18116a70307dSAdrian Hunter db_export_calls = PyDict_GetItemString(main_dict, perf_db_export_calls);
18126a70307dSAdrian Hunter if (db_export_calls) {
18136a70307dSAdrian Hunter ret = PyObject_IsTrue(db_export_calls);
18142c15f5ebSChris Phlipot if (ret == -1)
18152c15f5ebSChris Phlipot handler_call_die(perf_db_export_calls);
18162c15f5ebSChris Phlipot export_calls = !!ret;
18172c15f5ebSChris Phlipot }
18182c15f5ebSChris Phlipot
18192c15f5ebSChris Phlipot if (export_calls) {
18202c15f5ebSChris Phlipot tables->dbe.crp =
18212c15f5ebSChris Phlipot call_return_processor__new(python_process_call_return,
18222c15f5ebSChris Phlipot &tables->dbe);
18232c15f5ebSChris Phlipot if (!tables->dbe.crp)
18242c15f5ebSChris Phlipot Py_FatalError("failed to create calls processor");
18252c15f5ebSChris Phlipot }
18262c15f5ebSChris Phlipot
18272c15f5ebSChris Phlipot /* handle export callchains */
18282c15f5ebSChris Phlipot tables->dbe.cpr = NULL;
18292c15f5ebSChris Phlipot db_export_callchains = PyDict_GetItemString(main_dict,
18304d39c89fSIngo Molnar perf_db_export_callchains);
18312c15f5ebSChris Phlipot if (db_export_callchains) {
18322c15f5ebSChris Phlipot ret = PyObject_IsTrue(db_export_callchains);
18332c15f5ebSChris Phlipot if (ret == -1)
18342c15f5ebSChris Phlipot handler_call_die(perf_db_export_callchains);
18352c15f5ebSChris Phlipot export_callchains = !!ret;
18362c15f5ebSChris Phlipot }
18372c15f5ebSChris Phlipot
1838aff63340SChris Phlipot if (export_callchains) {
18392c15f5ebSChris Phlipot /*
18402c15f5ebSChris Phlipot * Attempt to use the call path root from the call return
1841df919b40SAdrian Hunter * processor, if the call return processor is in use. Otherwise,
1842df919b40SAdrian Hunter * we allocate a new call path root. This prevents exporting
1843df919b40SAdrian Hunter * duplicate call path ids when both are in use simultaneously.
1844df919b40SAdrian Hunter */
1845df919b40SAdrian Hunter if (tables->dbe.crp)
1846df919b40SAdrian Hunter tables->dbe.cpr = tables->dbe.crp->cpr;
1847df919b40SAdrian Hunter else
1848df919b40SAdrian Hunter tables->dbe.cpr = call_path_root__new();
1849df919b40SAdrian Hunter
1850df919b40SAdrian Hunter if (!tables->dbe.cpr)
1851df919b40SAdrian Hunter Py_FatalError("failed to create call path root");
1852df919b40SAdrian Hunter }
1853df919b40SAdrian Hunter
1854c29414f5SAdrian Hunter tables->db_export_mode = true;
1855df919b40SAdrian Hunter /*
18566a70307dSAdrian Hunter * Reserve per symbol space for symbol->db_id via symbol__priv()
18576a70307dSAdrian Hunter */
1858abde8722SAdrian Hunter symbol_conf.priv_size = sizeof(u64);
1859b9322cabSAdrian Hunter
1860b9322cabSAdrian Hunter SET_TABLE_HANDLER(evsel);
1861b9322cabSAdrian Hunter SET_TABLE_HANDLER(machine);
1862b9322cabSAdrian Hunter SET_TABLE_HANDLER(thread);
1863b9322cabSAdrian Hunter SET_TABLE_HANDLER(comm);
1864b9322cabSAdrian Hunter SET_TABLE_HANDLER(comm_thread);
1865b9322cabSAdrian Hunter SET_TABLE_HANDLER(dso);
1866b9322cabSAdrian Hunter SET_TABLE_HANDLER(symbol);
1867df919b40SAdrian Hunter SET_TABLE_HANDLER(branch_type);
1868df919b40SAdrian Hunter SET_TABLE_HANDLER(sample);
186966dfdff0SJaroslav Škarvada SET_TABLE_HANDLER(call_path);
187066dfdff0SJaroslav Škarvada SET_TABLE_HANDLER(call_return);
187166dfdff0SJaroslav Škarvada SET_TABLE_HANDLER(context_switch);
187266dfdff0SJaroslav Škarvada
187366dfdff0SJaroslav Škarvada /*
187466dfdff0SJaroslav Škarvada * Synthesized events are samples but with architecture-specific data
187566dfdff0SJaroslav Škarvada * stored in sample->raw_data. They are exported via
187666dfdff0SJaroslav Škarvada * python_export_sample() and consequently do not need a separate export
187766dfdff0SJaroslav Škarvada * callback.
187866dfdff0SJaroslav Škarvada */
187966dfdff0SJaroslav Škarvada tables->synth_handler = get_handler("synth_data");
188066dfdff0SJaroslav Škarvada }
188166dfdff0SJaroslav Škarvada
188266dfdff0SJaroslav Škarvada #if PY_MAJOR_VERSION < 3
_free_command_line(const char ** command_line,int num)188366dfdff0SJaroslav Škarvada static void _free_command_line(const char **command_line, int num)
188466dfdff0SJaroslav Škarvada {
18857e4b21b8STom Zanussi free(command_line);
18867e4b21b8STom Zanussi }
18877e4b21b8STom Zanussi #else
_free_command_line(wchar_t ** command_line,int num)188867e50ce0SAdrian Hunter static void _free_command_line(wchar_t **command_line, int num)
188967e50ce0SAdrian Hunter {
18907e4b21b8STom Zanussi int i;
1891df919b40SAdrian Hunter for (i = 0; i < num; i++)
189266dfdff0SJaroslav Škarvada PyMem_RawFree(command_line[i]);
18937e4b21b8STom Zanussi free(command_line);
189466dfdff0SJaroslav Škarvada }
189566dfdff0SJaroslav Škarvada #endif
189666dfdff0SJaroslav Škarvada
1897cc437642STony Jones
1898cc437642STony Jones /*
1899cc437642STony Jones * Start trace script
1900cc437642STony Jones */
python_start_script(const char * script,int argc,const char ** argv,struct perf_session * session)1901cc437642STony Jones static int python_start_script(const char *script, int argc, const char **argv,
19027e4b21b8STom Zanussi struct perf_session *session)
19037e4b21b8STom Zanussi {
19047e4b21b8STom Zanussi struct tables *tables = &tables_global;
190567e50ce0SAdrian Hunter #if PY_MAJOR_VERSION < 3
190666dfdff0SJaroslav Škarvada const char **command_line;
19077e4b21b8STom Zanussi #else
19087e4b21b8STom Zanussi wchar_t **command_line;
19097e4b21b8STom Zanussi #endif
19107e4b21b8STom Zanussi /*
1911d0e7b0c7SArnaldo Carvalho de Melo * Use a non-const name variable to cope with python 2.6's
191266dfdff0SJaroslav Škarvada * PyImport_AppendInittab prototype
191366dfdff0SJaroslav Škarvada */
191466dfdff0SJaroslav Škarvada char buf[PATH_MAX], name[19] = "perf_trace_context";
191566dfdff0SJaroslav Škarvada int i, err = 0;
191666dfdff0SJaroslav Škarvada FILE *fp;
1917d0e7b0c7SArnaldo Carvalho de Melo
191866dfdff0SJaroslav Škarvada scripting_context->session = session;
19197e4b21b8STom Zanussi #if PY_MAJOR_VERSION < 3
19207e4b21b8STom Zanussi command_line = malloc((argc + 1) * sizeof(const char *));
192166dfdff0SJaroslav Škarvada command_line[0] = script;
19227e4b21b8STom Zanussi for (i = 1; i < argc + 1; i++)
192366dfdff0SJaroslav Škarvada command_line[i] = argv[i - 1];
192466dfdff0SJaroslav Škarvada PyImport_AppendInittab(name, initperf_trace_context);
192566dfdff0SJaroslav Škarvada #else
19267e4b21b8STom Zanussi command_line = malloc((argc + 1) * sizeof(wchar_t *));
19277e4b21b8STom Zanussi command_line[0] = Py_DecodeLocale(script, NULL);
19287e4b21b8STom Zanussi for (i = 1; i < argc + 1; i++)
19297e4b21b8STom Zanussi command_line[i] = Py_DecodeLocale(argv[i - 1], NULL);
19307e4b21b8STom Zanussi PyImport_AppendInittab(name, PyInit_perf_trace_context);
19317e4b21b8STom Zanussi #endif
19327e4b21b8STom Zanussi Py_Initialize();
19337e4b21b8STom Zanussi
19347e4b21b8STom Zanussi #if PY_MAJOR_VERSION < 3
19357e4b21b8STom Zanussi PySys_SetArgv(argc + 1, (char **)command_line);
19367e4b21b8STom Zanussi #else
19377e4b21b8STom Zanussi PySys_SetArgv(argc + 1, command_line);
19387e4b21b8STom Zanussi #endif
19397e4b21b8STom Zanussi
19407e4b21b8STom Zanussi fp = fopen(script, "r");
19417e4b21b8STom Zanussi if (!fp) {
19427e4b21b8STom Zanussi sprintf(buf, "Can't open python script \"%s\"", script);
19437e4b21b8STom Zanussi perror(buf);
19447e4b21b8STom Zanussi err = -1;
19457e4b21b8STom Zanussi goto error;
19467e4b21b8STom Zanussi }
1947df919b40SAdrian Hunter
1948df919b40SAdrian Hunter err = PyRun_SimpleFile(fp, script);
1949c29414f5SAdrian Hunter if (err) {
1950c29414f5SAdrian Hunter fprintf(stderr, "Error running python script %s\n", script);
1951c29414f5SAdrian Hunter goto error;
1952c29414f5SAdrian Hunter }
1953c29414f5SAdrian Hunter
1954c29414f5SAdrian Hunter err = run_start_sub();
195566dfdff0SJaroslav Škarvada if (err) {
1956979ac257SColin Ian King fprintf(stderr, "Error starting python script %s\n", script);
19577e4b21b8STom Zanussi goto error;
19587e4b21b8STom Zanussi }
19597e4b21b8STom Zanussi
196066dfdff0SJaroslav Škarvada set_table_handlers(tables);
19617e4b21b8STom Zanussi
19627e4b21b8STom Zanussi if (tables->db_export_mode) {
19637e4b21b8STom Zanussi err = db_export__branch_types(&tables->dbe);
19647e4b21b8STom Zanussi if (err)
1965d445dd2aSAdrian Hunter goto error;
1966d445dd2aSAdrian Hunter }
1967fead24e5SAdrian Hunter
1968d445dd2aSAdrian Hunter _free_command_line(command_line, argc + 1);
1969d445dd2aSAdrian Hunter
19707e4b21b8STom Zanussi return err;
19717e4b21b8STom Zanussi error:
19727e4b21b8STom Zanussi Py_Finalize();
19737e4b21b8STom Zanussi _free_command_line(command_line, argc + 1);
19747e4b21b8STom Zanussi
1975df919b40SAdrian Hunter return err;
1976df919b40SAdrian Hunter }
1977a5563edfSAdrian Hunter
python_flush_script(void)19787e4b21b8STom Zanussi static int python_flush_script(void)
1979df919b40SAdrian Hunter {
1980df919b40SAdrian Hunter return 0;
19817e4b21b8STom Zanussi }
19827e4b21b8STom Zanussi
19837e4b21b8STom Zanussi /*
19847e4b21b8STom Zanussi * Stop trace script
1985a5563edfSAdrian Hunter */
python_stop_script(void)19867e4b21b8STom Zanussi static int python_stop_script(void)
19877e4b21b8STom Zanussi {
198880c3a7d9SAdrian Hunter struct tables *tables = &tables_global;
1989096177a8STzvetomir Stoyanov (VMware)
19907e4b21b8STom Zanussi try_call_object("trace_end", NULL);
1991a5e05abcSSteven Rostedt (VMware)
1992a5e05abcSSteven Rostedt (VMware) db_export__exit(&tables->dbe);
199397fbf3f0STzvetomir Stoyanov
19942c92f982STzvetomir Stoyanov (VMware) Py_XDECREF(main_dict);
19957e4b21b8STom Zanussi Py_XDECREF(main_module);
19967e4b21b8STom Zanussi Py_Finalize();
19977e4b21b8STom Zanussi
19987e4b21b8STom Zanussi return 0;
19997e4b21b8STom Zanussi }
20007e4b21b8STom Zanussi
20017e4b21b8STom Zanussi #ifdef HAVE_LIBTRACEEVENT
python_generate_script(struct tep_handle * pevent,const char * outfile)20027e4b21b8STom Zanussi static int python_generate_script(struct tep_handle *pevent, const char *outfile)
20037e4b21b8STom Zanussi {
2004133dc4c3SIngo Molnar int i, not_first, count, nr_events;
2005133dc4c3SIngo Molnar struct tep_event **all_events;
20067e4b21b8STom Zanussi struct tep_event *event = NULL;
20077e4b21b8STom Zanussi struct tep_format_field *f;
20087e4b21b8STom Zanussi char fname[PATH_MAX];
20097e4b21b8STom Zanussi FILE *ofp;
20107e4b21b8STom Zanussi
20117e4b21b8STom Zanussi sprintf(fname, "%s.py", outfile);
20127e4b21b8STom Zanussi ofp = fopen(fname, "w");
20137e4b21b8STom Zanussi if (ofp == NULL) {
20147e4b21b8STom Zanussi fprintf(stderr, "couldn't open %s\n", fname);
20157e4b21b8STom Zanussi return -1;
20167e4b21b8STom Zanussi }
20177e4b21b8STom Zanussi fprintf(ofp, "# perf script event handlers, "
20187e4b21b8STom Zanussi "generated by perf script -g python\n");
20197e4b21b8STom Zanussi
20207e4b21b8STom Zanussi fprintf(ofp, "# Licensed under the terms of the GNU GPL"
20217e4b21b8STom Zanussi " License version 2\n\n");
2022c76132dcSSeongJae Park
20237e4b21b8STom Zanussi fprintf(ofp, "# The common_* event handler fields are the most useful "
20247e4b21b8STom Zanussi "fields common to\n");
2025877cc639SJeremy Cline
20267e4b21b8STom Zanussi fprintf(ofp, "# all events. They don't necessarily correspond to "
20277e4b21b8STom Zanussi "the 'common_*' fields\n");
20287e4b21b8STom Zanussi
20297e4b21b8STom Zanussi fprintf(ofp, "# in the format files. Those fields not available as "
20307e4b21b8STom Zanussi "handler params can\n");
20317e4b21b8STom Zanussi
20327e4b21b8STom Zanussi fprintf(ofp, "# be retrieved using Python functions of the form "
20337e4b21b8STom Zanussi "common_*(context).\n");
20347e4b21b8STom Zanussi
2035877cc639SJeremy Cline fprintf(ofp, "# See the perf-script-python Documentation for the list "
20367e4b21b8STom Zanussi "of available functions.\n\n");
20377e4b21b8STom Zanussi
2038877cc639SJeremy Cline fprintf(ofp, "from __future__ import print_function\n\n");
20397e4b21b8STom Zanussi fprintf(ofp, "import os\n");
2040a5e05abcSSteven Rostedt (VMware) fprintf(ofp, "import sys\n\n");
2041a5e05abcSSteven Rostedt (VMware)
2042a5e05abcSSteven Rostedt (VMware) fprintf(ofp, "sys.path.append(os.environ['PERF_EXEC_PATH'] + \\\n");
2043a5e05abcSSteven Rostedt (VMware) fprintf(ofp, "\t'/scripts/python/Perf-Trace-Util/lib/Perf/Trace')\n");
2044a5e05abcSSteven Rostedt (VMware) fprintf(ofp, "\nfrom perf_trace_context import *\n");
20457e4b21b8STom Zanussi fprintf(ofp, "from Core import *\n\n\n");
20467e4b21b8STom Zanussi
20477e4b21b8STom Zanussi fprintf(ofp, "def trace_begin():\n");
20487e4b21b8STom Zanussi fprintf(ofp, "\tprint(\"in trace_begin\")\n\n");
20497e4b21b8STom Zanussi
20507e4b21b8STom Zanussi fprintf(ofp, "def trace_end():\n");
20517e4b21b8STom Zanussi fprintf(ofp, "\tprint(\"in trace_end\")\n\n");
20527e4b21b8STom Zanussi
20530f5f5bcdSJoseph Schuchart nr_events = tep_get_events_count(pevent);
20547e4b21b8STom Zanussi all_events = tep_list_events(pevent, TEP_EVENT_SORT_ID);
20557e4b21b8STom Zanussi
20567e4b21b8STom Zanussi for (i = 0; all_events && i < nr_events; i++) {
20577e4b21b8STom Zanussi event = all_events[i];
20587e4b21b8STom Zanussi fprintf(ofp, "def %s__%s(", event->system, event->name);
20597e4b21b8STom Zanussi fprintf(ofp, "event_name, ");
20607e4b21b8STom Zanussi fprintf(ofp, "context, ");
20617e4b21b8STom Zanussi fprintf(ofp, "common_cpu,\n");
20627e4b21b8STom Zanussi fprintf(ofp, "\tcommon_secs, ");
20637e4b21b8STom Zanussi fprintf(ofp, "common_nsecs, ");
20647e4b21b8STom Zanussi fprintf(ofp, "common_pid, ");
20657e4b21b8STom Zanussi fprintf(ofp, "common_comm,\n\t");
2066a6418605SArun Kalyanasundaram fprintf(ofp, "common_callchain, ");
2067a6418605SArun Kalyanasundaram
2068a6418605SArun Kalyanasundaram not_first = 0;
2069a6418605SArun Kalyanasundaram count = 0;
2070a6418605SArun Kalyanasundaram
2071a6418605SArun Kalyanasundaram for (f = event->format.fields; f; f = f->next) {
20727e4b21b8STom Zanussi if (not_first++)
20737e4b21b8STom Zanussi fprintf(ofp, ", ");
20747e4b21b8STom Zanussi if (++count % 5 == 0)
20757e4b21b8STom Zanussi fprintf(ofp, "\n\t");
20767e4b21b8STom Zanussi
20777e4b21b8STom Zanussi fprintf(ofp, "%s", f->name);
2078877cc639SJeremy Cline }
20797e4b21b8STom Zanussi if (not_first++)
20807e4b21b8STom Zanussi fprintf(ofp, ", ");
20817e4b21b8STom Zanussi if (++count % 5 == 0)
20827e4b21b8STom Zanussi fprintf(ofp, "\n\t\t");
20837e4b21b8STom Zanussi fprintf(ofp, "perf_sample_dict");
20847e4b21b8STom Zanussi
20857e4b21b8STom Zanussi fprintf(ofp, "):\n");
20867e4b21b8STom Zanussi
20877e4b21b8STom Zanussi fprintf(ofp, "\t\tprint_header(event_name, common_cpu, "
20887e4b21b8STom Zanussi "common_secs, common_nsecs,\n\t\t\t"
20897e4b21b8STom Zanussi "common_pid, common_comm)\n\n");
20907e4b21b8STom Zanussi
20917e4b21b8STom Zanussi fprintf(ofp, "\t\tprint(\"");
2092bb39ccb2STzvetomir Stoyanov (VMware)
2093bb39ccb2STzvetomir Stoyanov (VMware) not_first = 0;
2094bb39ccb2STzvetomir Stoyanov (VMware) count = 0;
2095bb39ccb2STzvetomir Stoyanov (VMware)
20967e4b21b8STom Zanussi for (f = event->format.fields; f; f = f->next) {
2097bb39ccb2STzvetomir Stoyanov (VMware) if (not_first++)
20987e4b21b8STom Zanussi fprintf(ofp, ", ");
20997e4b21b8STom Zanussi if (count && count % 3 == 0) {
21007e4b21b8STom Zanussi fprintf(ofp, "\" \\\n\t\t\"");
21017e4b21b8STom Zanussi }
21027e4b21b8STom Zanussi count++;
21030f5f5bcdSJoseph Schuchart
21047e4b21b8STom Zanussi fprintf(ofp, "%s=", f->name);
21057e4b21b8STom Zanussi if (f->flags & TEP_FIELD_IS_STRING ||
21067e4b21b8STom Zanussi f->flags & TEP_FIELD_IS_FLAG ||
21077e4b21b8STom Zanussi f->flags & TEP_FIELD_IS_ARRAY ||
21087e4b21b8STom Zanussi f->flags & TEP_FIELD_IS_SYMBOLIC)
21097e4b21b8STom Zanussi fprintf(ofp, "%%s");
21107e4b21b8STom Zanussi else if (f->flags & TEP_FIELD_IS_SIGNED)
21117e4b21b8STom Zanussi fprintf(ofp, "%%d");
21127e4b21b8STom Zanussi else
21137e4b21b8STom Zanussi fprintf(ofp, "%%u");
21147e4b21b8STom Zanussi }
2115bb39ccb2STzvetomir Stoyanov (VMware)
21167e4b21b8STom Zanussi fprintf(ofp, "\" %% \\\n\t\t(");
21177e4b21b8STom Zanussi
21187e4b21b8STom Zanussi not_first = 0;
21197e4b21b8STom Zanussi count = 0;
21207e4b21b8STom Zanussi
21217e4b21b8STom Zanussi for (f = event->format.fields; f; f = f->next) {
21227e4b21b8STom Zanussi if (not_first++)
21237e4b21b8STom Zanussi fprintf(ofp, ", ");
21247e4b21b8STom Zanussi
2125bb39ccb2STzvetomir Stoyanov (VMware) if (++count % 5 == 0)
21267e4b21b8STom Zanussi fprintf(ofp, "\n\t\t");
21277e4b21b8STom Zanussi
21287e4b21b8STom Zanussi if (f->flags & TEP_FIELD_IS_FLAG) {
21297e4b21b8STom Zanussi if ((count - 1) % 5 != 0) {
21307e4b21b8STom Zanussi fprintf(ofp, "\n\t\t");
21317e4b21b8STom Zanussi count = 4;
21327e4b21b8STom Zanussi }
21337e4b21b8STom Zanussi fprintf(ofp, "flag_str(\"");
21347e4b21b8STom Zanussi fprintf(ofp, "%s__%s\", ", event->system,
21357e4b21b8STom Zanussi event->name);
21367e4b21b8STom Zanussi fprintf(ofp, "\"%s\", %s)", f->name,
21377e4b21b8STom Zanussi f->name);
21387e4b21b8STom Zanussi } else if (f->flags & TEP_FIELD_IS_SYMBOLIC) {
2139877cc639SJeremy Cline if ((count - 1) % 5 != 0) {
21400f5f5bcdSJoseph Schuchart fprintf(ofp, "\n\t\t");
2141877cc639SJeremy Cline count = 4;
2142877cc639SJeremy Cline }
2143a6418605SArun Kalyanasundaram fprintf(ofp, "symbol_str(\"");
21440f5f5bcdSJoseph Schuchart fprintf(ofp, "%s__%s\", ", event->system,
21450f5f5bcdSJoseph Schuchart event->name);
2146ae24e9b5SEelco Chaudron fprintf(ofp, "\"%s\", %s)", f->name,
2147ae24e9b5SEelco Chaudron f->name);
2148ae24e9b5SEelco Chaudron } else
2149ae24e9b5SEelco Chaudron fprintf(ofp, "%s", f->name);
2150ae24e9b5SEelco Chaudron }
21510f5f5bcdSJoseph Schuchart
2152877cc639SJeremy Cline fprintf(ofp, "))\n\n");
2153877cc639SJeremy Cline
21540f5f5bcdSJoseph Schuchart fprintf(ofp, "\t\tprint('Sample: {'+"
21557e4b21b8STom Zanussi "get_dict_as_string(perf_sample_dict['sample'], ', ')+'}')\n\n");
21567e4b21b8STom Zanussi
21577e4b21b8STom Zanussi fprintf(ofp, "\t\tfor node in common_callchain:");
2158a6418605SArun Kalyanasundaram fprintf(ofp, "\n\t\t\tif 'sym' in node:");
21597e4b21b8STom Zanussi fprintf(ofp, "\n\t\t\t\tprint(\"\t[%%x] %%s%%s%%s%%s\" %% (");
2160877cc639SJeremy Cline fprintf(ofp, "\n\t\t\t\t\tnode['ip'], node['sym']['name'],");
2161877cc639SJeremy Cline fprintf(ofp, "\n\t\t\t\t\t\"+0x{:x}\".format(node['sym_off']) if 'sym_off' in node else \"\",");
2162877cc639SJeremy Cline fprintf(ofp, "\n\t\t\t\t\t\" ({})\".format(node['dso']) if 'dso' in node else \"\",");
21637e4b21b8STom Zanussi fprintf(ofp, "\n\t\t\t\t\t\" \" + node['sym_srcline'] if 'sym_srcline' in node else \"\"))");
21647e4b21b8STom Zanussi fprintf(ofp, "\n\t\t\telse:");
21657e4b21b8STom Zanussi fprintf(ofp, "\n\t\t\t\tprint(\"\t[%%x]\" %% (node['ip']))\n\n");
2166877cc639SJeremy Cline fprintf(ofp, "\t\tprint()\n\n");
2167877cc639SJeremy Cline
2168a6418605SArun Kalyanasundaram }
2169a6418605SArun Kalyanasundaram
2170a6418605SArun Kalyanasundaram fprintf(ofp, "def trace_unhandled(event_name, context, "
2171a6418605SArun Kalyanasundaram "event_fields_dict, perf_sample_dict):\n");
21727e4b21b8STom Zanussi
21737e4b21b8STom Zanussi fprintf(ofp, "\t\tprint(get_dict_as_string(event_fields_dict))\n");
21747e4b21b8STom Zanussi fprintf(ofp, "\t\tprint('Sample: {'+"
21757e4b21b8STom Zanussi "get_dict_as_string(perf_sample_dict['sample'], ', ')+'}')\n\n");
21767e4b21b8STom Zanussi
21777e4b21b8STom Zanussi fprintf(ofp, "def print_header("
21787e4b21b8STom Zanussi "event_name, cpu, secs, nsecs, pid, comm):\n"
217980c3a7d9SAdrian Hunter "\tprint(\"%%-20s %%5u %%05u.%%09u %%8u %%-20s \" %% \\\n\t"
218080c3a7d9SAdrian Hunter "(event_name, cpu, secs, nsecs, pid, comm), end=\"\")\n\n");
218180c3a7d9SAdrian Hunter
218280c3a7d9SAdrian Hunter fprintf(ofp, "def get_dict_as_string(a_dict, delimiter=' '):\n"
218380c3a7d9SAdrian Hunter "\treturn delimiter.join"
218480c3a7d9SAdrian Hunter "(['%%s=%%s'%%(k,str(v))for k,v in sorted(a_dict.items())])\n");
218580c3a7d9SAdrian Hunter
218680c3a7d9SAdrian Hunter fclose(ofp);
218780c3a7d9SAdrian Hunter
218880c3a7d9SAdrian Hunter fprintf(stderr, "generated Python script: %s\n", fname);
218980c3a7d9SAdrian Hunter
219080c3a7d9SAdrian Hunter return 0;
21917e4b21b8STom Zanussi }
21927e4b21b8STom Zanussi #else
python_generate_script(struct tep_handle * pevent __maybe_unused,const char * outfile __maybe_unused)21937e4b21b8STom Zanussi static int python_generate_script(struct tep_handle *pevent __maybe_unused,
21946ea4b5dbSAdrian Hunter const char *outfile __maybe_unused)
21957e4b21b8STom Zanussi {
2196d445dd2aSAdrian Hunter fprintf(stderr, "Generating Python perf-script is not supported."
21977e4b21b8STom Zanussi " Install libtraceevent and rebuild perf to enable it.\n"
21987e4b21b8STom Zanussi "For example:\n # apt install libtraceevent-dev (ubuntu)"
2199abde8722SAdrian Hunter "\n # yum install libtraceevent-devel (Fedora)"
22002ede9217SAdrian Hunter "\n etc.\n");
2201aef90263SJiri Olsa return -1;
2202aef90263SJiri Olsa }
2203538d9c18SStephen Brennan #endif
22047e4b21b8STom Zanussi
22057e4b21b8STom Zanussi struct scripting_ops python_scripting_ops = {
2206 .name = "Python",
2207 .dirname = "python",
2208 .start_script = python_start_script,
2209 .flush_script = python_flush_script,
2210 .stop_script = python_stop_script,
2211 .process_event = python_process_event,
2212 .process_switch = python_process_switch,
2213 .process_auxtrace_error = python_process_auxtrace_error,
2214 .process_stat = python_process_stat,
2215 .process_stat_interval = python_process_stat_interval,
2216 .process_throttle = python_process_throttle,
2217 .generate_script = python_generate_script,
2218 };
2219