xref: /linux/tools/perf/util/scripting-engines/trace-event-python.c (revision c405c37bd9022ece118099fa39040bee8c5adbff)
1  /*
2   * trace-event-python.  Feed trace events to an embedded Python interpreter.
3   *
4   * Copyright (C) 2010 Tom Zanussi <tzanussi@gmail.com>
5   *
6   *  This program is free software; you can redistribute it and/or modify
7   *  it under the terms of the GNU General Public License as published by
8   *  the Free Software Foundation; either version 2 of the License, or
9   *  (at your option) any later version.
10   *
11   *  This program is distributed in the hope that it will be useful,
12   *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13   *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   *  GNU General Public License for more details.
15   *
16   *  You should have received a copy of the GNU General Public License
17   *  along with this program; if not, write to the Free Software
18   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19   *
20   */
21  
22  #include <Python.h>
23  
24  #include <inttypes.h>
25  #include <stdio.h>
26  #include <stdlib.h>
27  #include <string.h>
28  #include <stdbool.h>
29  #include <errno.h>
30  #include <linux/bitmap.h>
31  #include <linux/compiler.h>
32  #include <linux/time64.h>
33  
34  #include "../../perf.h"
35  #include "../debug.h"
36  #include "../callchain.h"
37  #include "../evsel.h"
38  #include "../util.h"
39  #include "../event.h"
40  #include "../thread.h"
41  #include "../comm.h"
42  #include "../machine.h"
43  #include "../db-export.h"
44  #include "../thread-stack.h"
45  #include "../trace-event.h"
46  #include "../call-path.h"
47  #include "map.h"
48  #include "symbol.h"
49  #include "thread_map.h"
50  #include "cpumap.h"
51  #include "print_binary.h"
52  #include "stat.h"
53  #include "mem-events.h"
54  
55  #if PY_MAJOR_VERSION < 3
56  #define _PyUnicode_FromString(arg) \
57    PyString_FromString(arg)
58  #define _PyUnicode_FromStringAndSize(arg1, arg2) \
59    PyString_FromStringAndSize((arg1), (arg2))
60  #define _PyBytes_FromStringAndSize(arg1, arg2) \
61    PyString_FromStringAndSize((arg1), (arg2))
62  #define _PyLong_FromLong(arg) \
63    PyInt_FromLong(arg)
64  #define _PyLong_AsLong(arg) \
65    PyInt_AsLong(arg)
66  #define _PyCapsule_New(arg1, arg2, arg3) \
67    PyCObject_FromVoidPtr((arg1), (arg2))
68  
69  PyMODINIT_FUNC initperf_trace_context(void);
70  #else
71  #define _PyUnicode_FromString(arg) \
72    PyUnicode_FromString(arg)
73  #define _PyUnicode_FromStringAndSize(arg1, arg2) \
74    PyUnicode_FromStringAndSize((arg1), (arg2))
75  #define _PyBytes_FromStringAndSize(arg1, arg2) \
76    PyBytes_FromStringAndSize((arg1), (arg2))
77  #define _PyLong_FromLong(arg) \
78    PyLong_FromLong(arg)
79  #define _PyLong_AsLong(arg) \
80    PyLong_AsLong(arg)
81  #define _PyCapsule_New(arg1, arg2, arg3) \
82    PyCapsule_New((arg1), (arg2), (arg3))
83  
84  PyMODINIT_FUNC PyInit_perf_trace_context(void);
85  #endif
86  
87  #define TRACE_EVENT_TYPE_MAX				\
88  	((1 << (sizeof(unsigned short) * 8)) - 1)
89  
90  static DECLARE_BITMAP(events_defined, TRACE_EVENT_TYPE_MAX);
91  
92  #define MAX_FIELDS	64
93  #define N_COMMON_FIELDS	7
94  
95  extern struct scripting_context *scripting_context;
96  
97  static char *cur_field_name;
98  static int zero_flag_atom;
99  
100  static PyObject *main_module, *main_dict;
101  
102  struct tables {
103  	struct db_export	dbe;
104  	PyObject		*evsel_handler;
105  	PyObject		*machine_handler;
106  	PyObject		*thread_handler;
107  	PyObject		*comm_handler;
108  	PyObject		*comm_thread_handler;
109  	PyObject		*dso_handler;
110  	PyObject		*symbol_handler;
111  	PyObject		*branch_type_handler;
112  	PyObject		*sample_handler;
113  	PyObject		*call_path_handler;
114  	PyObject		*call_return_handler;
115  	PyObject		*synth_handler;
116  	bool			db_export_mode;
117  };
118  
119  static struct tables tables_global;
120  
121  static void handler_call_die(const char *handler_name) __noreturn;
122  static void handler_call_die(const char *handler_name)
123  {
124  	PyErr_Print();
125  	Py_FatalError("problem in Python trace event handler");
126  	// Py_FatalError does not return
127  	// but we have to make the compiler happy
128  	abort();
129  }
130  
131  /*
132   * Insert val into into the dictionary and decrement the reference counter.
133   * This is necessary for dictionaries since PyDict_SetItemString() does not
134   * steal a reference, as opposed to PyTuple_SetItem().
135   */
136  static void pydict_set_item_string_decref(PyObject *dict, const char *key, PyObject *val)
137  {
138  	PyDict_SetItemString(dict, key, val);
139  	Py_DECREF(val);
140  }
141  
142  static PyObject *get_handler(const char *handler_name)
143  {
144  	PyObject *handler;
145  
146  	handler = PyDict_GetItemString(main_dict, handler_name);
147  	if (handler && !PyCallable_Check(handler))
148  		return NULL;
149  	return handler;
150  }
151  
152  static int get_argument_count(PyObject *handler)
153  {
154  	int arg_count = 0;
155  
156  	/*
157  	 * The attribute for the code object is func_code in Python 2,
158  	 * whereas it is __code__ in Python 3.0+.
159  	 */
160  	PyObject *code_obj = PyObject_GetAttrString(handler,
161  		"func_code");
162  	if (PyErr_Occurred()) {
163  		PyErr_Clear();
164  		code_obj = PyObject_GetAttrString(handler,
165  			"__code__");
166  	}
167  	PyErr_Clear();
168  	if (code_obj) {
169  		PyObject *arg_count_obj = PyObject_GetAttrString(code_obj,
170  			"co_argcount");
171  		if (arg_count_obj) {
172  			arg_count = (int) _PyLong_AsLong(arg_count_obj);
173  			Py_DECREF(arg_count_obj);
174  		}
175  		Py_DECREF(code_obj);
176  	}
177  	return arg_count;
178  }
179  
180  static void call_object(PyObject *handler, PyObject *args, const char *die_msg)
181  {
182  	PyObject *retval;
183  
184  	retval = PyObject_CallObject(handler, args);
185  	if (retval == NULL)
186  		handler_call_die(die_msg);
187  	Py_DECREF(retval);
188  }
189  
190  static void try_call_object(const char *handler_name, PyObject *args)
191  {
192  	PyObject *handler;
193  
194  	handler = get_handler(handler_name);
195  	if (handler)
196  		call_object(handler, args, handler_name);
197  }
198  
199  static void define_value(enum tep_print_arg_type field_type,
200  			 const char *ev_name,
201  			 const char *field_name,
202  			 const char *field_value,
203  			 const char *field_str)
204  {
205  	const char *handler_name = "define_flag_value";
206  	PyObject *t;
207  	unsigned long long value;
208  	unsigned n = 0;
209  
210  	if (field_type == TEP_PRINT_SYMBOL)
211  		handler_name = "define_symbolic_value";
212  
213  	t = PyTuple_New(4);
214  	if (!t)
215  		Py_FatalError("couldn't create Python tuple");
216  
217  	value = eval_flag(field_value);
218  
219  	PyTuple_SetItem(t, n++, _PyUnicode_FromString(ev_name));
220  	PyTuple_SetItem(t, n++, _PyUnicode_FromString(field_name));
221  	PyTuple_SetItem(t, n++, _PyLong_FromLong(value));
222  	PyTuple_SetItem(t, n++, _PyUnicode_FromString(field_str));
223  
224  	try_call_object(handler_name, t);
225  
226  	Py_DECREF(t);
227  }
228  
229  static void define_values(enum tep_print_arg_type field_type,
230  			  struct tep_print_flag_sym *field,
231  			  const char *ev_name,
232  			  const char *field_name)
233  {
234  	define_value(field_type, ev_name, field_name, field->value,
235  		     field->str);
236  
237  	if (field->next)
238  		define_values(field_type, field->next, ev_name, field_name);
239  }
240  
241  static void define_field(enum tep_print_arg_type field_type,
242  			 const char *ev_name,
243  			 const char *field_name,
244  			 const char *delim)
245  {
246  	const char *handler_name = "define_flag_field";
247  	PyObject *t;
248  	unsigned n = 0;
249  
250  	if (field_type == TEP_PRINT_SYMBOL)
251  		handler_name = "define_symbolic_field";
252  
253  	if (field_type == TEP_PRINT_FLAGS)
254  		t = PyTuple_New(3);
255  	else
256  		t = PyTuple_New(2);
257  	if (!t)
258  		Py_FatalError("couldn't create Python tuple");
259  
260  	PyTuple_SetItem(t, n++, _PyUnicode_FromString(ev_name));
261  	PyTuple_SetItem(t, n++, _PyUnicode_FromString(field_name));
262  	if (field_type == TEP_PRINT_FLAGS)
263  		PyTuple_SetItem(t, n++, _PyUnicode_FromString(delim));
264  
265  	try_call_object(handler_name, t);
266  
267  	Py_DECREF(t);
268  }
269  
270  static void define_event_symbols(struct tep_event *event,
271  				 const char *ev_name,
272  				 struct tep_print_arg *args)
273  {
274  	if (args == NULL)
275  		return;
276  
277  	switch (args->type) {
278  	case TEP_PRINT_NULL:
279  		break;
280  	case TEP_PRINT_ATOM:
281  		define_value(TEP_PRINT_FLAGS, ev_name, cur_field_name, "0",
282  			     args->atom.atom);
283  		zero_flag_atom = 0;
284  		break;
285  	case TEP_PRINT_FIELD:
286  		free(cur_field_name);
287  		cur_field_name = strdup(args->field.name);
288  		break;
289  	case TEP_PRINT_FLAGS:
290  		define_event_symbols(event, ev_name, args->flags.field);
291  		define_field(TEP_PRINT_FLAGS, ev_name, cur_field_name,
292  			     args->flags.delim);
293  		define_values(TEP_PRINT_FLAGS, args->flags.flags, ev_name,
294  			      cur_field_name);
295  		break;
296  	case TEP_PRINT_SYMBOL:
297  		define_event_symbols(event, ev_name, args->symbol.field);
298  		define_field(TEP_PRINT_SYMBOL, ev_name, cur_field_name, NULL);
299  		define_values(TEP_PRINT_SYMBOL, args->symbol.symbols, ev_name,
300  			      cur_field_name);
301  		break;
302  	case TEP_PRINT_HEX:
303  	case TEP_PRINT_HEX_STR:
304  		define_event_symbols(event, ev_name, args->hex.field);
305  		define_event_symbols(event, ev_name, args->hex.size);
306  		break;
307  	case TEP_PRINT_INT_ARRAY:
308  		define_event_symbols(event, ev_name, args->int_array.field);
309  		define_event_symbols(event, ev_name, args->int_array.count);
310  		define_event_symbols(event, ev_name, args->int_array.el_size);
311  		break;
312  	case TEP_PRINT_STRING:
313  		break;
314  	case TEP_PRINT_TYPE:
315  		define_event_symbols(event, ev_name, args->typecast.item);
316  		break;
317  	case TEP_PRINT_OP:
318  		if (strcmp(args->op.op, ":") == 0)
319  			zero_flag_atom = 1;
320  		define_event_symbols(event, ev_name, args->op.left);
321  		define_event_symbols(event, ev_name, args->op.right);
322  		break;
323  	default:
324  		/* gcc warns for these? */
325  	case TEP_PRINT_BSTRING:
326  	case TEP_PRINT_DYNAMIC_ARRAY:
327  	case TEP_PRINT_DYNAMIC_ARRAY_LEN:
328  	case TEP_PRINT_FUNC:
329  	case TEP_PRINT_BITMASK:
330  		/* we should warn... */
331  		return;
332  	}
333  
334  	if (args->next)
335  		define_event_symbols(event, ev_name, args->next);
336  }
337  
338  static PyObject *get_field_numeric_entry(struct tep_event *event,
339  		struct tep_format_field *field, void *data)
340  {
341  	bool is_array = field->flags & TEP_FIELD_IS_ARRAY;
342  	PyObject *obj = NULL, *list = NULL;
343  	unsigned long long val;
344  	unsigned int item_size, n_items, i;
345  
346  	if (is_array) {
347  		list = PyList_New(field->arraylen);
348  		item_size = field->size / field->arraylen;
349  		n_items = field->arraylen;
350  	} else {
351  		item_size = field->size;
352  		n_items = 1;
353  	}
354  
355  	for (i = 0; i < n_items; i++) {
356  
357  		val = read_size(event, data + field->offset + i * item_size,
358  				item_size);
359  		if (field->flags & TEP_FIELD_IS_SIGNED) {
360  			if ((long long)val >= LONG_MIN &&
361  					(long long)val <= LONG_MAX)
362  				obj = _PyLong_FromLong(val);
363  			else
364  				obj = PyLong_FromLongLong(val);
365  		} else {
366  			if (val <= LONG_MAX)
367  				obj = _PyLong_FromLong(val);
368  			else
369  				obj = PyLong_FromUnsignedLongLong(val);
370  		}
371  		if (is_array)
372  			PyList_SET_ITEM(list, i, obj);
373  	}
374  	if (is_array)
375  		obj = list;
376  	return obj;
377  }
378  
379  static const char *get_dsoname(struct map *map)
380  {
381  	const char *dsoname = "[unknown]";
382  
383  	if (map && map->dso) {
384  		if (symbol_conf.show_kernel_path && map->dso->long_name)
385  			dsoname = map->dso->long_name;
386  		else
387  			dsoname = map->dso->name;
388  	}
389  
390  	return dsoname;
391  }
392  
393  static PyObject *python_process_callchain(struct perf_sample *sample,
394  					 struct perf_evsel *evsel,
395  					 struct addr_location *al)
396  {
397  	PyObject *pylist;
398  
399  	pylist = PyList_New(0);
400  	if (!pylist)
401  		Py_FatalError("couldn't create Python list");
402  
403  	if (!symbol_conf.use_callchain || !sample->callchain)
404  		goto exit;
405  
406  	if (thread__resolve_callchain(al->thread, &callchain_cursor, evsel,
407  				      sample, NULL, NULL,
408  				      scripting_max_stack) != 0) {
409  		pr_err("Failed to resolve callchain. Skipping\n");
410  		goto exit;
411  	}
412  	callchain_cursor_commit(&callchain_cursor);
413  
414  
415  	while (1) {
416  		PyObject *pyelem;
417  		struct callchain_cursor_node *node;
418  		node = callchain_cursor_current(&callchain_cursor);
419  		if (!node)
420  			break;
421  
422  		pyelem = PyDict_New();
423  		if (!pyelem)
424  			Py_FatalError("couldn't create Python dictionary");
425  
426  
427  		pydict_set_item_string_decref(pyelem, "ip",
428  				PyLong_FromUnsignedLongLong(node->ip));
429  
430  		if (node->sym) {
431  			PyObject *pysym  = PyDict_New();
432  			if (!pysym)
433  				Py_FatalError("couldn't create Python dictionary");
434  			pydict_set_item_string_decref(pysym, "start",
435  					PyLong_FromUnsignedLongLong(node->sym->start));
436  			pydict_set_item_string_decref(pysym, "end",
437  					PyLong_FromUnsignedLongLong(node->sym->end));
438  			pydict_set_item_string_decref(pysym, "binding",
439  					_PyLong_FromLong(node->sym->binding));
440  			pydict_set_item_string_decref(pysym, "name",
441  					_PyUnicode_FromStringAndSize(node->sym->name,
442  							node->sym->namelen));
443  			pydict_set_item_string_decref(pyelem, "sym", pysym);
444  		}
445  
446  		if (node->map) {
447  			const char *dsoname = get_dsoname(node->map);
448  
449  			pydict_set_item_string_decref(pyelem, "dso",
450  					_PyUnicode_FromString(dsoname));
451  		}
452  
453  		callchain_cursor_advance(&callchain_cursor);
454  		PyList_Append(pylist, pyelem);
455  		Py_DECREF(pyelem);
456  	}
457  
458  exit:
459  	return pylist;
460  }
461  
462  static PyObject *python_process_brstack(struct perf_sample *sample,
463  					struct thread *thread)
464  {
465  	struct branch_stack *br = sample->branch_stack;
466  	PyObject *pylist;
467  	u64 i;
468  
469  	pylist = PyList_New(0);
470  	if (!pylist)
471  		Py_FatalError("couldn't create Python list");
472  
473  	if (!(br && br->nr))
474  		goto exit;
475  
476  	for (i = 0; i < br->nr; i++) {
477  		PyObject *pyelem;
478  		struct addr_location al;
479  		const char *dsoname;
480  
481  		pyelem = PyDict_New();
482  		if (!pyelem)
483  			Py_FatalError("couldn't create Python dictionary");
484  
485  		pydict_set_item_string_decref(pyelem, "from",
486  		    PyLong_FromUnsignedLongLong(br->entries[i].from));
487  		pydict_set_item_string_decref(pyelem, "to",
488  		    PyLong_FromUnsignedLongLong(br->entries[i].to));
489  		pydict_set_item_string_decref(pyelem, "mispred",
490  		    PyBool_FromLong(br->entries[i].flags.mispred));
491  		pydict_set_item_string_decref(pyelem, "predicted",
492  		    PyBool_FromLong(br->entries[i].flags.predicted));
493  		pydict_set_item_string_decref(pyelem, "in_tx",
494  		    PyBool_FromLong(br->entries[i].flags.in_tx));
495  		pydict_set_item_string_decref(pyelem, "abort",
496  		    PyBool_FromLong(br->entries[i].flags.abort));
497  		pydict_set_item_string_decref(pyelem, "cycles",
498  		    PyLong_FromUnsignedLongLong(br->entries[i].flags.cycles));
499  
500  		thread__find_map_fb(thread, sample->cpumode,
501  				    br->entries[i].from, &al);
502  		dsoname = get_dsoname(al.map);
503  		pydict_set_item_string_decref(pyelem, "from_dsoname",
504  					      _PyUnicode_FromString(dsoname));
505  
506  		thread__find_map_fb(thread, sample->cpumode,
507  				    br->entries[i].to, &al);
508  		dsoname = get_dsoname(al.map);
509  		pydict_set_item_string_decref(pyelem, "to_dsoname",
510  					      _PyUnicode_FromString(dsoname));
511  
512  		PyList_Append(pylist, pyelem);
513  		Py_DECREF(pyelem);
514  	}
515  
516  exit:
517  	return pylist;
518  }
519  
520  static unsigned long get_offset(struct symbol *sym, struct addr_location *al)
521  {
522  	unsigned long offset;
523  
524  	if (al->addr < sym->end)
525  		offset = al->addr - sym->start;
526  	else
527  		offset = al->addr - al->map->start - sym->start;
528  
529  	return offset;
530  }
531  
532  static int get_symoff(struct symbol *sym, struct addr_location *al,
533  		      bool print_off, char *bf, int size)
534  {
535  	unsigned long offset;
536  
537  	if (!sym || !sym->name[0])
538  		return scnprintf(bf, size, "%s", "[unknown]");
539  
540  	if (!print_off)
541  		return scnprintf(bf, size, "%s", sym->name);
542  
543  	offset = get_offset(sym, al);
544  
545  	return scnprintf(bf, size, "%s+0x%x", sym->name, offset);
546  }
547  
548  static int get_br_mspred(struct branch_flags *flags, char *bf, int size)
549  {
550  	if (!flags->mispred  && !flags->predicted)
551  		return scnprintf(bf, size, "%s", "-");
552  
553  	if (flags->mispred)
554  		return scnprintf(bf, size, "%s", "M");
555  
556  	return scnprintf(bf, size, "%s", "P");
557  }
558  
559  static PyObject *python_process_brstacksym(struct perf_sample *sample,
560  					   struct thread *thread)
561  {
562  	struct branch_stack *br = sample->branch_stack;
563  	PyObject *pylist;
564  	u64 i;
565  	char bf[512];
566  	struct addr_location al;
567  
568  	pylist = PyList_New(0);
569  	if (!pylist)
570  		Py_FatalError("couldn't create Python list");
571  
572  	if (!(br && br->nr))
573  		goto exit;
574  
575  	for (i = 0; i < br->nr; i++) {
576  		PyObject *pyelem;
577  
578  		pyelem = PyDict_New();
579  		if (!pyelem)
580  			Py_FatalError("couldn't create Python dictionary");
581  
582  		thread__find_symbol_fb(thread, sample->cpumode,
583  				       br->entries[i].from, &al);
584  		get_symoff(al.sym, &al, true, bf, sizeof(bf));
585  		pydict_set_item_string_decref(pyelem, "from",
586  					      _PyUnicode_FromString(bf));
587  
588  		thread__find_symbol_fb(thread, sample->cpumode,
589  				       br->entries[i].to, &al);
590  		get_symoff(al.sym, &al, true, bf, sizeof(bf));
591  		pydict_set_item_string_decref(pyelem, "to",
592  					      _PyUnicode_FromString(bf));
593  
594  		get_br_mspred(&br->entries[i].flags, bf, sizeof(bf));
595  		pydict_set_item_string_decref(pyelem, "pred",
596  					      _PyUnicode_FromString(bf));
597  
598  		if (br->entries[i].flags.in_tx) {
599  			pydict_set_item_string_decref(pyelem, "in_tx",
600  					      _PyUnicode_FromString("X"));
601  		} else {
602  			pydict_set_item_string_decref(pyelem, "in_tx",
603  					      _PyUnicode_FromString("-"));
604  		}
605  
606  		if (br->entries[i].flags.abort) {
607  			pydict_set_item_string_decref(pyelem, "abort",
608  					      _PyUnicode_FromString("A"));
609  		} else {
610  			pydict_set_item_string_decref(pyelem, "abort",
611  					      _PyUnicode_FromString("-"));
612  		}
613  
614  		PyList_Append(pylist, pyelem);
615  		Py_DECREF(pyelem);
616  	}
617  
618  exit:
619  	return pylist;
620  }
621  
622  static PyObject *get_sample_value_as_tuple(struct sample_read_value *value)
623  {
624  	PyObject *t;
625  
626  	t = PyTuple_New(2);
627  	if (!t)
628  		Py_FatalError("couldn't create Python tuple");
629  	PyTuple_SetItem(t, 0, PyLong_FromUnsignedLongLong(value->id));
630  	PyTuple_SetItem(t, 1, PyLong_FromUnsignedLongLong(value->value));
631  	return t;
632  }
633  
634  static void set_sample_read_in_dict(PyObject *dict_sample,
635  					 struct perf_sample *sample,
636  					 struct perf_evsel *evsel)
637  {
638  	u64 read_format = evsel->attr.read_format;
639  	PyObject *values;
640  	unsigned int i;
641  
642  	if (read_format & PERF_FORMAT_TOTAL_TIME_ENABLED) {
643  		pydict_set_item_string_decref(dict_sample, "time_enabled",
644  			PyLong_FromUnsignedLongLong(sample->read.time_enabled));
645  	}
646  
647  	if (read_format & PERF_FORMAT_TOTAL_TIME_RUNNING) {
648  		pydict_set_item_string_decref(dict_sample, "time_running",
649  			PyLong_FromUnsignedLongLong(sample->read.time_running));
650  	}
651  
652  	if (read_format & PERF_FORMAT_GROUP)
653  		values = PyList_New(sample->read.group.nr);
654  	else
655  		values = PyList_New(1);
656  
657  	if (!values)
658  		Py_FatalError("couldn't create Python list");
659  
660  	if (read_format & PERF_FORMAT_GROUP) {
661  		for (i = 0; i < sample->read.group.nr; i++) {
662  			PyObject *t = get_sample_value_as_tuple(&sample->read.group.values[i]);
663  			PyList_SET_ITEM(values, i, t);
664  		}
665  	} else {
666  		PyObject *t = get_sample_value_as_tuple(&sample->read.one);
667  		PyList_SET_ITEM(values, 0, t);
668  	}
669  	pydict_set_item_string_decref(dict_sample, "values", values);
670  }
671  
672  static void set_sample_datasrc_in_dict(PyObject *dict,
673  				       struct perf_sample *sample)
674  {
675  	struct mem_info mi = { .data_src.val = sample->data_src };
676  	char decode[100];
677  
678  	pydict_set_item_string_decref(dict, "datasrc",
679  			PyLong_FromUnsignedLongLong(sample->data_src));
680  
681  	perf_script__meminfo_scnprintf(decode, 100, &mi);
682  
683  	pydict_set_item_string_decref(dict, "datasrc_decode",
684  			_PyUnicode_FromString(decode));
685  }
686  
687  static int regs_map(struct regs_dump *regs, uint64_t mask, char *bf, int size)
688  {
689  	unsigned int i = 0, r;
690  	int printed = 0;
691  
692  	bf[0] = 0;
693  
694  	for_each_set_bit(r, (unsigned long *) &mask, sizeof(mask) * 8) {
695  		u64 val = regs->regs[i++];
696  
697  		printed += scnprintf(bf + printed, size - printed,
698  				     "%5s:0x%" PRIx64 " ",
699  				     perf_reg_name(r), val);
700  	}
701  
702  	return printed;
703  }
704  
705  static void set_regs_in_dict(PyObject *dict,
706  			     struct perf_sample *sample,
707  			     struct perf_evsel *evsel)
708  {
709  	struct perf_event_attr *attr = &evsel->attr;
710  	char bf[512];
711  
712  	regs_map(&sample->intr_regs, attr->sample_regs_intr, bf, sizeof(bf));
713  
714  	pydict_set_item_string_decref(dict, "iregs",
715  			_PyUnicode_FromString(bf));
716  
717  	regs_map(&sample->user_regs, attr->sample_regs_user, bf, sizeof(bf));
718  
719  	pydict_set_item_string_decref(dict, "uregs",
720  			_PyUnicode_FromString(bf));
721  }
722  
723  static PyObject *get_perf_sample_dict(struct perf_sample *sample,
724  					 struct perf_evsel *evsel,
725  					 struct addr_location *al,
726  					 PyObject *callchain)
727  {
728  	PyObject *dict, *dict_sample, *brstack, *brstacksym;
729  
730  	dict = PyDict_New();
731  	if (!dict)
732  		Py_FatalError("couldn't create Python dictionary");
733  
734  	dict_sample = PyDict_New();
735  	if (!dict_sample)
736  		Py_FatalError("couldn't create Python dictionary");
737  
738  	pydict_set_item_string_decref(dict, "ev_name", _PyUnicode_FromString(perf_evsel__name(evsel)));
739  	pydict_set_item_string_decref(dict, "attr", _PyBytes_FromStringAndSize((const char *)&evsel->attr, sizeof(evsel->attr)));
740  
741  	pydict_set_item_string_decref(dict_sample, "pid",
742  			_PyLong_FromLong(sample->pid));
743  	pydict_set_item_string_decref(dict_sample, "tid",
744  			_PyLong_FromLong(sample->tid));
745  	pydict_set_item_string_decref(dict_sample, "cpu",
746  			_PyLong_FromLong(sample->cpu));
747  	pydict_set_item_string_decref(dict_sample, "ip",
748  			PyLong_FromUnsignedLongLong(sample->ip));
749  	pydict_set_item_string_decref(dict_sample, "time",
750  			PyLong_FromUnsignedLongLong(sample->time));
751  	pydict_set_item_string_decref(dict_sample, "period",
752  			PyLong_FromUnsignedLongLong(sample->period));
753  	pydict_set_item_string_decref(dict_sample, "phys_addr",
754  			PyLong_FromUnsignedLongLong(sample->phys_addr));
755  	pydict_set_item_string_decref(dict_sample, "addr",
756  			PyLong_FromUnsignedLongLong(sample->addr));
757  	set_sample_read_in_dict(dict_sample, sample, evsel);
758  	pydict_set_item_string_decref(dict_sample, "weight",
759  			PyLong_FromUnsignedLongLong(sample->weight));
760  	pydict_set_item_string_decref(dict_sample, "transaction",
761  			PyLong_FromUnsignedLongLong(sample->transaction));
762  	set_sample_datasrc_in_dict(dict_sample, sample);
763  	pydict_set_item_string_decref(dict, "sample", dict_sample);
764  
765  	pydict_set_item_string_decref(dict, "raw_buf", _PyBytes_FromStringAndSize(
766  			(const char *)sample->raw_data, sample->raw_size));
767  	pydict_set_item_string_decref(dict, "comm",
768  			_PyUnicode_FromString(thread__comm_str(al->thread)));
769  	if (al->map) {
770  		pydict_set_item_string_decref(dict, "dso",
771  			_PyUnicode_FromString(al->map->dso->name));
772  	}
773  	if (al->sym) {
774  		pydict_set_item_string_decref(dict, "symbol",
775  			_PyUnicode_FromString(al->sym->name));
776  	}
777  
778  	pydict_set_item_string_decref(dict, "callchain", callchain);
779  
780  	brstack = python_process_brstack(sample, al->thread);
781  	pydict_set_item_string_decref(dict, "brstack", brstack);
782  
783  	brstacksym = python_process_brstacksym(sample, al->thread);
784  	pydict_set_item_string_decref(dict, "brstacksym", brstacksym);
785  
786  	set_regs_in_dict(dict, sample, evsel);
787  
788  	return dict;
789  }
790  
791  static void python_process_tracepoint(struct perf_sample *sample,
792  				      struct perf_evsel *evsel,
793  				      struct addr_location *al)
794  {
795  	struct tep_event *event = evsel->tp_format;
796  	PyObject *handler, *context, *t, *obj = NULL, *callchain;
797  	PyObject *dict = NULL, *all_entries_dict = NULL;
798  	static char handler_name[256];
799  	struct tep_format_field *field;
800  	unsigned long s, ns;
801  	unsigned n = 0;
802  	int pid;
803  	int cpu = sample->cpu;
804  	void *data = sample->raw_data;
805  	unsigned long long nsecs = sample->time;
806  	const char *comm = thread__comm_str(al->thread);
807  	const char *default_handler_name = "trace_unhandled";
808  
809  	if (!event) {
810  		snprintf(handler_name, sizeof(handler_name),
811  			 "ug! no event found for type %" PRIu64, (u64)evsel->attr.config);
812  		Py_FatalError(handler_name);
813  	}
814  
815  	pid = raw_field_value(event, "common_pid", data);
816  
817  	sprintf(handler_name, "%s__%s", event->system, event->name);
818  
819  	if (!test_and_set_bit(event->id, events_defined))
820  		define_event_symbols(event, handler_name, event->print_fmt.args);
821  
822  	handler = get_handler(handler_name);
823  	if (!handler) {
824  		handler = get_handler(default_handler_name);
825  		if (!handler)
826  			return;
827  		dict = PyDict_New();
828  		if (!dict)
829  			Py_FatalError("couldn't create Python dict");
830  	}
831  
832  	t = PyTuple_New(MAX_FIELDS);
833  	if (!t)
834  		Py_FatalError("couldn't create Python tuple");
835  
836  
837  	s = nsecs / NSEC_PER_SEC;
838  	ns = nsecs - s * NSEC_PER_SEC;
839  
840  	scripting_context->event_data = data;
841  	scripting_context->pevent = evsel->tp_format->tep;
842  
843  	context = _PyCapsule_New(scripting_context, NULL, NULL);
844  
845  	PyTuple_SetItem(t, n++, _PyUnicode_FromString(handler_name));
846  	PyTuple_SetItem(t, n++, context);
847  
848  	/* ip unwinding */
849  	callchain = python_process_callchain(sample, evsel, al);
850  	/* Need an additional reference for the perf_sample dict */
851  	Py_INCREF(callchain);
852  
853  	if (!dict) {
854  		PyTuple_SetItem(t, n++, _PyLong_FromLong(cpu));
855  		PyTuple_SetItem(t, n++, _PyLong_FromLong(s));
856  		PyTuple_SetItem(t, n++, _PyLong_FromLong(ns));
857  		PyTuple_SetItem(t, n++, _PyLong_FromLong(pid));
858  		PyTuple_SetItem(t, n++, _PyUnicode_FromString(comm));
859  		PyTuple_SetItem(t, n++, callchain);
860  	} else {
861  		pydict_set_item_string_decref(dict, "common_cpu", _PyLong_FromLong(cpu));
862  		pydict_set_item_string_decref(dict, "common_s", _PyLong_FromLong(s));
863  		pydict_set_item_string_decref(dict, "common_ns", _PyLong_FromLong(ns));
864  		pydict_set_item_string_decref(dict, "common_pid", _PyLong_FromLong(pid));
865  		pydict_set_item_string_decref(dict, "common_comm", _PyUnicode_FromString(comm));
866  		pydict_set_item_string_decref(dict, "common_callchain", callchain);
867  	}
868  	for (field = event->format.fields; field; field = field->next) {
869  		unsigned int offset, len;
870  		unsigned long long val;
871  
872  		if (field->flags & TEP_FIELD_IS_ARRAY) {
873  			offset = field->offset;
874  			len    = field->size;
875  			if (field->flags & TEP_FIELD_IS_DYNAMIC) {
876  				val     = tep_read_number(scripting_context->pevent,
877  							  data + offset, len);
878  				offset  = val;
879  				len     = offset >> 16;
880  				offset &= 0xffff;
881  			}
882  			if (field->flags & TEP_FIELD_IS_STRING &&
883  			    is_printable_array(data + offset, len)) {
884  				obj = _PyUnicode_FromString((char *) data + offset);
885  			} else {
886  				obj = PyByteArray_FromStringAndSize((const char *) data + offset, len);
887  				field->flags &= ~TEP_FIELD_IS_STRING;
888  			}
889  		} else { /* FIELD_IS_NUMERIC */
890  			obj = get_field_numeric_entry(event, field, data);
891  		}
892  		if (!dict)
893  			PyTuple_SetItem(t, n++, obj);
894  		else
895  			pydict_set_item_string_decref(dict, field->name, obj);
896  
897  	}
898  
899  	if (dict)
900  		PyTuple_SetItem(t, n++, dict);
901  
902  	if (get_argument_count(handler) == (int) n + 1) {
903  		all_entries_dict = get_perf_sample_dict(sample, evsel, al,
904  			callchain);
905  		PyTuple_SetItem(t, n++,	all_entries_dict);
906  	} else {
907  		Py_DECREF(callchain);
908  	}
909  
910  	if (_PyTuple_Resize(&t, n) == -1)
911  		Py_FatalError("error resizing Python tuple");
912  
913  	if (!dict)
914  		call_object(handler, t, handler_name);
915  	else
916  		call_object(handler, t, default_handler_name);
917  
918  	Py_DECREF(t);
919  }
920  
921  static PyObject *tuple_new(unsigned int sz)
922  {
923  	PyObject *t;
924  
925  	t = PyTuple_New(sz);
926  	if (!t)
927  		Py_FatalError("couldn't create Python tuple");
928  	return t;
929  }
930  
931  static int tuple_set_u64(PyObject *t, unsigned int pos, u64 val)
932  {
933  #if BITS_PER_LONG == 64
934  	return PyTuple_SetItem(t, pos, _PyLong_FromLong(val));
935  #endif
936  #if BITS_PER_LONG == 32
937  	return PyTuple_SetItem(t, pos, PyLong_FromLongLong(val));
938  #endif
939  }
940  
941  static int tuple_set_s32(PyObject *t, unsigned int pos, s32 val)
942  {
943  	return PyTuple_SetItem(t, pos, _PyLong_FromLong(val));
944  }
945  
946  static int tuple_set_string(PyObject *t, unsigned int pos, const char *s)
947  {
948  	return PyTuple_SetItem(t, pos, _PyUnicode_FromString(s));
949  }
950  
951  static int tuple_set_bytes(PyObject *t, unsigned int pos, void *bytes,
952  			   unsigned int sz)
953  {
954  	return PyTuple_SetItem(t, pos, _PyBytes_FromStringAndSize(bytes, sz));
955  }
956  
957  static int python_export_evsel(struct db_export *dbe, struct perf_evsel *evsel)
958  {
959  	struct tables *tables = container_of(dbe, struct tables, dbe);
960  	PyObject *t;
961  
962  	t = tuple_new(2);
963  
964  	tuple_set_u64(t, 0, evsel->db_id);
965  	tuple_set_string(t, 1, perf_evsel__name(evsel));
966  
967  	call_object(tables->evsel_handler, t, "evsel_table");
968  
969  	Py_DECREF(t);
970  
971  	return 0;
972  }
973  
974  static int python_export_machine(struct db_export *dbe,
975  				 struct machine *machine)
976  {
977  	struct tables *tables = container_of(dbe, struct tables, dbe);
978  	PyObject *t;
979  
980  	t = tuple_new(3);
981  
982  	tuple_set_u64(t, 0, machine->db_id);
983  	tuple_set_s32(t, 1, machine->pid);
984  	tuple_set_string(t, 2, machine->root_dir ? machine->root_dir : "");
985  
986  	call_object(tables->machine_handler, t, "machine_table");
987  
988  	Py_DECREF(t);
989  
990  	return 0;
991  }
992  
993  static int python_export_thread(struct db_export *dbe, struct thread *thread,
994  				u64 main_thread_db_id, struct machine *machine)
995  {
996  	struct tables *tables = container_of(dbe, struct tables, dbe);
997  	PyObject *t;
998  
999  	t = tuple_new(5);
1000  
1001  	tuple_set_u64(t, 0, thread->db_id);
1002  	tuple_set_u64(t, 1, machine->db_id);
1003  	tuple_set_u64(t, 2, main_thread_db_id);
1004  	tuple_set_s32(t, 3, thread->pid_);
1005  	tuple_set_s32(t, 4, thread->tid);
1006  
1007  	call_object(tables->thread_handler, t, "thread_table");
1008  
1009  	Py_DECREF(t);
1010  
1011  	return 0;
1012  }
1013  
1014  static int python_export_comm(struct db_export *dbe, struct comm *comm)
1015  {
1016  	struct tables *tables = container_of(dbe, struct tables, dbe);
1017  	PyObject *t;
1018  
1019  	t = tuple_new(2);
1020  
1021  	tuple_set_u64(t, 0, comm->db_id);
1022  	tuple_set_string(t, 1, comm__str(comm));
1023  
1024  	call_object(tables->comm_handler, t, "comm_table");
1025  
1026  	Py_DECREF(t);
1027  
1028  	return 0;
1029  }
1030  
1031  static int python_export_comm_thread(struct db_export *dbe, u64 db_id,
1032  				     struct comm *comm, struct thread *thread)
1033  {
1034  	struct tables *tables = container_of(dbe, struct tables, dbe);
1035  	PyObject *t;
1036  
1037  	t = tuple_new(3);
1038  
1039  	tuple_set_u64(t, 0, db_id);
1040  	tuple_set_u64(t, 1, comm->db_id);
1041  	tuple_set_u64(t, 2, thread->db_id);
1042  
1043  	call_object(tables->comm_thread_handler, t, "comm_thread_table");
1044  
1045  	Py_DECREF(t);
1046  
1047  	return 0;
1048  }
1049  
1050  static int python_export_dso(struct db_export *dbe, struct dso *dso,
1051  			     struct machine *machine)
1052  {
1053  	struct tables *tables = container_of(dbe, struct tables, dbe);
1054  	char sbuild_id[SBUILD_ID_SIZE];
1055  	PyObject *t;
1056  
1057  	build_id__sprintf(dso->build_id, sizeof(dso->build_id), sbuild_id);
1058  
1059  	t = tuple_new(5);
1060  
1061  	tuple_set_u64(t, 0, dso->db_id);
1062  	tuple_set_u64(t, 1, machine->db_id);
1063  	tuple_set_string(t, 2, dso->short_name);
1064  	tuple_set_string(t, 3, dso->long_name);
1065  	tuple_set_string(t, 4, sbuild_id);
1066  
1067  	call_object(tables->dso_handler, t, "dso_table");
1068  
1069  	Py_DECREF(t);
1070  
1071  	return 0;
1072  }
1073  
1074  static int python_export_symbol(struct db_export *dbe, struct symbol *sym,
1075  				struct dso *dso)
1076  {
1077  	struct tables *tables = container_of(dbe, struct tables, dbe);
1078  	u64 *sym_db_id = symbol__priv(sym);
1079  	PyObject *t;
1080  
1081  	t = tuple_new(6);
1082  
1083  	tuple_set_u64(t, 0, *sym_db_id);
1084  	tuple_set_u64(t, 1, dso->db_id);
1085  	tuple_set_u64(t, 2, sym->start);
1086  	tuple_set_u64(t, 3, sym->end);
1087  	tuple_set_s32(t, 4, sym->binding);
1088  	tuple_set_string(t, 5, sym->name);
1089  
1090  	call_object(tables->symbol_handler, t, "symbol_table");
1091  
1092  	Py_DECREF(t);
1093  
1094  	return 0;
1095  }
1096  
1097  static int python_export_branch_type(struct db_export *dbe, u32 branch_type,
1098  				     const char *name)
1099  {
1100  	struct tables *tables = container_of(dbe, struct tables, dbe);
1101  	PyObject *t;
1102  
1103  	t = tuple_new(2);
1104  
1105  	tuple_set_s32(t, 0, branch_type);
1106  	tuple_set_string(t, 1, name);
1107  
1108  	call_object(tables->branch_type_handler, t, "branch_type_table");
1109  
1110  	Py_DECREF(t);
1111  
1112  	return 0;
1113  }
1114  
1115  static void python_export_sample_table(struct db_export *dbe,
1116  				       struct export_sample *es)
1117  {
1118  	struct tables *tables = container_of(dbe, struct tables, dbe);
1119  	PyObject *t;
1120  
1121  	t = tuple_new(24);
1122  
1123  	tuple_set_u64(t, 0, es->db_id);
1124  	tuple_set_u64(t, 1, es->evsel->db_id);
1125  	tuple_set_u64(t, 2, es->al->machine->db_id);
1126  	tuple_set_u64(t, 3, es->al->thread->db_id);
1127  	tuple_set_u64(t, 4, es->comm_db_id);
1128  	tuple_set_u64(t, 5, es->dso_db_id);
1129  	tuple_set_u64(t, 6, es->sym_db_id);
1130  	tuple_set_u64(t, 7, es->offset);
1131  	tuple_set_u64(t, 8, es->sample->ip);
1132  	tuple_set_u64(t, 9, es->sample->time);
1133  	tuple_set_s32(t, 10, es->sample->cpu);
1134  	tuple_set_u64(t, 11, es->addr_dso_db_id);
1135  	tuple_set_u64(t, 12, es->addr_sym_db_id);
1136  	tuple_set_u64(t, 13, es->addr_offset);
1137  	tuple_set_u64(t, 14, es->sample->addr);
1138  	tuple_set_u64(t, 15, es->sample->period);
1139  	tuple_set_u64(t, 16, es->sample->weight);
1140  	tuple_set_u64(t, 17, es->sample->transaction);
1141  	tuple_set_u64(t, 18, es->sample->data_src);
1142  	tuple_set_s32(t, 19, es->sample->flags & PERF_BRANCH_MASK);
1143  	tuple_set_s32(t, 20, !!(es->sample->flags & PERF_IP_FLAG_IN_TX));
1144  	tuple_set_u64(t, 21, es->call_path_id);
1145  	tuple_set_u64(t, 22, es->sample->insn_cnt);
1146  	tuple_set_u64(t, 23, es->sample->cyc_cnt);
1147  
1148  	call_object(tables->sample_handler, t, "sample_table");
1149  
1150  	Py_DECREF(t);
1151  }
1152  
1153  static void python_export_synth(struct db_export *dbe, struct export_sample *es)
1154  {
1155  	struct tables *tables = container_of(dbe, struct tables, dbe);
1156  	PyObject *t;
1157  
1158  	t = tuple_new(3);
1159  
1160  	tuple_set_u64(t, 0, es->db_id);
1161  	tuple_set_u64(t, 1, es->evsel->attr.config);
1162  	tuple_set_bytes(t, 2, es->sample->raw_data, es->sample->raw_size);
1163  
1164  	call_object(tables->synth_handler, t, "synth_data");
1165  
1166  	Py_DECREF(t);
1167  }
1168  
1169  static int python_export_sample(struct db_export *dbe,
1170  				struct export_sample *es)
1171  {
1172  	struct tables *tables = container_of(dbe, struct tables, dbe);
1173  
1174  	python_export_sample_table(dbe, es);
1175  
1176  	if (es->evsel->attr.type == PERF_TYPE_SYNTH && tables->synth_handler)
1177  		python_export_synth(dbe, es);
1178  
1179  	return 0;
1180  }
1181  
1182  static int python_export_call_path(struct db_export *dbe, struct call_path *cp)
1183  {
1184  	struct tables *tables = container_of(dbe, struct tables, dbe);
1185  	PyObject *t;
1186  	u64 parent_db_id, sym_db_id;
1187  
1188  	parent_db_id = cp->parent ? cp->parent->db_id : 0;
1189  	sym_db_id = cp->sym ? *(u64 *)symbol__priv(cp->sym) : 0;
1190  
1191  	t = tuple_new(4);
1192  
1193  	tuple_set_u64(t, 0, cp->db_id);
1194  	tuple_set_u64(t, 1, parent_db_id);
1195  	tuple_set_u64(t, 2, sym_db_id);
1196  	tuple_set_u64(t, 3, cp->ip);
1197  
1198  	call_object(tables->call_path_handler, t, "call_path_table");
1199  
1200  	Py_DECREF(t);
1201  
1202  	return 0;
1203  }
1204  
1205  static int python_export_call_return(struct db_export *dbe,
1206  				     struct call_return *cr)
1207  {
1208  	struct tables *tables = container_of(dbe, struct tables, dbe);
1209  	u64 comm_db_id = cr->comm ? cr->comm->db_id : 0;
1210  	PyObject *t;
1211  
1212  	t = tuple_new(14);
1213  
1214  	tuple_set_u64(t, 0, cr->db_id);
1215  	tuple_set_u64(t, 1, cr->thread->db_id);
1216  	tuple_set_u64(t, 2, comm_db_id);
1217  	tuple_set_u64(t, 3, cr->cp->db_id);
1218  	tuple_set_u64(t, 4, cr->call_time);
1219  	tuple_set_u64(t, 5, cr->return_time);
1220  	tuple_set_u64(t, 6, cr->branch_count);
1221  	tuple_set_u64(t, 7, cr->call_ref);
1222  	tuple_set_u64(t, 8, cr->return_ref);
1223  	tuple_set_u64(t, 9, cr->cp->parent->db_id);
1224  	tuple_set_s32(t, 10, cr->flags);
1225  	tuple_set_u64(t, 11, cr->parent_db_id);
1226  	tuple_set_u64(t, 12, cr->insn_count);
1227  	tuple_set_u64(t, 13, cr->cyc_count);
1228  
1229  	call_object(tables->call_return_handler, t, "call_return_table");
1230  
1231  	Py_DECREF(t);
1232  
1233  	return 0;
1234  }
1235  
1236  static int python_process_call_return(struct call_return *cr, u64 *parent_db_id,
1237  				      void *data)
1238  {
1239  	struct db_export *dbe = data;
1240  
1241  	return db_export__call_return(dbe, cr, parent_db_id);
1242  }
1243  
1244  static void python_process_general_event(struct perf_sample *sample,
1245  					 struct perf_evsel *evsel,
1246  					 struct addr_location *al)
1247  {
1248  	PyObject *handler, *t, *dict, *callchain;
1249  	static char handler_name[64];
1250  	unsigned n = 0;
1251  
1252  	snprintf(handler_name, sizeof(handler_name), "%s", "process_event");
1253  
1254  	handler = get_handler(handler_name);
1255  	if (!handler)
1256  		return;
1257  
1258  	/*
1259  	 * Use the MAX_FIELDS to make the function expandable, though
1260  	 * currently there is only one item for the tuple.
1261  	 */
1262  	t = PyTuple_New(MAX_FIELDS);
1263  	if (!t)
1264  		Py_FatalError("couldn't create Python tuple");
1265  
1266  	/* ip unwinding */
1267  	callchain = python_process_callchain(sample, evsel, al);
1268  	dict = get_perf_sample_dict(sample, evsel, al, callchain);
1269  
1270  	PyTuple_SetItem(t, n++, dict);
1271  	if (_PyTuple_Resize(&t, n) == -1)
1272  		Py_FatalError("error resizing Python tuple");
1273  
1274  	call_object(handler, t, handler_name);
1275  
1276  	Py_DECREF(t);
1277  }
1278  
1279  static void python_process_event(union perf_event *event,
1280  				 struct perf_sample *sample,
1281  				 struct perf_evsel *evsel,
1282  				 struct addr_location *al)
1283  {
1284  	struct tables *tables = &tables_global;
1285  
1286  	switch (evsel->attr.type) {
1287  	case PERF_TYPE_TRACEPOINT:
1288  		python_process_tracepoint(sample, evsel, al);
1289  		break;
1290  	/* Reserve for future process_hw/sw/raw APIs */
1291  	default:
1292  		if (tables->db_export_mode)
1293  			db_export__sample(&tables->dbe, event, sample, evsel, al);
1294  		else
1295  			python_process_general_event(sample, evsel, al);
1296  	}
1297  }
1298  
1299  static void get_handler_name(char *str, size_t size,
1300  			     struct perf_evsel *evsel)
1301  {
1302  	char *p = str;
1303  
1304  	scnprintf(str, size, "stat__%s", perf_evsel__name(evsel));
1305  
1306  	while ((p = strchr(p, ':'))) {
1307  		*p = '_';
1308  		p++;
1309  	}
1310  }
1311  
1312  static void
1313  process_stat(struct perf_evsel *counter, int cpu, int thread, u64 tstamp,
1314  	     struct perf_counts_values *count)
1315  {
1316  	PyObject *handler, *t;
1317  	static char handler_name[256];
1318  	int n = 0;
1319  
1320  	t = PyTuple_New(MAX_FIELDS);
1321  	if (!t)
1322  		Py_FatalError("couldn't create Python tuple");
1323  
1324  	get_handler_name(handler_name, sizeof(handler_name),
1325  			 counter);
1326  
1327  	handler = get_handler(handler_name);
1328  	if (!handler) {
1329  		pr_debug("can't find python handler %s\n", handler_name);
1330  		return;
1331  	}
1332  
1333  	PyTuple_SetItem(t, n++, _PyLong_FromLong(cpu));
1334  	PyTuple_SetItem(t, n++, _PyLong_FromLong(thread));
1335  
1336  	tuple_set_u64(t, n++, tstamp);
1337  	tuple_set_u64(t, n++, count->val);
1338  	tuple_set_u64(t, n++, count->ena);
1339  	tuple_set_u64(t, n++, count->run);
1340  
1341  	if (_PyTuple_Resize(&t, n) == -1)
1342  		Py_FatalError("error resizing Python tuple");
1343  
1344  	call_object(handler, t, handler_name);
1345  
1346  	Py_DECREF(t);
1347  }
1348  
1349  static void python_process_stat(struct perf_stat_config *config,
1350  				struct perf_evsel *counter, u64 tstamp)
1351  {
1352  	struct thread_map *threads = counter->threads;
1353  	struct cpu_map *cpus = counter->cpus;
1354  	int cpu, thread;
1355  
1356  	if (config->aggr_mode == AGGR_GLOBAL) {
1357  		process_stat(counter, -1, -1, tstamp,
1358  			     &counter->counts->aggr);
1359  		return;
1360  	}
1361  
1362  	for (thread = 0; thread < threads->nr; thread++) {
1363  		for (cpu = 0; cpu < cpus->nr; cpu++) {
1364  			process_stat(counter, cpus->map[cpu],
1365  				     thread_map__pid(threads, thread), tstamp,
1366  				     perf_counts(counter->counts, cpu, thread));
1367  		}
1368  	}
1369  }
1370  
1371  static void python_process_stat_interval(u64 tstamp)
1372  {
1373  	PyObject *handler, *t;
1374  	static const char handler_name[] = "stat__interval";
1375  	int n = 0;
1376  
1377  	t = PyTuple_New(MAX_FIELDS);
1378  	if (!t)
1379  		Py_FatalError("couldn't create Python tuple");
1380  
1381  	handler = get_handler(handler_name);
1382  	if (!handler) {
1383  		pr_debug("can't find python handler %s\n", handler_name);
1384  		return;
1385  	}
1386  
1387  	tuple_set_u64(t, n++, tstamp);
1388  
1389  	if (_PyTuple_Resize(&t, n) == -1)
1390  		Py_FatalError("error resizing Python tuple");
1391  
1392  	call_object(handler, t, handler_name);
1393  
1394  	Py_DECREF(t);
1395  }
1396  
1397  static int run_start_sub(void)
1398  {
1399  	main_module = PyImport_AddModule("__main__");
1400  	if (main_module == NULL)
1401  		return -1;
1402  	Py_INCREF(main_module);
1403  
1404  	main_dict = PyModule_GetDict(main_module);
1405  	if (main_dict == NULL)
1406  		goto error;
1407  	Py_INCREF(main_dict);
1408  
1409  	try_call_object("trace_begin", NULL);
1410  
1411  	return 0;
1412  
1413  error:
1414  	Py_XDECREF(main_dict);
1415  	Py_XDECREF(main_module);
1416  	return -1;
1417  }
1418  
1419  #define SET_TABLE_HANDLER_(name, handler_name, table_name) do {		\
1420  	tables->handler_name = get_handler(#table_name);		\
1421  	if (tables->handler_name)					\
1422  		tables->dbe.export_ ## name = python_export_ ## name;	\
1423  } while (0)
1424  
1425  #define SET_TABLE_HANDLER(name) \
1426  	SET_TABLE_HANDLER_(name, name ## _handler, name ## _table)
1427  
1428  static void set_table_handlers(struct tables *tables)
1429  {
1430  	const char *perf_db_export_mode = "perf_db_export_mode";
1431  	const char *perf_db_export_calls = "perf_db_export_calls";
1432  	const char *perf_db_export_callchains = "perf_db_export_callchains";
1433  	PyObject *db_export_mode, *db_export_calls, *db_export_callchains;
1434  	bool export_calls = false;
1435  	bool export_callchains = false;
1436  	int ret;
1437  
1438  	memset(tables, 0, sizeof(struct tables));
1439  	if (db_export__init(&tables->dbe))
1440  		Py_FatalError("failed to initialize export");
1441  
1442  	db_export_mode = PyDict_GetItemString(main_dict, perf_db_export_mode);
1443  	if (!db_export_mode)
1444  		return;
1445  
1446  	ret = PyObject_IsTrue(db_export_mode);
1447  	if (ret == -1)
1448  		handler_call_die(perf_db_export_mode);
1449  	if (!ret)
1450  		return;
1451  
1452  	/* handle export calls */
1453  	tables->dbe.crp = NULL;
1454  	db_export_calls = PyDict_GetItemString(main_dict, perf_db_export_calls);
1455  	if (db_export_calls) {
1456  		ret = PyObject_IsTrue(db_export_calls);
1457  		if (ret == -1)
1458  			handler_call_die(perf_db_export_calls);
1459  		export_calls = !!ret;
1460  	}
1461  
1462  	if (export_calls) {
1463  		tables->dbe.crp =
1464  			call_return_processor__new(python_process_call_return,
1465  						   &tables->dbe);
1466  		if (!tables->dbe.crp)
1467  			Py_FatalError("failed to create calls processor");
1468  	}
1469  
1470  	/* handle export callchains */
1471  	tables->dbe.cpr = NULL;
1472  	db_export_callchains = PyDict_GetItemString(main_dict,
1473  						    perf_db_export_callchains);
1474  	if (db_export_callchains) {
1475  		ret = PyObject_IsTrue(db_export_callchains);
1476  		if (ret == -1)
1477  			handler_call_die(perf_db_export_callchains);
1478  		export_callchains = !!ret;
1479  	}
1480  
1481  	if (export_callchains) {
1482  		/*
1483  		 * Attempt to use the call path root from the call return
1484  		 * processor, if the call return processor is in use. Otherwise,
1485  		 * we allocate a new call path root. This prevents exporting
1486  		 * duplicate call path ids when both are in use simultaniously.
1487  		 */
1488  		if (tables->dbe.crp)
1489  			tables->dbe.cpr = tables->dbe.crp->cpr;
1490  		else
1491  			tables->dbe.cpr = call_path_root__new();
1492  
1493  		if (!tables->dbe.cpr)
1494  			Py_FatalError("failed to create call path root");
1495  	}
1496  
1497  	tables->db_export_mode = true;
1498  	/*
1499  	 * Reserve per symbol space for symbol->db_id via symbol__priv()
1500  	 */
1501  	symbol_conf.priv_size = sizeof(u64);
1502  
1503  	SET_TABLE_HANDLER(evsel);
1504  	SET_TABLE_HANDLER(machine);
1505  	SET_TABLE_HANDLER(thread);
1506  	SET_TABLE_HANDLER(comm);
1507  	SET_TABLE_HANDLER(comm_thread);
1508  	SET_TABLE_HANDLER(dso);
1509  	SET_TABLE_HANDLER(symbol);
1510  	SET_TABLE_HANDLER(branch_type);
1511  	SET_TABLE_HANDLER(sample);
1512  	SET_TABLE_HANDLER(call_path);
1513  	SET_TABLE_HANDLER(call_return);
1514  
1515  	/*
1516  	 * Synthesized events are samples but with architecture-specific data
1517  	 * stored in sample->raw_data. They are exported via
1518  	 * python_export_sample() and consequently do not need a separate export
1519  	 * callback.
1520  	 */
1521  	tables->synth_handler = get_handler("synth_data");
1522  }
1523  
1524  #if PY_MAJOR_VERSION < 3
1525  static void _free_command_line(const char **command_line, int num)
1526  {
1527  	free(command_line);
1528  }
1529  #else
1530  static void _free_command_line(wchar_t **command_line, int num)
1531  {
1532  	int i;
1533  	for (i = 0; i < num; i++)
1534  		PyMem_RawFree(command_line[i]);
1535  	free(command_line);
1536  }
1537  #endif
1538  
1539  
1540  /*
1541   * Start trace script
1542   */
1543  static int python_start_script(const char *script, int argc, const char **argv)
1544  {
1545  	struct tables *tables = &tables_global;
1546  	PyMODINIT_FUNC (*initfunc)(void);
1547  #if PY_MAJOR_VERSION < 3
1548  	const char **command_line;
1549  #else
1550  	wchar_t **command_line;
1551  #endif
1552  	/*
1553  	 * Use a non-const name variable to cope with python 2.6's
1554  	 * PyImport_AppendInittab prototype
1555  	 */
1556  	char buf[PATH_MAX], name[19] = "perf_trace_context";
1557  	int i, err = 0;
1558  	FILE *fp;
1559  
1560  #if PY_MAJOR_VERSION < 3
1561  	initfunc = initperf_trace_context;
1562  	command_line = malloc((argc + 1) * sizeof(const char *));
1563  	command_line[0] = script;
1564  	for (i = 1; i < argc + 1; i++)
1565  		command_line[i] = argv[i - 1];
1566  #else
1567  	initfunc = PyInit_perf_trace_context;
1568  	command_line = malloc((argc + 1) * sizeof(wchar_t *));
1569  	command_line[0] = Py_DecodeLocale(script, NULL);
1570  	for (i = 1; i < argc + 1; i++)
1571  		command_line[i] = Py_DecodeLocale(argv[i - 1], NULL);
1572  #endif
1573  
1574  	PyImport_AppendInittab(name, initfunc);
1575  	Py_Initialize();
1576  
1577  #if PY_MAJOR_VERSION < 3
1578  	PySys_SetArgv(argc + 1, (char **)command_line);
1579  #else
1580  	PySys_SetArgv(argc + 1, command_line);
1581  #endif
1582  
1583  	fp = fopen(script, "r");
1584  	if (!fp) {
1585  		sprintf(buf, "Can't open python script \"%s\"", script);
1586  		perror(buf);
1587  		err = -1;
1588  		goto error;
1589  	}
1590  
1591  	err = PyRun_SimpleFile(fp, script);
1592  	if (err) {
1593  		fprintf(stderr, "Error running python script %s\n", script);
1594  		goto error;
1595  	}
1596  
1597  	err = run_start_sub();
1598  	if (err) {
1599  		fprintf(stderr, "Error starting python script %s\n", script);
1600  		goto error;
1601  	}
1602  
1603  	set_table_handlers(tables);
1604  
1605  	if (tables->db_export_mode) {
1606  		err = db_export__branch_types(&tables->dbe);
1607  		if (err)
1608  			goto error;
1609  	}
1610  
1611  	_free_command_line(command_line, argc + 1);
1612  
1613  	return err;
1614  error:
1615  	Py_Finalize();
1616  	_free_command_line(command_line, argc + 1);
1617  
1618  	return err;
1619  }
1620  
1621  static int python_flush_script(void)
1622  {
1623  	struct tables *tables = &tables_global;
1624  
1625  	return db_export__flush(&tables->dbe);
1626  }
1627  
1628  /*
1629   * Stop trace script
1630   */
1631  static int python_stop_script(void)
1632  {
1633  	struct tables *tables = &tables_global;
1634  
1635  	try_call_object("trace_end", NULL);
1636  
1637  	db_export__exit(&tables->dbe);
1638  
1639  	Py_XDECREF(main_dict);
1640  	Py_XDECREF(main_module);
1641  	Py_Finalize();
1642  
1643  	return 0;
1644  }
1645  
1646  static int python_generate_script(struct tep_handle *pevent, const char *outfile)
1647  {
1648  	struct tep_event *event = NULL;
1649  	struct tep_format_field *f;
1650  	char fname[PATH_MAX];
1651  	int not_first, count;
1652  	FILE *ofp;
1653  
1654  	sprintf(fname, "%s.py", outfile);
1655  	ofp = fopen(fname, "w");
1656  	if (ofp == NULL) {
1657  		fprintf(stderr, "couldn't open %s\n", fname);
1658  		return -1;
1659  	}
1660  	fprintf(ofp, "# perf script event handlers, "
1661  		"generated by perf script -g python\n");
1662  
1663  	fprintf(ofp, "# Licensed under the terms of the GNU GPL"
1664  		" License version 2\n\n");
1665  
1666  	fprintf(ofp, "# The common_* event handler fields are the most useful "
1667  		"fields common to\n");
1668  
1669  	fprintf(ofp, "# all events.  They don't necessarily correspond to "
1670  		"the 'common_*' fields\n");
1671  
1672  	fprintf(ofp, "# in the format files.  Those fields not available as "
1673  		"handler params can\n");
1674  
1675  	fprintf(ofp, "# be retrieved using Python functions of the form "
1676  		"common_*(context).\n");
1677  
1678  	fprintf(ofp, "# See the perf-script-python Documentation for the list "
1679  		"of available functions.\n\n");
1680  
1681  	fprintf(ofp, "from __future__ import print_function\n\n");
1682  	fprintf(ofp, "import os\n");
1683  	fprintf(ofp, "import sys\n\n");
1684  
1685  	fprintf(ofp, "sys.path.append(os.environ['PERF_EXEC_PATH'] + \\\n");
1686  	fprintf(ofp, "\t'/scripts/python/Perf-Trace-Util/lib/Perf/Trace')\n");
1687  	fprintf(ofp, "\nfrom perf_trace_context import *\n");
1688  	fprintf(ofp, "from Core import *\n\n\n");
1689  
1690  	fprintf(ofp, "def trace_begin():\n");
1691  	fprintf(ofp, "\tprint(\"in trace_begin\")\n\n");
1692  
1693  	fprintf(ofp, "def trace_end():\n");
1694  	fprintf(ofp, "\tprint(\"in trace_end\")\n\n");
1695  
1696  	while ((event = trace_find_next_event(pevent, event))) {
1697  		fprintf(ofp, "def %s__%s(", event->system, event->name);
1698  		fprintf(ofp, "event_name, ");
1699  		fprintf(ofp, "context, ");
1700  		fprintf(ofp, "common_cpu,\n");
1701  		fprintf(ofp, "\tcommon_secs, ");
1702  		fprintf(ofp, "common_nsecs, ");
1703  		fprintf(ofp, "common_pid, ");
1704  		fprintf(ofp, "common_comm,\n\t");
1705  		fprintf(ofp, "common_callchain, ");
1706  
1707  		not_first = 0;
1708  		count = 0;
1709  
1710  		for (f = event->format.fields; f; f = f->next) {
1711  			if (not_first++)
1712  				fprintf(ofp, ", ");
1713  			if (++count % 5 == 0)
1714  				fprintf(ofp, "\n\t");
1715  
1716  			fprintf(ofp, "%s", f->name);
1717  		}
1718  		if (not_first++)
1719  			fprintf(ofp, ", ");
1720  		if (++count % 5 == 0)
1721  			fprintf(ofp, "\n\t\t");
1722  		fprintf(ofp, "perf_sample_dict");
1723  
1724  		fprintf(ofp, "):\n");
1725  
1726  		fprintf(ofp, "\t\tprint_header(event_name, common_cpu, "
1727  			"common_secs, common_nsecs,\n\t\t\t"
1728  			"common_pid, common_comm)\n\n");
1729  
1730  		fprintf(ofp, "\t\tprint(\"");
1731  
1732  		not_first = 0;
1733  		count = 0;
1734  
1735  		for (f = event->format.fields; f; f = f->next) {
1736  			if (not_first++)
1737  				fprintf(ofp, ", ");
1738  			if (count && count % 3 == 0) {
1739  				fprintf(ofp, "\" \\\n\t\t\"");
1740  			}
1741  			count++;
1742  
1743  			fprintf(ofp, "%s=", f->name);
1744  			if (f->flags & TEP_FIELD_IS_STRING ||
1745  			    f->flags & TEP_FIELD_IS_FLAG ||
1746  			    f->flags & TEP_FIELD_IS_ARRAY ||
1747  			    f->flags & TEP_FIELD_IS_SYMBOLIC)
1748  				fprintf(ofp, "%%s");
1749  			else if (f->flags & TEP_FIELD_IS_SIGNED)
1750  				fprintf(ofp, "%%d");
1751  			else
1752  				fprintf(ofp, "%%u");
1753  		}
1754  
1755  		fprintf(ofp, "\" %% \\\n\t\t(");
1756  
1757  		not_first = 0;
1758  		count = 0;
1759  
1760  		for (f = event->format.fields; f; f = f->next) {
1761  			if (not_first++)
1762  				fprintf(ofp, ", ");
1763  
1764  			if (++count % 5 == 0)
1765  				fprintf(ofp, "\n\t\t");
1766  
1767  			if (f->flags & TEP_FIELD_IS_FLAG) {
1768  				if ((count - 1) % 5 != 0) {
1769  					fprintf(ofp, "\n\t\t");
1770  					count = 4;
1771  				}
1772  				fprintf(ofp, "flag_str(\"");
1773  				fprintf(ofp, "%s__%s\", ", event->system,
1774  					event->name);
1775  				fprintf(ofp, "\"%s\", %s)", f->name,
1776  					f->name);
1777  			} else if (f->flags & TEP_FIELD_IS_SYMBOLIC) {
1778  				if ((count - 1) % 5 != 0) {
1779  					fprintf(ofp, "\n\t\t");
1780  					count = 4;
1781  				}
1782  				fprintf(ofp, "symbol_str(\"");
1783  				fprintf(ofp, "%s__%s\", ", event->system,
1784  					event->name);
1785  				fprintf(ofp, "\"%s\", %s)", f->name,
1786  					f->name);
1787  			} else
1788  				fprintf(ofp, "%s", f->name);
1789  		}
1790  
1791  		fprintf(ofp, "))\n\n");
1792  
1793  		fprintf(ofp, "\t\tprint('Sample: {'+"
1794  			"get_dict_as_string(perf_sample_dict['sample'], ', ')+'}')\n\n");
1795  
1796  		fprintf(ofp, "\t\tfor node in common_callchain:");
1797  		fprintf(ofp, "\n\t\t\tif 'sym' in node:");
1798  		fprintf(ofp, "\n\t\t\t\tprint(\"\\t[%%x] %%s\" %% (node['ip'], node['sym']['name']))");
1799  		fprintf(ofp, "\n\t\t\telse:");
1800  		fprintf(ofp, "\n\t\t\t\tprint(\"\t[%%x]\" %% (node['ip']))\n\n");
1801  		fprintf(ofp, "\t\tprint()\n\n");
1802  
1803  	}
1804  
1805  	fprintf(ofp, "def trace_unhandled(event_name, context, "
1806  		"event_fields_dict, perf_sample_dict):\n");
1807  
1808  	fprintf(ofp, "\t\tprint(get_dict_as_string(event_fields_dict))\n");
1809  	fprintf(ofp, "\t\tprint('Sample: {'+"
1810  		"get_dict_as_string(perf_sample_dict['sample'], ', ')+'}')\n\n");
1811  
1812  	fprintf(ofp, "def print_header("
1813  		"event_name, cpu, secs, nsecs, pid, comm):\n"
1814  		"\tprint(\"%%-20s %%5u %%05u.%%09u %%8u %%-20s \" %% \\\n\t"
1815  		"(event_name, cpu, secs, nsecs, pid, comm), end=\"\")\n\n");
1816  
1817  	fprintf(ofp, "def get_dict_as_string(a_dict, delimiter=' '):\n"
1818  		"\treturn delimiter.join"
1819  		"(['%%s=%%s'%%(k,str(v))for k,v in sorted(a_dict.items())])\n");
1820  
1821  	fclose(ofp);
1822  
1823  	fprintf(stderr, "generated Python script: %s\n", fname);
1824  
1825  	return 0;
1826  }
1827  
1828  struct scripting_ops python_scripting_ops = {
1829  	.name			= "Python",
1830  	.start_script		= python_start_script,
1831  	.flush_script		= python_flush_script,
1832  	.stop_script		= python_stop_script,
1833  	.process_event		= python_process_event,
1834  	.process_stat		= python_process_stat,
1835  	.process_stat_interval	= python_process_stat_interval,
1836  	.generate_script	= python_generate_script,
1837  };
1838