Linux Audio

Check our new training course

Yocto / OpenEmbedded training

Mar 24-27, 2025, special US time zones
Register
Loading...
v4.6
   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 <stdio.h>
  25#include <stdlib.h>
  26#include <string.h>
  27#include <stdbool.h>
  28#include <errno.h>
  29#include <linux/bitmap.h>
 
  30
  31#include "../../perf.h"
  32#include "../debug.h"
  33#include "../callchain.h"
  34#include "../evsel.h"
  35#include "../util.h"
  36#include "../event.h"
  37#include "../thread.h"
  38#include "../comm.h"
  39#include "../machine.h"
  40#include "../db-export.h"
  41#include "../thread-stack.h"
  42#include "../trace-event.h"
  43#include "../machine.h"
 
  44#include "thread_map.h"
  45#include "cpumap.h"
  46#include "stat.h"
  47
  48PyMODINIT_FUNC initperf_trace_context(void);
  49
  50#define TRACE_EVENT_TYPE_MAX				\
  51	((1 << (sizeof(unsigned short) * 8)) - 1)
  52
  53static DECLARE_BITMAP(events_defined, TRACE_EVENT_TYPE_MAX);
  54
  55#define MAX_FIELDS	64
  56#define N_COMMON_FIELDS	7
  57
  58extern struct scripting_context *scripting_context;
  59
  60static char *cur_field_name;
  61static int zero_flag_atom;
  62
  63static PyObject *main_module, *main_dict;
  64
  65struct tables {
  66	struct db_export	dbe;
  67	PyObject		*evsel_handler;
  68	PyObject		*machine_handler;
  69	PyObject		*thread_handler;
  70	PyObject		*comm_handler;
  71	PyObject		*comm_thread_handler;
  72	PyObject		*dso_handler;
  73	PyObject		*symbol_handler;
  74	PyObject		*branch_type_handler;
  75	PyObject		*sample_handler;
  76	PyObject		*call_path_handler;
  77	PyObject		*call_return_handler;
  78	bool			db_export_mode;
  79};
  80
  81static struct tables tables_global;
  82
  83static void handler_call_die(const char *handler_name) NORETURN;
  84static void handler_call_die(const char *handler_name)
  85{
  86	PyErr_Print();
  87	Py_FatalError("problem in Python trace event handler");
  88	// Py_FatalError does not return
  89	// but we have to make the compiler happy
  90	abort();
  91}
  92
  93/*
  94 * Insert val into into the dictionary and decrement the reference counter.
  95 * This is necessary for dictionaries since PyDict_SetItemString() does not
  96 * steal a reference, as opposed to PyTuple_SetItem().
  97 */
  98static void pydict_set_item_string_decref(PyObject *dict, const char *key, PyObject *val)
  99{
 100	PyDict_SetItemString(dict, key, val);
 101	Py_DECREF(val);
 102}
 103
 104static PyObject *get_handler(const char *handler_name)
 105{
 106	PyObject *handler;
 107
 108	handler = PyDict_GetItemString(main_dict, handler_name);
 109	if (handler && !PyCallable_Check(handler))
 110		return NULL;
 111	return handler;
 112}
 113
 114static void call_object(PyObject *handler, PyObject *args, const char *die_msg)
 115{
 116	PyObject *retval;
 117
 118	retval = PyObject_CallObject(handler, args);
 119	if (retval == NULL)
 120		handler_call_die(die_msg);
 121	Py_DECREF(retval);
 122}
 123
 124static void try_call_object(const char *handler_name, PyObject *args)
 125{
 126	PyObject *handler;
 127
 128	handler = get_handler(handler_name);
 129	if (handler)
 130		call_object(handler, args, handler_name);
 131}
 132
 133static void define_value(enum print_arg_type field_type,
 134			 const char *ev_name,
 135			 const char *field_name,
 136			 const char *field_value,
 137			 const char *field_str)
 138{
 139	const char *handler_name = "define_flag_value";
 140	PyObject *t;
 141	unsigned long long value;
 142	unsigned n = 0;
 143
 144	if (field_type == PRINT_SYMBOL)
 145		handler_name = "define_symbolic_value";
 146
 147	t = PyTuple_New(4);
 148	if (!t)
 149		Py_FatalError("couldn't create Python tuple");
 150
 151	value = eval_flag(field_value);
 152
 153	PyTuple_SetItem(t, n++, PyString_FromString(ev_name));
 154	PyTuple_SetItem(t, n++, PyString_FromString(field_name));
 155	PyTuple_SetItem(t, n++, PyInt_FromLong(value));
 156	PyTuple_SetItem(t, n++, PyString_FromString(field_str));
 157
 158	try_call_object(handler_name, t);
 159
 160	Py_DECREF(t);
 161}
 162
 163static void define_values(enum print_arg_type field_type,
 164			  struct print_flag_sym *field,
 165			  const char *ev_name,
 166			  const char *field_name)
 167{
 168	define_value(field_type, ev_name, field_name, field->value,
 169		     field->str);
 170
 171	if (field->next)
 172		define_values(field_type, field->next, ev_name, field_name);
 173}
 174
 175static void define_field(enum print_arg_type field_type,
 176			 const char *ev_name,
 177			 const char *field_name,
 178			 const char *delim)
 179{
 180	const char *handler_name = "define_flag_field";
 181	PyObject *t;
 182	unsigned n = 0;
 183
 184	if (field_type == PRINT_SYMBOL)
 185		handler_name = "define_symbolic_field";
 186
 187	if (field_type == PRINT_FLAGS)
 188		t = PyTuple_New(3);
 189	else
 190		t = PyTuple_New(2);
 191	if (!t)
 192		Py_FatalError("couldn't create Python tuple");
 193
 194	PyTuple_SetItem(t, n++, PyString_FromString(ev_name));
 195	PyTuple_SetItem(t, n++, PyString_FromString(field_name));
 196	if (field_type == PRINT_FLAGS)
 197		PyTuple_SetItem(t, n++, PyString_FromString(delim));
 198
 199	try_call_object(handler_name, t);
 200
 201	Py_DECREF(t);
 202}
 203
 204static void define_event_symbols(struct event_format *event,
 205				 const char *ev_name,
 206				 struct print_arg *args)
 207{
 208	if (args == NULL)
 209		return;
 210
 211	switch (args->type) {
 212	case PRINT_NULL:
 213		break;
 214	case PRINT_ATOM:
 215		define_value(PRINT_FLAGS, ev_name, cur_field_name, "0",
 216			     args->atom.atom);
 217		zero_flag_atom = 0;
 218		break;
 219	case PRINT_FIELD:
 220		free(cur_field_name);
 221		cur_field_name = strdup(args->field.name);
 222		break;
 223	case PRINT_FLAGS:
 224		define_event_symbols(event, ev_name, args->flags.field);
 225		define_field(PRINT_FLAGS, ev_name, cur_field_name,
 226			     args->flags.delim);
 227		define_values(PRINT_FLAGS, args->flags.flags, ev_name,
 228			      cur_field_name);
 229		break;
 230	case PRINT_SYMBOL:
 231		define_event_symbols(event, ev_name, args->symbol.field);
 232		define_field(PRINT_SYMBOL, ev_name, cur_field_name, NULL);
 233		define_values(PRINT_SYMBOL, args->symbol.symbols, ev_name,
 234			      cur_field_name);
 235		break;
 236	case PRINT_HEX:
 237		define_event_symbols(event, ev_name, args->hex.field);
 238		define_event_symbols(event, ev_name, args->hex.size);
 239		break;
 240	case PRINT_INT_ARRAY:
 241		define_event_symbols(event, ev_name, args->int_array.field);
 242		define_event_symbols(event, ev_name, args->int_array.count);
 243		define_event_symbols(event, ev_name, args->int_array.el_size);
 244		break;
 245	case PRINT_STRING:
 246		break;
 247	case PRINT_TYPE:
 248		define_event_symbols(event, ev_name, args->typecast.item);
 249		break;
 250	case PRINT_OP:
 251		if (strcmp(args->op.op, ":") == 0)
 252			zero_flag_atom = 1;
 253		define_event_symbols(event, ev_name, args->op.left);
 254		define_event_symbols(event, ev_name, args->op.right);
 255		break;
 256	default:
 257		/* gcc warns for these? */
 258	case PRINT_BSTRING:
 259	case PRINT_DYNAMIC_ARRAY:
 260	case PRINT_DYNAMIC_ARRAY_LEN:
 261	case PRINT_FUNC:
 262	case PRINT_BITMASK:
 263		/* we should warn... */
 264		return;
 265	}
 266
 267	if (args->next)
 268		define_event_symbols(event, ev_name, args->next);
 269}
 270
 271static PyObject *get_field_numeric_entry(struct event_format *event,
 272		struct format_field *field, void *data)
 273{
 274	bool is_array = field->flags & FIELD_IS_ARRAY;
 275	PyObject *obj, *list = NULL;
 276	unsigned long long val;
 277	unsigned int item_size, n_items, i;
 278
 279	if (is_array) {
 280		list = PyList_New(field->arraylen);
 281		item_size = field->size / field->arraylen;
 282		n_items = field->arraylen;
 283	} else {
 284		item_size = field->size;
 285		n_items = 1;
 286	}
 287
 288	for (i = 0; i < n_items; i++) {
 289
 290		val = read_size(event, data + field->offset + i * item_size,
 291				item_size);
 292		if (field->flags & FIELD_IS_SIGNED) {
 293			if ((long long)val >= LONG_MIN &&
 294					(long long)val <= LONG_MAX)
 295				obj = PyInt_FromLong(val);
 296			else
 297				obj = PyLong_FromLongLong(val);
 298		} else {
 299			if (val <= LONG_MAX)
 300				obj = PyInt_FromLong(val);
 301			else
 302				obj = PyLong_FromUnsignedLongLong(val);
 303		}
 304		if (is_array)
 305			PyList_SET_ITEM(list, i, obj);
 306	}
 307	if (is_array)
 308		obj = list;
 309	return obj;
 310}
 311
 312
 313static PyObject *python_process_callchain(struct perf_sample *sample,
 314					 struct perf_evsel *evsel,
 315					 struct addr_location *al)
 316{
 317	PyObject *pylist;
 318
 319	pylist = PyList_New(0);
 320	if (!pylist)
 321		Py_FatalError("couldn't create Python list");
 322
 323	if (!symbol_conf.use_callchain || !sample->callchain)
 324		goto exit;
 325
 326	if (thread__resolve_callchain(al->thread, evsel,
 327				      sample, NULL, NULL,
 328				      scripting_max_stack) != 0) {
 329		pr_err("Failed to resolve callchain. Skipping\n");
 330		goto exit;
 331	}
 332	callchain_cursor_commit(&callchain_cursor);
 333
 334
 335	while (1) {
 336		PyObject *pyelem;
 337		struct callchain_cursor_node *node;
 338		node = callchain_cursor_current(&callchain_cursor);
 339		if (!node)
 340			break;
 341
 342		pyelem = PyDict_New();
 343		if (!pyelem)
 344			Py_FatalError("couldn't create Python dictionary");
 345
 346
 347		pydict_set_item_string_decref(pyelem, "ip",
 348				PyLong_FromUnsignedLongLong(node->ip));
 349
 350		if (node->sym) {
 351			PyObject *pysym  = PyDict_New();
 352			if (!pysym)
 353				Py_FatalError("couldn't create Python dictionary");
 354			pydict_set_item_string_decref(pysym, "start",
 355					PyLong_FromUnsignedLongLong(node->sym->start));
 356			pydict_set_item_string_decref(pysym, "end",
 357					PyLong_FromUnsignedLongLong(node->sym->end));
 358			pydict_set_item_string_decref(pysym, "binding",
 359					PyInt_FromLong(node->sym->binding));
 360			pydict_set_item_string_decref(pysym, "name",
 361					PyString_FromStringAndSize(node->sym->name,
 362							node->sym->namelen));
 363			pydict_set_item_string_decref(pyelem, "sym", pysym);
 364		}
 365
 366		if (node->map) {
 367			struct map *map = node->map;
 368			const char *dsoname = "[unknown]";
 369			if (map && map->dso && (map->dso->name || map->dso->long_name)) {
 370				if (symbol_conf.show_kernel_path && map->dso->long_name)
 371					dsoname = map->dso->long_name;
 372				else if (map->dso->name)
 373					dsoname = map->dso->name;
 374			}
 375			pydict_set_item_string_decref(pyelem, "dso",
 376					PyString_FromString(dsoname));
 377		}
 378
 379		callchain_cursor_advance(&callchain_cursor);
 380		PyList_Append(pylist, pyelem);
 381		Py_DECREF(pyelem);
 382	}
 383
 384exit:
 385	return pylist;
 386}
 387
 388
 389static void python_process_tracepoint(struct perf_sample *sample,
 390				      struct perf_evsel *evsel,
 391				      struct addr_location *al)
 392{
 393	struct event_format *event = evsel->tp_format;
 394	PyObject *handler, *context, *t, *obj, *callchain;
 395	PyObject *dict = NULL;
 396	static char handler_name[256];
 397	struct format_field *field;
 398	unsigned long s, ns;
 399	unsigned n = 0;
 400	int pid;
 401	int cpu = sample->cpu;
 402	void *data = sample->raw_data;
 403	unsigned long long nsecs = sample->time;
 404	const char *comm = thread__comm_str(al->thread);
 405
 406	t = PyTuple_New(MAX_FIELDS);
 407	if (!t)
 408		Py_FatalError("couldn't create Python tuple");
 409
 410	if (!event)
 411		die("ug! no event found for type %d", (int)evsel->attr.config);
 
 
 
 412
 413	pid = raw_field_value(event, "common_pid", data);
 414
 415	sprintf(handler_name, "%s__%s", event->system, event->name);
 416
 417	if (!test_and_set_bit(event->id, events_defined))
 418		define_event_symbols(event, handler_name, event->print_fmt.args);
 419
 420	handler = get_handler(handler_name);
 421	if (!handler) {
 422		dict = PyDict_New();
 423		if (!dict)
 424			Py_FatalError("couldn't create Python dict");
 425	}
 426	s = nsecs / NSECS_PER_SEC;
 427	ns = nsecs - s * NSECS_PER_SEC;
 428
 429	scripting_context->event_data = data;
 430	scripting_context->pevent = evsel->tp_format->pevent;
 431
 432	context = PyCObject_FromVoidPtr(scripting_context, NULL);
 433
 434	PyTuple_SetItem(t, n++, PyString_FromString(handler_name));
 435	PyTuple_SetItem(t, n++, context);
 436
 437	/* ip unwinding */
 438	callchain = python_process_callchain(sample, evsel, al);
 439
 440	if (handler) {
 441		PyTuple_SetItem(t, n++, PyInt_FromLong(cpu));
 442		PyTuple_SetItem(t, n++, PyInt_FromLong(s));
 443		PyTuple_SetItem(t, n++, PyInt_FromLong(ns));
 444		PyTuple_SetItem(t, n++, PyInt_FromLong(pid));
 445		PyTuple_SetItem(t, n++, PyString_FromString(comm));
 446		PyTuple_SetItem(t, n++, callchain);
 447	} else {
 448		pydict_set_item_string_decref(dict, "common_cpu", PyInt_FromLong(cpu));
 449		pydict_set_item_string_decref(dict, "common_s", PyInt_FromLong(s));
 450		pydict_set_item_string_decref(dict, "common_ns", PyInt_FromLong(ns));
 451		pydict_set_item_string_decref(dict, "common_pid", PyInt_FromLong(pid));
 452		pydict_set_item_string_decref(dict, "common_comm", PyString_FromString(comm));
 453		pydict_set_item_string_decref(dict, "common_callchain", callchain);
 454	}
 455	for (field = event->format.fields; field; field = field->next) {
 456		if (field->flags & FIELD_IS_STRING) {
 457			int offset;
 
 
 
 
 458			if (field->flags & FIELD_IS_DYNAMIC) {
 459				offset = *(int *)(data + field->offset);
 
 
 
 460				offset &= 0xffff;
 461			} else
 462				offset = field->offset;
 463			obj = PyString_FromString((char *)data + offset);
 
 
 
 
 
 464		} else { /* FIELD_IS_NUMERIC */
 465			obj = get_field_numeric_entry(event, field, data);
 466		}
 467		if (handler)
 468			PyTuple_SetItem(t, n++, obj);
 469		else
 470			pydict_set_item_string_decref(dict, field->name, obj);
 471
 472	}
 473
 474	if (!handler)
 475		PyTuple_SetItem(t, n++, dict);
 476
 477	if (_PyTuple_Resize(&t, n) == -1)
 478		Py_FatalError("error resizing Python tuple");
 479
 480	if (handler) {
 481		call_object(handler, t, handler_name);
 482	} else {
 483		try_call_object("trace_unhandled", t);
 484		Py_DECREF(dict);
 485	}
 486
 487	Py_DECREF(t);
 488}
 489
 490static PyObject *tuple_new(unsigned int sz)
 491{
 492	PyObject *t;
 493
 494	t = PyTuple_New(sz);
 495	if (!t)
 496		Py_FatalError("couldn't create Python tuple");
 497	return t;
 498}
 499
 500static int tuple_set_u64(PyObject *t, unsigned int pos, u64 val)
 501{
 502#if BITS_PER_LONG == 64
 503	return PyTuple_SetItem(t, pos, PyInt_FromLong(val));
 504#endif
 505#if BITS_PER_LONG == 32
 506	return PyTuple_SetItem(t, pos, PyLong_FromLongLong(val));
 507#endif
 508}
 509
 510static int tuple_set_s32(PyObject *t, unsigned int pos, s32 val)
 511{
 512	return PyTuple_SetItem(t, pos, PyInt_FromLong(val));
 513}
 514
 515static int tuple_set_string(PyObject *t, unsigned int pos, const char *s)
 516{
 517	return PyTuple_SetItem(t, pos, PyString_FromString(s));
 518}
 519
 520static int python_export_evsel(struct db_export *dbe, struct perf_evsel *evsel)
 521{
 522	struct tables *tables = container_of(dbe, struct tables, dbe);
 523	PyObject *t;
 524
 525	t = tuple_new(2);
 526
 527	tuple_set_u64(t, 0, evsel->db_id);
 528	tuple_set_string(t, 1, perf_evsel__name(evsel));
 529
 530	call_object(tables->evsel_handler, t, "evsel_table");
 531
 532	Py_DECREF(t);
 533
 534	return 0;
 535}
 536
 537static int python_export_machine(struct db_export *dbe,
 538				 struct machine *machine)
 539{
 540	struct tables *tables = container_of(dbe, struct tables, dbe);
 541	PyObject *t;
 542
 543	t = tuple_new(3);
 544
 545	tuple_set_u64(t, 0, machine->db_id);
 546	tuple_set_s32(t, 1, machine->pid);
 547	tuple_set_string(t, 2, machine->root_dir ? machine->root_dir : "");
 548
 549	call_object(tables->machine_handler, t, "machine_table");
 550
 551	Py_DECREF(t);
 552
 553	return 0;
 554}
 555
 556static int python_export_thread(struct db_export *dbe, struct thread *thread,
 557				u64 main_thread_db_id, struct machine *machine)
 558{
 559	struct tables *tables = container_of(dbe, struct tables, dbe);
 560	PyObject *t;
 561
 562	t = tuple_new(5);
 563
 564	tuple_set_u64(t, 0, thread->db_id);
 565	tuple_set_u64(t, 1, machine->db_id);
 566	tuple_set_u64(t, 2, main_thread_db_id);
 567	tuple_set_s32(t, 3, thread->pid_);
 568	tuple_set_s32(t, 4, thread->tid);
 569
 570	call_object(tables->thread_handler, t, "thread_table");
 571
 572	Py_DECREF(t);
 573
 574	return 0;
 575}
 576
 577static int python_export_comm(struct db_export *dbe, struct comm *comm)
 578{
 579	struct tables *tables = container_of(dbe, struct tables, dbe);
 580	PyObject *t;
 581
 582	t = tuple_new(2);
 583
 584	tuple_set_u64(t, 0, comm->db_id);
 585	tuple_set_string(t, 1, comm__str(comm));
 586
 587	call_object(tables->comm_handler, t, "comm_table");
 588
 589	Py_DECREF(t);
 590
 591	return 0;
 592}
 593
 594static int python_export_comm_thread(struct db_export *dbe, u64 db_id,
 595				     struct comm *comm, struct thread *thread)
 596{
 597	struct tables *tables = container_of(dbe, struct tables, dbe);
 598	PyObject *t;
 599
 600	t = tuple_new(3);
 601
 602	tuple_set_u64(t, 0, db_id);
 603	tuple_set_u64(t, 1, comm->db_id);
 604	tuple_set_u64(t, 2, thread->db_id);
 605
 606	call_object(tables->comm_thread_handler, t, "comm_thread_table");
 607
 608	Py_DECREF(t);
 609
 610	return 0;
 611}
 612
 613static int python_export_dso(struct db_export *dbe, struct dso *dso,
 614			     struct machine *machine)
 615{
 616	struct tables *tables = container_of(dbe, struct tables, dbe);
 617	char sbuild_id[BUILD_ID_SIZE * 2 + 1];
 618	PyObject *t;
 619
 620	build_id__sprintf(dso->build_id, sizeof(dso->build_id), sbuild_id);
 621
 622	t = tuple_new(5);
 623
 624	tuple_set_u64(t, 0, dso->db_id);
 625	tuple_set_u64(t, 1, machine->db_id);
 626	tuple_set_string(t, 2, dso->short_name);
 627	tuple_set_string(t, 3, dso->long_name);
 628	tuple_set_string(t, 4, sbuild_id);
 629
 630	call_object(tables->dso_handler, t, "dso_table");
 631
 632	Py_DECREF(t);
 633
 634	return 0;
 635}
 636
 637static int python_export_symbol(struct db_export *dbe, struct symbol *sym,
 638				struct dso *dso)
 639{
 640	struct tables *tables = container_of(dbe, struct tables, dbe);
 641	u64 *sym_db_id = symbol__priv(sym);
 642	PyObject *t;
 643
 644	t = tuple_new(6);
 645
 646	tuple_set_u64(t, 0, *sym_db_id);
 647	tuple_set_u64(t, 1, dso->db_id);
 648	tuple_set_u64(t, 2, sym->start);
 649	tuple_set_u64(t, 3, sym->end);
 650	tuple_set_s32(t, 4, sym->binding);
 651	tuple_set_string(t, 5, sym->name);
 652
 653	call_object(tables->symbol_handler, t, "symbol_table");
 654
 655	Py_DECREF(t);
 656
 657	return 0;
 658}
 659
 660static int python_export_branch_type(struct db_export *dbe, u32 branch_type,
 661				     const char *name)
 662{
 663	struct tables *tables = container_of(dbe, struct tables, dbe);
 664	PyObject *t;
 665
 666	t = tuple_new(2);
 667
 668	tuple_set_s32(t, 0, branch_type);
 669	tuple_set_string(t, 1, name);
 670
 671	call_object(tables->branch_type_handler, t, "branch_type_table");
 672
 673	Py_DECREF(t);
 674
 675	return 0;
 676}
 677
 678static int python_export_sample(struct db_export *dbe,
 679				struct export_sample *es)
 680{
 681	struct tables *tables = container_of(dbe, struct tables, dbe);
 682	PyObject *t;
 683
 684	t = tuple_new(21);
 685
 686	tuple_set_u64(t, 0, es->db_id);
 687	tuple_set_u64(t, 1, es->evsel->db_id);
 688	tuple_set_u64(t, 2, es->al->machine->db_id);
 689	tuple_set_u64(t, 3, es->al->thread->db_id);
 690	tuple_set_u64(t, 4, es->comm_db_id);
 691	tuple_set_u64(t, 5, es->dso_db_id);
 692	tuple_set_u64(t, 6, es->sym_db_id);
 693	tuple_set_u64(t, 7, es->offset);
 694	tuple_set_u64(t, 8, es->sample->ip);
 695	tuple_set_u64(t, 9, es->sample->time);
 696	tuple_set_s32(t, 10, es->sample->cpu);
 697	tuple_set_u64(t, 11, es->addr_dso_db_id);
 698	tuple_set_u64(t, 12, es->addr_sym_db_id);
 699	tuple_set_u64(t, 13, es->addr_offset);
 700	tuple_set_u64(t, 14, es->sample->addr);
 701	tuple_set_u64(t, 15, es->sample->period);
 702	tuple_set_u64(t, 16, es->sample->weight);
 703	tuple_set_u64(t, 17, es->sample->transaction);
 704	tuple_set_u64(t, 18, es->sample->data_src);
 705	tuple_set_s32(t, 19, es->sample->flags & PERF_BRANCH_MASK);
 706	tuple_set_s32(t, 20, !!(es->sample->flags & PERF_IP_FLAG_IN_TX));
 
 707
 708	call_object(tables->sample_handler, t, "sample_table");
 709
 710	Py_DECREF(t);
 711
 712	return 0;
 713}
 714
 715static int python_export_call_path(struct db_export *dbe, struct call_path *cp)
 716{
 717	struct tables *tables = container_of(dbe, struct tables, dbe);
 718	PyObject *t;
 719	u64 parent_db_id, sym_db_id;
 720
 721	parent_db_id = cp->parent ? cp->parent->db_id : 0;
 722	sym_db_id = cp->sym ? *(u64 *)symbol__priv(cp->sym) : 0;
 723
 724	t = tuple_new(4);
 725
 726	tuple_set_u64(t, 0, cp->db_id);
 727	tuple_set_u64(t, 1, parent_db_id);
 728	tuple_set_u64(t, 2, sym_db_id);
 729	tuple_set_u64(t, 3, cp->ip);
 730
 731	call_object(tables->call_path_handler, t, "call_path_table");
 732
 733	Py_DECREF(t);
 734
 735	return 0;
 736}
 737
 738static int python_export_call_return(struct db_export *dbe,
 739				     struct call_return *cr)
 740{
 741	struct tables *tables = container_of(dbe, struct tables, dbe);
 742	u64 comm_db_id = cr->comm ? cr->comm->db_id : 0;
 743	PyObject *t;
 744
 745	t = tuple_new(11);
 746
 747	tuple_set_u64(t, 0, cr->db_id);
 748	tuple_set_u64(t, 1, cr->thread->db_id);
 749	tuple_set_u64(t, 2, comm_db_id);
 750	tuple_set_u64(t, 3, cr->cp->db_id);
 751	tuple_set_u64(t, 4, cr->call_time);
 752	tuple_set_u64(t, 5, cr->return_time);
 753	tuple_set_u64(t, 6, cr->branch_count);
 754	tuple_set_u64(t, 7, cr->call_ref);
 755	tuple_set_u64(t, 8, cr->return_ref);
 756	tuple_set_u64(t, 9, cr->cp->parent->db_id);
 757	tuple_set_s32(t, 10, cr->flags);
 758
 759	call_object(tables->call_return_handler, t, "call_return_table");
 760
 761	Py_DECREF(t);
 762
 763	return 0;
 764}
 765
 766static int python_process_call_return(struct call_return *cr, void *data)
 767{
 768	struct db_export *dbe = data;
 769
 770	return db_export__call_return(dbe, cr);
 771}
 772
 773static void python_process_general_event(struct perf_sample *sample,
 774					 struct perf_evsel *evsel,
 775					 struct addr_location *al)
 776{
 777	PyObject *handler, *t, *dict, *callchain, *dict_sample;
 778	static char handler_name[64];
 779	unsigned n = 0;
 780
 781	/*
 782	 * Use the MAX_FIELDS to make the function expandable, though
 783	 * currently there is only one item for the tuple.
 784	 */
 785	t = PyTuple_New(MAX_FIELDS);
 786	if (!t)
 787		Py_FatalError("couldn't create Python tuple");
 788
 789	dict = PyDict_New();
 790	if (!dict)
 791		Py_FatalError("couldn't create Python dictionary");
 792
 793	dict_sample = PyDict_New();
 794	if (!dict_sample)
 795		Py_FatalError("couldn't create Python dictionary");
 796
 797	snprintf(handler_name, sizeof(handler_name), "%s", "process_event");
 798
 799	handler = get_handler(handler_name);
 800	if (!handler)
 801		goto exit;
 802
 803	pydict_set_item_string_decref(dict, "ev_name", PyString_FromString(perf_evsel__name(evsel)));
 804	pydict_set_item_string_decref(dict, "attr", PyString_FromStringAndSize(
 805			(const char *)&evsel->attr, sizeof(evsel->attr)));
 806
 807	pydict_set_item_string_decref(dict_sample, "pid",
 808			PyInt_FromLong(sample->pid));
 809	pydict_set_item_string_decref(dict_sample, "tid",
 810			PyInt_FromLong(sample->tid));
 811	pydict_set_item_string_decref(dict_sample, "cpu",
 812			PyInt_FromLong(sample->cpu));
 813	pydict_set_item_string_decref(dict_sample, "ip",
 814			PyLong_FromUnsignedLongLong(sample->ip));
 815	pydict_set_item_string_decref(dict_sample, "time",
 816			PyLong_FromUnsignedLongLong(sample->time));
 817	pydict_set_item_string_decref(dict_sample, "period",
 818			PyLong_FromUnsignedLongLong(sample->period));
 819	pydict_set_item_string_decref(dict, "sample", dict_sample);
 820
 821	pydict_set_item_string_decref(dict, "raw_buf", PyString_FromStringAndSize(
 822			(const char *)sample->raw_data, sample->raw_size));
 823	pydict_set_item_string_decref(dict, "comm",
 824			PyString_FromString(thread__comm_str(al->thread)));
 825	if (al->map) {
 826		pydict_set_item_string_decref(dict, "dso",
 827			PyString_FromString(al->map->dso->name));
 828	}
 829	if (al->sym) {
 830		pydict_set_item_string_decref(dict, "symbol",
 831			PyString_FromString(al->sym->name));
 832	}
 833
 834	/* ip unwinding */
 835	callchain = python_process_callchain(sample, evsel, al);
 836	pydict_set_item_string_decref(dict, "callchain", callchain);
 837
 838	PyTuple_SetItem(t, n++, dict);
 839	if (_PyTuple_Resize(&t, n) == -1)
 840		Py_FatalError("error resizing Python tuple");
 841
 842	call_object(handler, t, handler_name);
 843exit:
 844	Py_DECREF(dict);
 845	Py_DECREF(t);
 846}
 847
 848static void python_process_event(union perf_event *event,
 849				 struct perf_sample *sample,
 850				 struct perf_evsel *evsel,
 851				 struct addr_location *al)
 852{
 853	struct tables *tables = &tables_global;
 854
 855	switch (evsel->attr.type) {
 856	case PERF_TYPE_TRACEPOINT:
 857		python_process_tracepoint(sample, evsel, al);
 858		break;
 859	/* Reserve for future process_hw/sw/raw APIs */
 860	default:
 861		if (tables->db_export_mode)
 862			db_export__sample(&tables->dbe, event, sample, evsel, al);
 863		else
 864			python_process_general_event(sample, evsel, al);
 865	}
 866}
 867
 868static void get_handler_name(char *str, size_t size,
 869			     struct perf_evsel *evsel)
 870{
 871	char *p = str;
 872
 873	scnprintf(str, size, "stat__%s", perf_evsel__name(evsel));
 874
 875	while ((p = strchr(p, ':'))) {
 876		*p = '_';
 877		p++;
 878	}
 879}
 880
 881static void
 882process_stat(struct perf_evsel *counter, int cpu, int thread, u64 tstamp,
 883	     struct perf_counts_values *count)
 884{
 885	PyObject *handler, *t;
 886	static char handler_name[256];
 887	int n = 0;
 888
 889	t = PyTuple_New(MAX_FIELDS);
 890	if (!t)
 891		Py_FatalError("couldn't create Python tuple");
 892
 893	get_handler_name(handler_name, sizeof(handler_name),
 894			 counter);
 895
 896	handler = get_handler(handler_name);
 897	if (!handler) {
 898		pr_debug("can't find python handler %s\n", handler_name);
 899		return;
 900	}
 901
 902	PyTuple_SetItem(t, n++, PyInt_FromLong(cpu));
 903	PyTuple_SetItem(t, n++, PyInt_FromLong(thread));
 904
 905	tuple_set_u64(t, n++, tstamp);
 906	tuple_set_u64(t, n++, count->val);
 907	tuple_set_u64(t, n++, count->ena);
 908	tuple_set_u64(t, n++, count->run);
 909
 910	if (_PyTuple_Resize(&t, n) == -1)
 911		Py_FatalError("error resizing Python tuple");
 912
 913	call_object(handler, t, handler_name);
 914
 915	Py_DECREF(t);
 916}
 917
 918static void python_process_stat(struct perf_stat_config *config,
 919				struct perf_evsel *counter, u64 tstamp)
 920{
 921	struct thread_map *threads = counter->threads;
 922	struct cpu_map *cpus = counter->cpus;
 923	int cpu, thread;
 924
 925	if (config->aggr_mode == AGGR_GLOBAL) {
 926		process_stat(counter, -1, -1, tstamp,
 927			     &counter->counts->aggr);
 928		return;
 929	}
 930
 931	for (thread = 0; thread < threads->nr; thread++) {
 932		for (cpu = 0; cpu < cpus->nr; cpu++) {
 933			process_stat(counter, cpus->map[cpu],
 934				     thread_map__pid(threads, thread), tstamp,
 935				     perf_counts(counter->counts, cpu, thread));
 936		}
 937	}
 938}
 939
 940static void python_process_stat_interval(u64 tstamp)
 941{
 942	PyObject *handler, *t;
 943	static const char handler_name[] = "stat__interval";
 944	int n = 0;
 945
 946	t = PyTuple_New(MAX_FIELDS);
 947	if (!t)
 948		Py_FatalError("couldn't create Python tuple");
 949
 950	handler = get_handler(handler_name);
 951	if (!handler) {
 952		pr_debug("can't find python handler %s\n", handler_name);
 953		return;
 954	}
 955
 956	tuple_set_u64(t, n++, tstamp);
 957
 958	if (_PyTuple_Resize(&t, n) == -1)
 959		Py_FatalError("error resizing Python tuple");
 960
 961	call_object(handler, t, handler_name);
 962
 963	Py_DECREF(t);
 964}
 965
 966static int run_start_sub(void)
 967{
 968	main_module = PyImport_AddModule("__main__");
 969	if (main_module == NULL)
 970		return -1;
 971	Py_INCREF(main_module);
 972
 973	main_dict = PyModule_GetDict(main_module);
 974	if (main_dict == NULL)
 975		goto error;
 976	Py_INCREF(main_dict);
 977
 978	try_call_object("trace_begin", NULL);
 979
 980	return 0;
 981
 982error:
 983	Py_XDECREF(main_dict);
 984	Py_XDECREF(main_module);
 985	return -1;
 986}
 987
 988#define SET_TABLE_HANDLER_(name, handler_name, table_name) do {		\
 989	tables->handler_name = get_handler(#table_name);		\
 990	if (tables->handler_name)					\
 991		tables->dbe.export_ ## name = python_export_ ## name;	\
 992} while (0)
 993
 994#define SET_TABLE_HANDLER(name) \
 995	SET_TABLE_HANDLER_(name, name ## _handler, name ## _table)
 996
 997static void set_table_handlers(struct tables *tables)
 998{
 999	const char *perf_db_export_mode = "perf_db_export_mode";
1000	const char *perf_db_export_calls = "perf_db_export_calls";
1001	PyObject *db_export_mode, *db_export_calls;
 
1002	bool export_calls = false;
 
1003	int ret;
1004
1005	memset(tables, 0, sizeof(struct tables));
1006	if (db_export__init(&tables->dbe))
1007		Py_FatalError("failed to initialize export");
1008
1009	db_export_mode = PyDict_GetItemString(main_dict, perf_db_export_mode);
1010	if (!db_export_mode)
1011		return;
1012
1013	ret = PyObject_IsTrue(db_export_mode);
1014	if (ret == -1)
1015		handler_call_die(perf_db_export_mode);
1016	if (!ret)
1017		return;
1018
 
1019	tables->dbe.crp = NULL;
1020	db_export_calls = PyDict_GetItemString(main_dict, perf_db_export_calls);
1021	if (db_export_calls) {
1022		ret = PyObject_IsTrue(db_export_calls);
1023		if (ret == -1)
1024			handler_call_die(perf_db_export_calls);
1025		export_calls = !!ret;
1026	}
1027
1028	if (export_calls) {
1029		tables->dbe.crp =
1030			call_return_processor__new(python_process_call_return,
1031						   &tables->dbe);
1032		if (!tables->dbe.crp)
1033			Py_FatalError("failed to create calls processor");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1034	}
1035
1036	tables->db_export_mode = true;
1037	/*
1038	 * Reserve per symbol space for symbol->db_id via symbol__priv()
1039	 */
1040	symbol_conf.priv_size = sizeof(u64);
1041
1042	SET_TABLE_HANDLER(evsel);
1043	SET_TABLE_HANDLER(machine);
1044	SET_TABLE_HANDLER(thread);
1045	SET_TABLE_HANDLER(comm);
1046	SET_TABLE_HANDLER(comm_thread);
1047	SET_TABLE_HANDLER(dso);
1048	SET_TABLE_HANDLER(symbol);
1049	SET_TABLE_HANDLER(branch_type);
1050	SET_TABLE_HANDLER(sample);
1051	SET_TABLE_HANDLER(call_path);
1052	SET_TABLE_HANDLER(call_return);
1053}
1054
1055/*
1056 * Start trace script
1057 */
1058static int python_start_script(const char *script, int argc, const char **argv)
1059{
1060	struct tables *tables = &tables_global;
1061	const char **command_line;
1062	char buf[PATH_MAX];
1063	int i, err = 0;
1064	FILE *fp;
1065
1066	command_line = malloc((argc + 1) * sizeof(const char *));
1067	command_line[0] = script;
1068	for (i = 1; i < argc + 1; i++)
1069		command_line[i] = argv[i - 1];
1070
1071	Py_Initialize();
1072
1073	initperf_trace_context();
1074
1075	PySys_SetArgv(argc + 1, (char **)command_line);
1076
1077	fp = fopen(script, "r");
1078	if (!fp) {
1079		sprintf(buf, "Can't open python script \"%s\"", script);
1080		perror(buf);
1081		err = -1;
1082		goto error;
1083	}
1084
1085	err = PyRun_SimpleFile(fp, script);
1086	if (err) {
1087		fprintf(stderr, "Error running python script %s\n", script);
1088		goto error;
1089	}
1090
1091	err = run_start_sub();
1092	if (err) {
1093		fprintf(stderr, "Error starting python script %s\n", script);
1094		goto error;
1095	}
1096
1097	set_table_handlers(tables);
1098
1099	if (tables->db_export_mode) {
1100		err = db_export__branch_types(&tables->dbe);
1101		if (err)
1102			goto error;
1103	}
1104
1105	free(command_line);
1106
1107	return err;
1108error:
1109	Py_Finalize();
1110	free(command_line);
1111
1112	return err;
1113}
1114
1115static int python_flush_script(void)
1116{
1117	struct tables *tables = &tables_global;
1118
1119	return db_export__flush(&tables->dbe);
1120}
1121
1122/*
1123 * Stop trace script
1124 */
1125static int python_stop_script(void)
1126{
1127	struct tables *tables = &tables_global;
1128
1129	try_call_object("trace_end", NULL);
1130
1131	db_export__exit(&tables->dbe);
1132
1133	Py_XDECREF(main_dict);
1134	Py_XDECREF(main_module);
1135	Py_Finalize();
1136
1137	return 0;
1138}
1139
1140static int python_generate_script(struct pevent *pevent, const char *outfile)
1141{
1142	struct event_format *event = NULL;
1143	struct format_field *f;
1144	char fname[PATH_MAX];
1145	int not_first, count;
1146	FILE *ofp;
1147
1148	sprintf(fname, "%s.py", outfile);
1149	ofp = fopen(fname, "w");
1150	if (ofp == NULL) {
1151		fprintf(stderr, "couldn't open %s\n", fname);
1152		return -1;
1153	}
1154	fprintf(ofp, "# perf script event handlers, "
1155		"generated by perf script -g python\n");
1156
1157	fprintf(ofp, "# Licensed under the terms of the GNU GPL"
1158		" License version 2\n\n");
1159
1160	fprintf(ofp, "# The common_* event handler fields are the most useful "
1161		"fields common to\n");
1162
1163	fprintf(ofp, "# all events.  They don't necessarily correspond to "
1164		"the 'common_*' fields\n");
1165
1166	fprintf(ofp, "# in the format files.  Those fields not available as "
1167		"handler params can\n");
1168
1169	fprintf(ofp, "# be retrieved using Python functions of the form "
1170		"common_*(context).\n");
1171
1172	fprintf(ofp, "# See the perf-trace-python Documentation for the list "
1173		"of available functions.\n\n");
1174
1175	fprintf(ofp, "import os\n");
1176	fprintf(ofp, "import sys\n\n");
1177
1178	fprintf(ofp, "sys.path.append(os.environ['PERF_EXEC_PATH'] + \\\n");
1179	fprintf(ofp, "\t'/scripts/python/Perf-Trace-Util/lib/Perf/Trace')\n");
1180	fprintf(ofp, "\nfrom perf_trace_context import *\n");
1181	fprintf(ofp, "from Core import *\n\n\n");
1182
1183	fprintf(ofp, "def trace_begin():\n");
1184	fprintf(ofp, "\tprint \"in trace_begin\"\n\n");
1185
1186	fprintf(ofp, "def trace_end():\n");
1187	fprintf(ofp, "\tprint \"in trace_end\"\n\n");
1188
1189	while ((event = trace_find_next_event(pevent, event))) {
1190		fprintf(ofp, "def %s__%s(", event->system, event->name);
1191		fprintf(ofp, "event_name, ");
1192		fprintf(ofp, "context, ");
1193		fprintf(ofp, "common_cpu,\n");
1194		fprintf(ofp, "\tcommon_secs, ");
1195		fprintf(ofp, "common_nsecs, ");
1196		fprintf(ofp, "common_pid, ");
1197		fprintf(ofp, "common_comm,\n\t");
1198		fprintf(ofp, "common_callchain, ");
1199
1200		not_first = 0;
1201		count = 0;
1202
1203		for (f = event->format.fields; f; f = f->next) {
1204			if (not_first++)
1205				fprintf(ofp, ", ");
1206			if (++count % 5 == 0)
1207				fprintf(ofp, "\n\t");
1208
1209			fprintf(ofp, "%s", f->name);
1210		}
1211		fprintf(ofp, "):\n");
1212
1213		fprintf(ofp, "\t\tprint_header(event_name, common_cpu, "
1214			"common_secs, common_nsecs,\n\t\t\t"
1215			"common_pid, common_comm)\n\n");
1216
1217		fprintf(ofp, "\t\tprint \"");
1218
1219		not_first = 0;
1220		count = 0;
1221
1222		for (f = event->format.fields; f; f = f->next) {
1223			if (not_first++)
1224				fprintf(ofp, ", ");
1225			if (count && count % 3 == 0) {
1226				fprintf(ofp, "\" \\\n\t\t\"");
1227			}
1228			count++;
1229
1230			fprintf(ofp, "%s=", f->name);
1231			if (f->flags & FIELD_IS_STRING ||
1232			    f->flags & FIELD_IS_FLAG ||
1233			    f->flags & FIELD_IS_ARRAY ||
1234			    f->flags & FIELD_IS_SYMBOLIC)
1235				fprintf(ofp, "%%s");
1236			else if (f->flags & FIELD_IS_SIGNED)
1237				fprintf(ofp, "%%d");
1238			else
1239				fprintf(ofp, "%%u");
1240		}
1241
1242		fprintf(ofp, "\" %% \\\n\t\t(");
1243
1244		not_first = 0;
1245		count = 0;
1246
1247		for (f = event->format.fields; f; f = f->next) {
1248			if (not_first++)
1249				fprintf(ofp, ", ");
1250
1251			if (++count % 5 == 0)
1252				fprintf(ofp, "\n\t\t");
1253
1254			if (f->flags & FIELD_IS_FLAG) {
1255				if ((count - 1) % 5 != 0) {
1256					fprintf(ofp, "\n\t\t");
1257					count = 4;
1258				}
1259				fprintf(ofp, "flag_str(\"");
1260				fprintf(ofp, "%s__%s\", ", event->system,
1261					event->name);
1262				fprintf(ofp, "\"%s\", %s)", f->name,
1263					f->name);
1264			} else if (f->flags & FIELD_IS_SYMBOLIC) {
1265				if ((count - 1) % 5 != 0) {
1266					fprintf(ofp, "\n\t\t");
1267					count = 4;
1268				}
1269				fprintf(ofp, "symbol_str(\"");
1270				fprintf(ofp, "%s__%s\", ", event->system,
1271					event->name);
1272				fprintf(ofp, "\"%s\", %s)", f->name,
1273					f->name);
1274			} else
1275				fprintf(ofp, "%s", f->name);
1276		}
1277
1278		fprintf(ofp, ")\n\n");
1279
1280		fprintf(ofp, "\t\tfor node in common_callchain:");
1281		fprintf(ofp, "\n\t\t\tif 'sym' in node:");
1282		fprintf(ofp, "\n\t\t\t\tprint \"\\t[%%x] %%s\" %% (node['ip'], node['sym']['name'])");
1283		fprintf(ofp, "\n\t\t\telse:");
1284		fprintf(ofp, "\n\t\t\t\tprint \"\t[%%x]\" %% (node['ip'])\n\n");
1285		fprintf(ofp, "\t\tprint \"\\n\"\n\n");
1286
1287	}
1288
1289	fprintf(ofp, "def trace_unhandled(event_name, context, "
1290		"event_fields_dict):\n");
1291
1292	fprintf(ofp, "\t\tprint ' '.join(['%%s=%%s'%%(k,str(v))"
1293		"for k,v in sorted(event_fields_dict.items())])\n\n");
1294
1295	fprintf(ofp, "def print_header("
1296		"event_name, cpu, secs, nsecs, pid, comm):\n"
1297		"\tprint \"%%-20s %%5u %%05u.%%09u %%8u %%-20s \" %% \\\n\t"
1298		"(event_name, cpu, secs, nsecs, pid, comm),\n");
1299
1300	fclose(ofp);
1301
1302	fprintf(stderr, "generated Python script: %s\n", fname);
1303
1304	return 0;
1305}
1306
1307struct scripting_ops python_scripting_ops = {
1308	.name			= "Python",
1309	.start_script		= python_start_script,
1310	.flush_script		= python_flush_script,
1311	.stop_script		= python_stop_script,
1312	.process_event		= python_process_event,
1313	.process_stat		= python_process_stat,
1314	.process_stat_interval	= python_process_stat_interval,
1315	.generate_script	= python_generate_script,
1316};
v4.10.11
   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 <stdio.h>
  25#include <stdlib.h>
  26#include <string.h>
  27#include <stdbool.h>
  28#include <errno.h>
  29#include <linux/bitmap.h>
  30#include <linux/time64.h>
  31
  32#include "../../perf.h"
  33#include "../debug.h"
  34#include "../callchain.h"
  35#include "../evsel.h"
  36#include "../util.h"
  37#include "../event.h"
  38#include "../thread.h"
  39#include "../comm.h"
  40#include "../machine.h"
  41#include "../db-export.h"
  42#include "../thread-stack.h"
  43#include "../trace-event.h"
  44#include "../machine.h"
  45#include "../call-path.h"
  46#include "thread_map.h"
  47#include "cpumap.h"
  48#include "stat.h"
  49
  50PyMODINIT_FUNC initperf_trace_context(void);
  51
  52#define TRACE_EVENT_TYPE_MAX				\
  53	((1 << (sizeof(unsigned short) * 8)) - 1)
  54
  55static DECLARE_BITMAP(events_defined, TRACE_EVENT_TYPE_MAX);
  56
  57#define MAX_FIELDS	64
  58#define N_COMMON_FIELDS	7
  59
  60extern struct scripting_context *scripting_context;
  61
  62static char *cur_field_name;
  63static int zero_flag_atom;
  64
  65static PyObject *main_module, *main_dict;
  66
  67struct tables {
  68	struct db_export	dbe;
  69	PyObject		*evsel_handler;
  70	PyObject		*machine_handler;
  71	PyObject		*thread_handler;
  72	PyObject		*comm_handler;
  73	PyObject		*comm_thread_handler;
  74	PyObject		*dso_handler;
  75	PyObject		*symbol_handler;
  76	PyObject		*branch_type_handler;
  77	PyObject		*sample_handler;
  78	PyObject		*call_path_handler;
  79	PyObject		*call_return_handler;
  80	bool			db_export_mode;
  81};
  82
  83static struct tables tables_global;
  84
  85static void handler_call_die(const char *handler_name) NORETURN;
  86static void handler_call_die(const char *handler_name)
  87{
  88	PyErr_Print();
  89	Py_FatalError("problem in Python trace event handler");
  90	// Py_FatalError does not return
  91	// but we have to make the compiler happy
  92	abort();
  93}
  94
  95/*
  96 * Insert val into into the dictionary and decrement the reference counter.
  97 * This is necessary for dictionaries since PyDict_SetItemString() does not
  98 * steal a reference, as opposed to PyTuple_SetItem().
  99 */
 100static void pydict_set_item_string_decref(PyObject *dict, const char *key, PyObject *val)
 101{
 102	PyDict_SetItemString(dict, key, val);
 103	Py_DECREF(val);
 104}
 105
 106static PyObject *get_handler(const char *handler_name)
 107{
 108	PyObject *handler;
 109
 110	handler = PyDict_GetItemString(main_dict, handler_name);
 111	if (handler && !PyCallable_Check(handler))
 112		return NULL;
 113	return handler;
 114}
 115
 116static void call_object(PyObject *handler, PyObject *args, const char *die_msg)
 117{
 118	PyObject *retval;
 119
 120	retval = PyObject_CallObject(handler, args);
 121	if (retval == NULL)
 122		handler_call_die(die_msg);
 123	Py_DECREF(retval);
 124}
 125
 126static void try_call_object(const char *handler_name, PyObject *args)
 127{
 128	PyObject *handler;
 129
 130	handler = get_handler(handler_name);
 131	if (handler)
 132		call_object(handler, args, handler_name);
 133}
 134
 135static void define_value(enum print_arg_type field_type,
 136			 const char *ev_name,
 137			 const char *field_name,
 138			 const char *field_value,
 139			 const char *field_str)
 140{
 141	const char *handler_name = "define_flag_value";
 142	PyObject *t;
 143	unsigned long long value;
 144	unsigned n = 0;
 145
 146	if (field_type == PRINT_SYMBOL)
 147		handler_name = "define_symbolic_value";
 148
 149	t = PyTuple_New(4);
 150	if (!t)
 151		Py_FatalError("couldn't create Python tuple");
 152
 153	value = eval_flag(field_value);
 154
 155	PyTuple_SetItem(t, n++, PyString_FromString(ev_name));
 156	PyTuple_SetItem(t, n++, PyString_FromString(field_name));
 157	PyTuple_SetItem(t, n++, PyInt_FromLong(value));
 158	PyTuple_SetItem(t, n++, PyString_FromString(field_str));
 159
 160	try_call_object(handler_name, t);
 161
 162	Py_DECREF(t);
 163}
 164
 165static void define_values(enum print_arg_type field_type,
 166			  struct print_flag_sym *field,
 167			  const char *ev_name,
 168			  const char *field_name)
 169{
 170	define_value(field_type, ev_name, field_name, field->value,
 171		     field->str);
 172
 173	if (field->next)
 174		define_values(field_type, field->next, ev_name, field_name);
 175}
 176
 177static void define_field(enum print_arg_type field_type,
 178			 const char *ev_name,
 179			 const char *field_name,
 180			 const char *delim)
 181{
 182	const char *handler_name = "define_flag_field";
 183	PyObject *t;
 184	unsigned n = 0;
 185
 186	if (field_type == PRINT_SYMBOL)
 187		handler_name = "define_symbolic_field";
 188
 189	if (field_type == PRINT_FLAGS)
 190		t = PyTuple_New(3);
 191	else
 192		t = PyTuple_New(2);
 193	if (!t)
 194		Py_FatalError("couldn't create Python tuple");
 195
 196	PyTuple_SetItem(t, n++, PyString_FromString(ev_name));
 197	PyTuple_SetItem(t, n++, PyString_FromString(field_name));
 198	if (field_type == PRINT_FLAGS)
 199		PyTuple_SetItem(t, n++, PyString_FromString(delim));
 200
 201	try_call_object(handler_name, t);
 202
 203	Py_DECREF(t);
 204}
 205
 206static void define_event_symbols(struct event_format *event,
 207				 const char *ev_name,
 208				 struct print_arg *args)
 209{
 210	if (args == NULL)
 211		return;
 212
 213	switch (args->type) {
 214	case PRINT_NULL:
 215		break;
 216	case PRINT_ATOM:
 217		define_value(PRINT_FLAGS, ev_name, cur_field_name, "0",
 218			     args->atom.atom);
 219		zero_flag_atom = 0;
 220		break;
 221	case PRINT_FIELD:
 222		free(cur_field_name);
 223		cur_field_name = strdup(args->field.name);
 224		break;
 225	case PRINT_FLAGS:
 226		define_event_symbols(event, ev_name, args->flags.field);
 227		define_field(PRINT_FLAGS, ev_name, cur_field_name,
 228			     args->flags.delim);
 229		define_values(PRINT_FLAGS, args->flags.flags, ev_name,
 230			      cur_field_name);
 231		break;
 232	case PRINT_SYMBOL:
 233		define_event_symbols(event, ev_name, args->symbol.field);
 234		define_field(PRINT_SYMBOL, ev_name, cur_field_name, NULL);
 235		define_values(PRINT_SYMBOL, args->symbol.symbols, ev_name,
 236			      cur_field_name);
 237		break;
 238	case PRINT_HEX:
 239		define_event_symbols(event, ev_name, args->hex.field);
 240		define_event_symbols(event, ev_name, args->hex.size);
 241		break;
 242	case PRINT_INT_ARRAY:
 243		define_event_symbols(event, ev_name, args->int_array.field);
 244		define_event_symbols(event, ev_name, args->int_array.count);
 245		define_event_symbols(event, ev_name, args->int_array.el_size);
 246		break;
 247	case PRINT_STRING:
 248		break;
 249	case PRINT_TYPE:
 250		define_event_symbols(event, ev_name, args->typecast.item);
 251		break;
 252	case PRINT_OP:
 253		if (strcmp(args->op.op, ":") == 0)
 254			zero_flag_atom = 1;
 255		define_event_symbols(event, ev_name, args->op.left);
 256		define_event_symbols(event, ev_name, args->op.right);
 257		break;
 258	default:
 259		/* gcc warns for these? */
 260	case PRINT_BSTRING:
 261	case PRINT_DYNAMIC_ARRAY:
 262	case PRINT_DYNAMIC_ARRAY_LEN:
 263	case PRINT_FUNC:
 264	case PRINT_BITMASK:
 265		/* we should warn... */
 266		return;
 267	}
 268
 269	if (args->next)
 270		define_event_symbols(event, ev_name, args->next);
 271}
 272
 273static PyObject *get_field_numeric_entry(struct event_format *event,
 274		struct format_field *field, void *data)
 275{
 276	bool is_array = field->flags & FIELD_IS_ARRAY;
 277	PyObject *obj = NULL, *list = NULL;
 278	unsigned long long val;
 279	unsigned int item_size, n_items, i;
 280
 281	if (is_array) {
 282		list = PyList_New(field->arraylen);
 283		item_size = field->size / field->arraylen;
 284		n_items = field->arraylen;
 285	} else {
 286		item_size = field->size;
 287		n_items = 1;
 288	}
 289
 290	for (i = 0; i < n_items; i++) {
 291
 292		val = read_size(event, data + field->offset + i * item_size,
 293				item_size);
 294		if (field->flags & FIELD_IS_SIGNED) {
 295			if ((long long)val >= LONG_MIN &&
 296					(long long)val <= LONG_MAX)
 297				obj = PyInt_FromLong(val);
 298			else
 299				obj = PyLong_FromLongLong(val);
 300		} else {
 301			if (val <= LONG_MAX)
 302				obj = PyInt_FromLong(val);
 303			else
 304				obj = PyLong_FromUnsignedLongLong(val);
 305		}
 306		if (is_array)
 307			PyList_SET_ITEM(list, i, obj);
 308	}
 309	if (is_array)
 310		obj = list;
 311	return obj;
 312}
 313
 314
 315static PyObject *python_process_callchain(struct perf_sample *sample,
 316					 struct perf_evsel *evsel,
 317					 struct addr_location *al)
 318{
 319	PyObject *pylist;
 320
 321	pylist = PyList_New(0);
 322	if (!pylist)
 323		Py_FatalError("couldn't create Python list");
 324
 325	if (!symbol_conf.use_callchain || !sample->callchain)
 326		goto exit;
 327
 328	if (thread__resolve_callchain(al->thread, &callchain_cursor, evsel,
 329				      sample, NULL, NULL,
 330				      scripting_max_stack) != 0) {
 331		pr_err("Failed to resolve callchain. Skipping\n");
 332		goto exit;
 333	}
 334	callchain_cursor_commit(&callchain_cursor);
 335
 336
 337	while (1) {
 338		PyObject *pyelem;
 339		struct callchain_cursor_node *node;
 340		node = callchain_cursor_current(&callchain_cursor);
 341		if (!node)
 342			break;
 343
 344		pyelem = PyDict_New();
 345		if (!pyelem)
 346			Py_FatalError("couldn't create Python dictionary");
 347
 348
 349		pydict_set_item_string_decref(pyelem, "ip",
 350				PyLong_FromUnsignedLongLong(node->ip));
 351
 352		if (node->sym) {
 353			PyObject *pysym  = PyDict_New();
 354			if (!pysym)
 355				Py_FatalError("couldn't create Python dictionary");
 356			pydict_set_item_string_decref(pysym, "start",
 357					PyLong_FromUnsignedLongLong(node->sym->start));
 358			pydict_set_item_string_decref(pysym, "end",
 359					PyLong_FromUnsignedLongLong(node->sym->end));
 360			pydict_set_item_string_decref(pysym, "binding",
 361					PyInt_FromLong(node->sym->binding));
 362			pydict_set_item_string_decref(pysym, "name",
 363					PyString_FromStringAndSize(node->sym->name,
 364							node->sym->namelen));
 365			pydict_set_item_string_decref(pyelem, "sym", pysym);
 366		}
 367
 368		if (node->map) {
 369			struct map *map = node->map;
 370			const char *dsoname = "[unknown]";
 371			if (map && map->dso && (map->dso->name || map->dso->long_name)) {
 372				if (symbol_conf.show_kernel_path && map->dso->long_name)
 373					dsoname = map->dso->long_name;
 374				else if (map->dso->name)
 375					dsoname = map->dso->name;
 376			}
 377			pydict_set_item_string_decref(pyelem, "dso",
 378					PyString_FromString(dsoname));
 379		}
 380
 381		callchain_cursor_advance(&callchain_cursor);
 382		PyList_Append(pylist, pyelem);
 383		Py_DECREF(pyelem);
 384	}
 385
 386exit:
 387	return pylist;
 388}
 389
 
 390static void python_process_tracepoint(struct perf_sample *sample,
 391				      struct perf_evsel *evsel,
 392				      struct addr_location *al)
 393{
 394	struct event_format *event = evsel->tp_format;
 395	PyObject *handler, *context, *t, *obj = NULL, *callchain;
 396	PyObject *dict = NULL;
 397	static char handler_name[256];
 398	struct format_field *field;
 399	unsigned long s, ns;
 400	unsigned n = 0;
 401	int pid;
 402	int cpu = sample->cpu;
 403	void *data = sample->raw_data;
 404	unsigned long long nsecs = sample->time;
 405	const char *comm = thread__comm_str(al->thread);
 406
 407	t = PyTuple_New(MAX_FIELDS);
 408	if (!t)
 409		Py_FatalError("couldn't create Python tuple");
 410
 411	if (!event) {
 412		snprintf(handler_name, sizeof(handler_name),
 413			 "ug! no event found for type %" PRIu64, (u64)evsel->attr.config);
 414		Py_FatalError(handler_name);
 415	}
 416
 417	pid = raw_field_value(event, "common_pid", data);
 418
 419	sprintf(handler_name, "%s__%s", event->system, event->name);
 420
 421	if (!test_and_set_bit(event->id, events_defined))
 422		define_event_symbols(event, handler_name, event->print_fmt.args);
 423
 424	handler = get_handler(handler_name);
 425	if (!handler) {
 426		dict = PyDict_New();
 427		if (!dict)
 428			Py_FatalError("couldn't create Python dict");
 429	}
 430	s = nsecs / NSEC_PER_SEC;
 431	ns = nsecs - s * NSEC_PER_SEC;
 432
 433	scripting_context->event_data = data;
 434	scripting_context->pevent = evsel->tp_format->pevent;
 435
 436	context = PyCObject_FromVoidPtr(scripting_context, NULL);
 437
 438	PyTuple_SetItem(t, n++, PyString_FromString(handler_name));
 439	PyTuple_SetItem(t, n++, context);
 440
 441	/* ip unwinding */
 442	callchain = python_process_callchain(sample, evsel, al);
 443
 444	if (handler) {
 445		PyTuple_SetItem(t, n++, PyInt_FromLong(cpu));
 446		PyTuple_SetItem(t, n++, PyInt_FromLong(s));
 447		PyTuple_SetItem(t, n++, PyInt_FromLong(ns));
 448		PyTuple_SetItem(t, n++, PyInt_FromLong(pid));
 449		PyTuple_SetItem(t, n++, PyString_FromString(comm));
 450		PyTuple_SetItem(t, n++, callchain);
 451	} else {
 452		pydict_set_item_string_decref(dict, "common_cpu", PyInt_FromLong(cpu));
 453		pydict_set_item_string_decref(dict, "common_s", PyInt_FromLong(s));
 454		pydict_set_item_string_decref(dict, "common_ns", PyInt_FromLong(ns));
 455		pydict_set_item_string_decref(dict, "common_pid", PyInt_FromLong(pid));
 456		pydict_set_item_string_decref(dict, "common_comm", PyString_FromString(comm));
 457		pydict_set_item_string_decref(dict, "common_callchain", callchain);
 458	}
 459	for (field = event->format.fields; field; field = field->next) {
 460		unsigned int offset, len;
 461		unsigned long long val;
 462
 463		if (field->flags & FIELD_IS_ARRAY) {
 464			offset = field->offset;
 465			len    = field->size;
 466			if (field->flags & FIELD_IS_DYNAMIC) {
 467				val     = pevent_read_number(scripting_context->pevent,
 468							     data + offset, len);
 469				offset  = val;
 470				len     = offset >> 16;
 471				offset &= 0xffff;
 472			}
 473			if (field->flags & FIELD_IS_STRING &&
 474			    is_printable_array(data + offset, len)) {
 475				obj = PyString_FromString((char *) data + offset);
 476			} else {
 477				obj = PyByteArray_FromStringAndSize((const char *) data + offset, len);
 478				field->flags &= ~FIELD_IS_STRING;
 479			}
 480		} else { /* FIELD_IS_NUMERIC */
 481			obj = get_field_numeric_entry(event, field, data);
 482		}
 483		if (handler)
 484			PyTuple_SetItem(t, n++, obj);
 485		else
 486			pydict_set_item_string_decref(dict, field->name, obj);
 487
 488	}
 489
 490	if (!handler)
 491		PyTuple_SetItem(t, n++, dict);
 492
 493	if (_PyTuple_Resize(&t, n) == -1)
 494		Py_FatalError("error resizing Python tuple");
 495
 496	if (handler) {
 497		call_object(handler, t, handler_name);
 498	} else {
 499		try_call_object("trace_unhandled", t);
 500		Py_DECREF(dict);
 501	}
 502
 503	Py_DECREF(t);
 504}
 505
 506static PyObject *tuple_new(unsigned int sz)
 507{
 508	PyObject *t;
 509
 510	t = PyTuple_New(sz);
 511	if (!t)
 512		Py_FatalError("couldn't create Python tuple");
 513	return t;
 514}
 515
 516static int tuple_set_u64(PyObject *t, unsigned int pos, u64 val)
 517{
 518#if BITS_PER_LONG == 64
 519	return PyTuple_SetItem(t, pos, PyInt_FromLong(val));
 520#endif
 521#if BITS_PER_LONG == 32
 522	return PyTuple_SetItem(t, pos, PyLong_FromLongLong(val));
 523#endif
 524}
 525
 526static int tuple_set_s32(PyObject *t, unsigned int pos, s32 val)
 527{
 528	return PyTuple_SetItem(t, pos, PyInt_FromLong(val));
 529}
 530
 531static int tuple_set_string(PyObject *t, unsigned int pos, const char *s)
 532{
 533	return PyTuple_SetItem(t, pos, PyString_FromString(s));
 534}
 535
 536static int python_export_evsel(struct db_export *dbe, struct perf_evsel *evsel)
 537{
 538	struct tables *tables = container_of(dbe, struct tables, dbe);
 539	PyObject *t;
 540
 541	t = tuple_new(2);
 542
 543	tuple_set_u64(t, 0, evsel->db_id);
 544	tuple_set_string(t, 1, perf_evsel__name(evsel));
 545
 546	call_object(tables->evsel_handler, t, "evsel_table");
 547
 548	Py_DECREF(t);
 549
 550	return 0;
 551}
 552
 553static int python_export_machine(struct db_export *dbe,
 554				 struct machine *machine)
 555{
 556	struct tables *tables = container_of(dbe, struct tables, dbe);
 557	PyObject *t;
 558
 559	t = tuple_new(3);
 560
 561	tuple_set_u64(t, 0, machine->db_id);
 562	tuple_set_s32(t, 1, machine->pid);
 563	tuple_set_string(t, 2, machine->root_dir ? machine->root_dir : "");
 564
 565	call_object(tables->machine_handler, t, "machine_table");
 566
 567	Py_DECREF(t);
 568
 569	return 0;
 570}
 571
 572static int python_export_thread(struct db_export *dbe, struct thread *thread,
 573				u64 main_thread_db_id, struct machine *machine)
 574{
 575	struct tables *tables = container_of(dbe, struct tables, dbe);
 576	PyObject *t;
 577
 578	t = tuple_new(5);
 579
 580	tuple_set_u64(t, 0, thread->db_id);
 581	tuple_set_u64(t, 1, machine->db_id);
 582	tuple_set_u64(t, 2, main_thread_db_id);
 583	tuple_set_s32(t, 3, thread->pid_);
 584	tuple_set_s32(t, 4, thread->tid);
 585
 586	call_object(tables->thread_handler, t, "thread_table");
 587
 588	Py_DECREF(t);
 589
 590	return 0;
 591}
 592
 593static int python_export_comm(struct db_export *dbe, struct comm *comm)
 594{
 595	struct tables *tables = container_of(dbe, struct tables, dbe);
 596	PyObject *t;
 597
 598	t = tuple_new(2);
 599
 600	tuple_set_u64(t, 0, comm->db_id);
 601	tuple_set_string(t, 1, comm__str(comm));
 602
 603	call_object(tables->comm_handler, t, "comm_table");
 604
 605	Py_DECREF(t);
 606
 607	return 0;
 608}
 609
 610static int python_export_comm_thread(struct db_export *dbe, u64 db_id,
 611				     struct comm *comm, struct thread *thread)
 612{
 613	struct tables *tables = container_of(dbe, struct tables, dbe);
 614	PyObject *t;
 615
 616	t = tuple_new(3);
 617
 618	tuple_set_u64(t, 0, db_id);
 619	tuple_set_u64(t, 1, comm->db_id);
 620	tuple_set_u64(t, 2, thread->db_id);
 621
 622	call_object(tables->comm_thread_handler, t, "comm_thread_table");
 623
 624	Py_DECREF(t);
 625
 626	return 0;
 627}
 628
 629static int python_export_dso(struct db_export *dbe, struct dso *dso,
 630			     struct machine *machine)
 631{
 632	struct tables *tables = container_of(dbe, struct tables, dbe);
 633	char sbuild_id[SBUILD_ID_SIZE];
 634	PyObject *t;
 635
 636	build_id__sprintf(dso->build_id, sizeof(dso->build_id), sbuild_id);
 637
 638	t = tuple_new(5);
 639
 640	tuple_set_u64(t, 0, dso->db_id);
 641	tuple_set_u64(t, 1, machine->db_id);
 642	tuple_set_string(t, 2, dso->short_name);
 643	tuple_set_string(t, 3, dso->long_name);
 644	tuple_set_string(t, 4, sbuild_id);
 645
 646	call_object(tables->dso_handler, t, "dso_table");
 647
 648	Py_DECREF(t);
 649
 650	return 0;
 651}
 652
 653static int python_export_symbol(struct db_export *dbe, struct symbol *sym,
 654				struct dso *dso)
 655{
 656	struct tables *tables = container_of(dbe, struct tables, dbe);
 657	u64 *sym_db_id = symbol__priv(sym);
 658	PyObject *t;
 659
 660	t = tuple_new(6);
 661
 662	tuple_set_u64(t, 0, *sym_db_id);
 663	tuple_set_u64(t, 1, dso->db_id);
 664	tuple_set_u64(t, 2, sym->start);
 665	tuple_set_u64(t, 3, sym->end);
 666	tuple_set_s32(t, 4, sym->binding);
 667	tuple_set_string(t, 5, sym->name);
 668
 669	call_object(tables->symbol_handler, t, "symbol_table");
 670
 671	Py_DECREF(t);
 672
 673	return 0;
 674}
 675
 676static int python_export_branch_type(struct db_export *dbe, u32 branch_type,
 677				     const char *name)
 678{
 679	struct tables *tables = container_of(dbe, struct tables, dbe);
 680	PyObject *t;
 681
 682	t = tuple_new(2);
 683
 684	tuple_set_s32(t, 0, branch_type);
 685	tuple_set_string(t, 1, name);
 686
 687	call_object(tables->branch_type_handler, t, "branch_type_table");
 688
 689	Py_DECREF(t);
 690
 691	return 0;
 692}
 693
 694static int python_export_sample(struct db_export *dbe,
 695				struct export_sample *es)
 696{
 697	struct tables *tables = container_of(dbe, struct tables, dbe);
 698	PyObject *t;
 699
 700	t = tuple_new(22);
 701
 702	tuple_set_u64(t, 0, es->db_id);
 703	tuple_set_u64(t, 1, es->evsel->db_id);
 704	tuple_set_u64(t, 2, es->al->machine->db_id);
 705	tuple_set_u64(t, 3, es->al->thread->db_id);
 706	tuple_set_u64(t, 4, es->comm_db_id);
 707	tuple_set_u64(t, 5, es->dso_db_id);
 708	tuple_set_u64(t, 6, es->sym_db_id);
 709	tuple_set_u64(t, 7, es->offset);
 710	tuple_set_u64(t, 8, es->sample->ip);
 711	tuple_set_u64(t, 9, es->sample->time);
 712	tuple_set_s32(t, 10, es->sample->cpu);
 713	tuple_set_u64(t, 11, es->addr_dso_db_id);
 714	tuple_set_u64(t, 12, es->addr_sym_db_id);
 715	tuple_set_u64(t, 13, es->addr_offset);
 716	tuple_set_u64(t, 14, es->sample->addr);
 717	tuple_set_u64(t, 15, es->sample->period);
 718	tuple_set_u64(t, 16, es->sample->weight);
 719	tuple_set_u64(t, 17, es->sample->transaction);
 720	tuple_set_u64(t, 18, es->sample->data_src);
 721	tuple_set_s32(t, 19, es->sample->flags & PERF_BRANCH_MASK);
 722	tuple_set_s32(t, 20, !!(es->sample->flags & PERF_IP_FLAG_IN_TX));
 723	tuple_set_u64(t, 21, es->call_path_id);
 724
 725	call_object(tables->sample_handler, t, "sample_table");
 726
 727	Py_DECREF(t);
 728
 729	return 0;
 730}
 731
 732static int python_export_call_path(struct db_export *dbe, struct call_path *cp)
 733{
 734	struct tables *tables = container_of(dbe, struct tables, dbe);
 735	PyObject *t;
 736	u64 parent_db_id, sym_db_id;
 737
 738	parent_db_id = cp->parent ? cp->parent->db_id : 0;
 739	sym_db_id = cp->sym ? *(u64 *)symbol__priv(cp->sym) : 0;
 740
 741	t = tuple_new(4);
 742
 743	tuple_set_u64(t, 0, cp->db_id);
 744	tuple_set_u64(t, 1, parent_db_id);
 745	tuple_set_u64(t, 2, sym_db_id);
 746	tuple_set_u64(t, 3, cp->ip);
 747
 748	call_object(tables->call_path_handler, t, "call_path_table");
 749
 750	Py_DECREF(t);
 751
 752	return 0;
 753}
 754
 755static int python_export_call_return(struct db_export *dbe,
 756				     struct call_return *cr)
 757{
 758	struct tables *tables = container_of(dbe, struct tables, dbe);
 759	u64 comm_db_id = cr->comm ? cr->comm->db_id : 0;
 760	PyObject *t;
 761
 762	t = tuple_new(11);
 763
 764	tuple_set_u64(t, 0, cr->db_id);
 765	tuple_set_u64(t, 1, cr->thread->db_id);
 766	tuple_set_u64(t, 2, comm_db_id);
 767	tuple_set_u64(t, 3, cr->cp->db_id);
 768	tuple_set_u64(t, 4, cr->call_time);
 769	tuple_set_u64(t, 5, cr->return_time);
 770	tuple_set_u64(t, 6, cr->branch_count);
 771	tuple_set_u64(t, 7, cr->call_ref);
 772	tuple_set_u64(t, 8, cr->return_ref);
 773	tuple_set_u64(t, 9, cr->cp->parent->db_id);
 774	tuple_set_s32(t, 10, cr->flags);
 775
 776	call_object(tables->call_return_handler, t, "call_return_table");
 777
 778	Py_DECREF(t);
 779
 780	return 0;
 781}
 782
 783static int python_process_call_return(struct call_return *cr, void *data)
 784{
 785	struct db_export *dbe = data;
 786
 787	return db_export__call_return(dbe, cr);
 788}
 789
 790static void python_process_general_event(struct perf_sample *sample,
 791					 struct perf_evsel *evsel,
 792					 struct addr_location *al)
 793{
 794	PyObject *handler, *t, *dict, *callchain, *dict_sample;
 795	static char handler_name[64];
 796	unsigned n = 0;
 797
 798	/*
 799	 * Use the MAX_FIELDS to make the function expandable, though
 800	 * currently there is only one item for the tuple.
 801	 */
 802	t = PyTuple_New(MAX_FIELDS);
 803	if (!t)
 804		Py_FatalError("couldn't create Python tuple");
 805
 806	dict = PyDict_New();
 807	if (!dict)
 808		Py_FatalError("couldn't create Python dictionary");
 809
 810	dict_sample = PyDict_New();
 811	if (!dict_sample)
 812		Py_FatalError("couldn't create Python dictionary");
 813
 814	snprintf(handler_name, sizeof(handler_name), "%s", "process_event");
 815
 816	handler = get_handler(handler_name);
 817	if (!handler)
 818		goto exit;
 819
 820	pydict_set_item_string_decref(dict, "ev_name", PyString_FromString(perf_evsel__name(evsel)));
 821	pydict_set_item_string_decref(dict, "attr", PyString_FromStringAndSize(
 822			(const char *)&evsel->attr, sizeof(evsel->attr)));
 823
 824	pydict_set_item_string_decref(dict_sample, "pid",
 825			PyInt_FromLong(sample->pid));
 826	pydict_set_item_string_decref(dict_sample, "tid",
 827			PyInt_FromLong(sample->tid));
 828	pydict_set_item_string_decref(dict_sample, "cpu",
 829			PyInt_FromLong(sample->cpu));
 830	pydict_set_item_string_decref(dict_sample, "ip",
 831			PyLong_FromUnsignedLongLong(sample->ip));
 832	pydict_set_item_string_decref(dict_sample, "time",
 833			PyLong_FromUnsignedLongLong(sample->time));
 834	pydict_set_item_string_decref(dict_sample, "period",
 835			PyLong_FromUnsignedLongLong(sample->period));
 836	pydict_set_item_string_decref(dict, "sample", dict_sample);
 837
 838	pydict_set_item_string_decref(dict, "raw_buf", PyString_FromStringAndSize(
 839			(const char *)sample->raw_data, sample->raw_size));
 840	pydict_set_item_string_decref(dict, "comm",
 841			PyString_FromString(thread__comm_str(al->thread)));
 842	if (al->map) {
 843		pydict_set_item_string_decref(dict, "dso",
 844			PyString_FromString(al->map->dso->name));
 845	}
 846	if (al->sym) {
 847		pydict_set_item_string_decref(dict, "symbol",
 848			PyString_FromString(al->sym->name));
 849	}
 850
 851	/* ip unwinding */
 852	callchain = python_process_callchain(sample, evsel, al);
 853	pydict_set_item_string_decref(dict, "callchain", callchain);
 854
 855	PyTuple_SetItem(t, n++, dict);
 856	if (_PyTuple_Resize(&t, n) == -1)
 857		Py_FatalError("error resizing Python tuple");
 858
 859	call_object(handler, t, handler_name);
 860exit:
 861	Py_DECREF(dict);
 862	Py_DECREF(t);
 863}
 864
 865static void python_process_event(union perf_event *event,
 866				 struct perf_sample *sample,
 867				 struct perf_evsel *evsel,
 868				 struct addr_location *al)
 869{
 870	struct tables *tables = &tables_global;
 871
 872	switch (evsel->attr.type) {
 873	case PERF_TYPE_TRACEPOINT:
 874		python_process_tracepoint(sample, evsel, al);
 875		break;
 876	/* Reserve for future process_hw/sw/raw APIs */
 877	default:
 878		if (tables->db_export_mode)
 879			db_export__sample(&tables->dbe, event, sample, evsel, al);
 880		else
 881			python_process_general_event(sample, evsel, al);
 882	}
 883}
 884
 885static void get_handler_name(char *str, size_t size,
 886			     struct perf_evsel *evsel)
 887{
 888	char *p = str;
 889
 890	scnprintf(str, size, "stat__%s", perf_evsel__name(evsel));
 891
 892	while ((p = strchr(p, ':'))) {
 893		*p = '_';
 894		p++;
 895	}
 896}
 897
 898static void
 899process_stat(struct perf_evsel *counter, int cpu, int thread, u64 tstamp,
 900	     struct perf_counts_values *count)
 901{
 902	PyObject *handler, *t;
 903	static char handler_name[256];
 904	int n = 0;
 905
 906	t = PyTuple_New(MAX_FIELDS);
 907	if (!t)
 908		Py_FatalError("couldn't create Python tuple");
 909
 910	get_handler_name(handler_name, sizeof(handler_name),
 911			 counter);
 912
 913	handler = get_handler(handler_name);
 914	if (!handler) {
 915		pr_debug("can't find python handler %s\n", handler_name);
 916		return;
 917	}
 918
 919	PyTuple_SetItem(t, n++, PyInt_FromLong(cpu));
 920	PyTuple_SetItem(t, n++, PyInt_FromLong(thread));
 921
 922	tuple_set_u64(t, n++, tstamp);
 923	tuple_set_u64(t, n++, count->val);
 924	tuple_set_u64(t, n++, count->ena);
 925	tuple_set_u64(t, n++, count->run);
 926
 927	if (_PyTuple_Resize(&t, n) == -1)
 928		Py_FatalError("error resizing Python tuple");
 929
 930	call_object(handler, t, handler_name);
 931
 932	Py_DECREF(t);
 933}
 934
 935static void python_process_stat(struct perf_stat_config *config,
 936				struct perf_evsel *counter, u64 tstamp)
 937{
 938	struct thread_map *threads = counter->threads;
 939	struct cpu_map *cpus = counter->cpus;
 940	int cpu, thread;
 941
 942	if (config->aggr_mode == AGGR_GLOBAL) {
 943		process_stat(counter, -1, -1, tstamp,
 944			     &counter->counts->aggr);
 945		return;
 946	}
 947
 948	for (thread = 0; thread < threads->nr; thread++) {
 949		for (cpu = 0; cpu < cpus->nr; cpu++) {
 950			process_stat(counter, cpus->map[cpu],
 951				     thread_map__pid(threads, thread), tstamp,
 952				     perf_counts(counter->counts, cpu, thread));
 953		}
 954	}
 955}
 956
 957static void python_process_stat_interval(u64 tstamp)
 958{
 959	PyObject *handler, *t;
 960	static const char handler_name[] = "stat__interval";
 961	int n = 0;
 962
 963	t = PyTuple_New(MAX_FIELDS);
 964	if (!t)
 965		Py_FatalError("couldn't create Python tuple");
 966
 967	handler = get_handler(handler_name);
 968	if (!handler) {
 969		pr_debug("can't find python handler %s\n", handler_name);
 970		return;
 971	}
 972
 973	tuple_set_u64(t, n++, tstamp);
 974
 975	if (_PyTuple_Resize(&t, n) == -1)
 976		Py_FatalError("error resizing Python tuple");
 977
 978	call_object(handler, t, handler_name);
 979
 980	Py_DECREF(t);
 981}
 982
 983static int run_start_sub(void)
 984{
 985	main_module = PyImport_AddModule("__main__");
 986	if (main_module == NULL)
 987		return -1;
 988	Py_INCREF(main_module);
 989
 990	main_dict = PyModule_GetDict(main_module);
 991	if (main_dict == NULL)
 992		goto error;
 993	Py_INCREF(main_dict);
 994
 995	try_call_object("trace_begin", NULL);
 996
 997	return 0;
 998
 999error:
1000	Py_XDECREF(main_dict);
1001	Py_XDECREF(main_module);
1002	return -1;
1003}
1004
1005#define SET_TABLE_HANDLER_(name, handler_name, table_name) do {		\
1006	tables->handler_name = get_handler(#table_name);		\
1007	if (tables->handler_name)					\
1008		tables->dbe.export_ ## name = python_export_ ## name;	\
1009} while (0)
1010
1011#define SET_TABLE_HANDLER(name) \
1012	SET_TABLE_HANDLER_(name, name ## _handler, name ## _table)
1013
1014static void set_table_handlers(struct tables *tables)
1015{
1016	const char *perf_db_export_mode = "perf_db_export_mode";
1017	const char *perf_db_export_calls = "perf_db_export_calls";
1018	const char *perf_db_export_callchains = "perf_db_export_callchains";
1019	PyObject *db_export_mode, *db_export_calls, *db_export_callchains;
1020	bool export_calls = false;
1021	bool export_callchains = false;
1022	int ret;
1023
1024	memset(tables, 0, sizeof(struct tables));
1025	if (db_export__init(&tables->dbe))
1026		Py_FatalError("failed to initialize export");
1027
1028	db_export_mode = PyDict_GetItemString(main_dict, perf_db_export_mode);
1029	if (!db_export_mode)
1030		return;
1031
1032	ret = PyObject_IsTrue(db_export_mode);
1033	if (ret == -1)
1034		handler_call_die(perf_db_export_mode);
1035	if (!ret)
1036		return;
1037
1038	/* handle export calls */
1039	tables->dbe.crp = NULL;
1040	db_export_calls = PyDict_GetItemString(main_dict, perf_db_export_calls);
1041	if (db_export_calls) {
1042		ret = PyObject_IsTrue(db_export_calls);
1043		if (ret == -1)
1044			handler_call_die(perf_db_export_calls);
1045		export_calls = !!ret;
1046	}
1047
1048	if (export_calls) {
1049		tables->dbe.crp =
1050			call_return_processor__new(python_process_call_return,
1051						   &tables->dbe);
1052		if (!tables->dbe.crp)
1053			Py_FatalError("failed to create calls processor");
1054	}
1055
1056	/* handle export callchains */
1057	tables->dbe.cpr = NULL;
1058	db_export_callchains = PyDict_GetItemString(main_dict,
1059						    perf_db_export_callchains);
1060	if (db_export_callchains) {
1061		ret = PyObject_IsTrue(db_export_callchains);
1062		if (ret == -1)
1063			handler_call_die(perf_db_export_callchains);
1064		export_callchains = !!ret;
1065	}
1066
1067	if (export_callchains) {
1068		/*
1069		 * Attempt to use the call path root from the call return
1070		 * processor, if the call return processor is in use. Otherwise,
1071		 * we allocate a new call path root. This prevents exporting
1072		 * duplicate call path ids when both are in use simultaniously.
1073		 */
1074		if (tables->dbe.crp)
1075			tables->dbe.cpr = tables->dbe.crp->cpr;
1076		else
1077			tables->dbe.cpr = call_path_root__new();
1078
1079		if (!tables->dbe.cpr)
1080			Py_FatalError("failed to create call path root");
1081	}
1082
1083	tables->db_export_mode = true;
1084	/*
1085	 * Reserve per symbol space for symbol->db_id via symbol__priv()
1086	 */
1087	symbol_conf.priv_size = sizeof(u64);
1088
1089	SET_TABLE_HANDLER(evsel);
1090	SET_TABLE_HANDLER(machine);
1091	SET_TABLE_HANDLER(thread);
1092	SET_TABLE_HANDLER(comm);
1093	SET_TABLE_HANDLER(comm_thread);
1094	SET_TABLE_HANDLER(dso);
1095	SET_TABLE_HANDLER(symbol);
1096	SET_TABLE_HANDLER(branch_type);
1097	SET_TABLE_HANDLER(sample);
1098	SET_TABLE_HANDLER(call_path);
1099	SET_TABLE_HANDLER(call_return);
1100}
1101
1102/*
1103 * Start trace script
1104 */
1105static int python_start_script(const char *script, int argc, const char **argv)
1106{
1107	struct tables *tables = &tables_global;
1108	const char **command_line;
1109	char buf[PATH_MAX];
1110	int i, err = 0;
1111	FILE *fp;
1112
1113	command_line = malloc((argc + 1) * sizeof(const char *));
1114	command_line[0] = script;
1115	for (i = 1; i < argc + 1; i++)
1116		command_line[i] = argv[i - 1];
1117
1118	Py_Initialize();
1119
1120	initperf_trace_context();
1121
1122	PySys_SetArgv(argc + 1, (char **)command_line);
1123
1124	fp = fopen(script, "r");
1125	if (!fp) {
1126		sprintf(buf, "Can't open python script \"%s\"", script);
1127		perror(buf);
1128		err = -1;
1129		goto error;
1130	}
1131
1132	err = PyRun_SimpleFile(fp, script);
1133	if (err) {
1134		fprintf(stderr, "Error running python script %s\n", script);
1135		goto error;
1136	}
1137
1138	err = run_start_sub();
1139	if (err) {
1140		fprintf(stderr, "Error starting python script %s\n", script);
1141		goto error;
1142	}
1143
1144	set_table_handlers(tables);
1145
1146	if (tables->db_export_mode) {
1147		err = db_export__branch_types(&tables->dbe);
1148		if (err)
1149			goto error;
1150	}
1151
1152	free(command_line);
1153
1154	return err;
1155error:
1156	Py_Finalize();
1157	free(command_line);
1158
1159	return err;
1160}
1161
1162static int python_flush_script(void)
1163{
1164	struct tables *tables = &tables_global;
1165
1166	return db_export__flush(&tables->dbe);
1167}
1168
1169/*
1170 * Stop trace script
1171 */
1172static int python_stop_script(void)
1173{
1174	struct tables *tables = &tables_global;
1175
1176	try_call_object("trace_end", NULL);
1177
1178	db_export__exit(&tables->dbe);
1179
1180	Py_XDECREF(main_dict);
1181	Py_XDECREF(main_module);
1182	Py_Finalize();
1183
1184	return 0;
1185}
1186
1187static int python_generate_script(struct pevent *pevent, const char *outfile)
1188{
1189	struct event_format *event = NULL;
1190	struct format_field *f;
1191	char fname[PATH_MAX];
1192	int not_first, count;
1193	FILE *ofp;
1194
1195	sprintf(fname, "%s.py", outfile);
1196	ofp = fopen(fname, "w");
1197	if (ofp == NULL) {
1198		fprintf(stderr, "couldn't open %s\n", fname);
1199		return -1;
1200	}
1201	fprintf(ofp, "# perf script event handlers, "
1202		"generated by perf script -g python\n");
1203
1204	fprintf(ofp, "# Licensed under the terms of the GNU GPL"
1205		" License version 2\n\n");
1206
1207	fprintf(ofp, "# The common_* event handler fields are the most useful "
1208		"fields common to\n");
1209
1210	fprintf(ofp, "# all events.  They don't necessarily correspond to "
1211		"the 'common_*' fields\n");
1212
1213	fprintf(ofp, "# in the format files.  Those fields not available as "
1214		"handler params can\n");
1215
1216	fprintf(ofp, "# be retrieved using Python functions of the form "
1217		"common_*(context).\n");
1218
1219	fprintf(ofp, "# See the perf-trace-python Documentation for the list "
1220		"of available functions.\n\n");
1221
1222	fprintf(ofp, "import os\n");
1223	fprintf(ofp, "import sys\n\n");
1224
1225	fprintf(ofp, "sys.path.append(os.environ['PERF_EXEC_PATH'] + \\\n");
1226	fprintf(ofp, "\t'/scripts/python/Perf-Trace-Util/lib/Perf/Trace')\n");
1227	fprintf(ofp, "\nfrom perf_trace_context import *\n");
1228	fprintf(ofp, "from Core import *\n\n\n");
1229
1230	fprintf(ofp, "def trace_begin():\n");
1231	fprintf(ofp, "\tprint \"in trace_begin\"\n\n");
1232
1233	fprintf(ofp, "def trace_end():\n");
1234	fprintf(ofp, "\tprint \"in trace_end\"\n\n");
1235
1236	while ((event = trace_find_next_event(pevent, event))) {
1237		fprintf(ofp, "def %s__%s(", event->system, event->name);
1238		fprintf(ofp, "event_name, ");
1239		fprintf(ofp, "context, ");
1240		fprintf(ofp, "common_cpu,\n");
1241		fprintf(ofp, "\tcommon_secs, ");
1242		fprintf(ofp, "common_nsecs, ");
1243		fprintf(ofp, "common_pid, ");
1244		fprintf(ofp, "common_comm,\n\t");
1245		fprintf(ofp, "common_callchain, ");
1246
1247		not_first = 0;
1248		count = 0;
1249
1250		for (f = event->format.fields; f; f = f->next) {
1251			if (not_first++)
1252				fprintf(ofp, ", ");
1253			if (++count % 5 == 0)
1254				fprintf(ofp, "\n\t");
1255
1256			fprintf(ofp, "%s", f->name);
1257		}
1258		fprintf(ofp, "):\n");
1259
1260		fprintf(ofp, "\t\tprint_header(event_name, common_cpu, "
1261			"common_secs, common_nsecs,\n\t\t\t"
1262			"common_pid, common_comm)\n\n");
1263
1264		fprintf(ofp, "\t\tprint \"");
1265
1266		not_first = 0;
1267		count = 0;
1268
1269		for (f = event->format.fields; f; f = f->next) {
1270			if (not_first++)
1271				fprintf(ofp, ", ");
1272			if (count && count % 3 == 0) {
1273				fprintf(ofp, "\" \\\n\t\t\"");
1274			}
1275			count++;
1276
1277			fprintf(ofp, "%s=", f->name);
1278			if (f->flags & FIELD_IS_STRING ||
1279			    f->flags & FIELD_IS_FLAG ||
1280			    f->flags & FIELD_IS_ARRAY ||
1281			    f->flags & FIELD_IS_SYMBOLIC)
1282				fprintf(ofp, "%%s");
1283			else if (f->flags & FIELD_IS_SIGNED)
1284				fprintf(ofp, "%%d");
1285			else
1286				fprintf(ofp, "%%u");
1287		}
1288
1289		fprintf(ofp, "\" %% \\\n\t\t(");
1290
1291		not_first = 0;
1292		count = 0;
1293
1294		for (f = event->format.fields; f; f = f->next) {
1295			if (not_first++)
1296				fprintf(ofp, ", ");
1297
1298			if (++count % 5 == 0)
1299				fprintf(ofp, "\n\t\t");
1300
1301			if (f->flags & FIELD_IS_FLAG) {
1302				if ((count - 1) % 5 != 0) {
1303					fprintf(ofp, "\n\t\t");
1304					count = 4;
1305				}
1306				fprintf(ofp, "flag_str(\"");
1307				fprintf(ofp, "%s__%s\", ", event->system,
1308					event->name);
1309				fprintf(ofp, "\"%s\", %s)", f->name,
1310					f->name);
1311			} else if (f->flags & FIELD_IS_SYMBOLIC) {
1312				if ((count - 1) % 5 != 0) {
1313					fprintf(ofp, "\n\t\t");
1314					count = 4;
1315				}
1316				fprintf(ofp, "symbol_str(\"");
1317				fprintf(ofp, "%s__%s\", ", event->system,
1318					event->name);
1319				fprintf(ofp, "\"%s\", %s)", f->name,
1320					f->name);
1321			} else
1322				fprintf(ofp, "%s", f->name);
1323		}
1324
1325		fprintf(ofp, ")\n\n");
1326
1327		fprintf(ofp, "\t\tfor node in common_callchain:");
1328		fprintf(ofp, "\n\t\t\tif 'sym' in node:");
1329		fprintf(ofp, "\n\t\t\t\tprint \"\\t[%%x] %%s\" %% (node['ip'], node['sym']['name'])");
1330		fprintf(ofp, "\n\t\t\telse:");
1331		fprintf(ofp, "\n\t\t\t\tprint \"\t[%%x]\" %% (node['ip'])\n\n");
1332		fprintf(ofp, "\t\tprint \"\\n\"\n\n");
1333
1334	}
1335
1336	fprintf(ofp, "def trace_unhandled(event_name, context, "
1337		"event_fields_dict):\n");
1338
1339	fprintf(ofp, "\t\tprint ' '.join(['%%s=%%s'%%(k,str(v))"
1340		"for k,v in sorted(event_fields_dict.items())])\n\n");
1341
1342	fprintf(ofp, "def print_header("
1343		"event_name, cpu, secs, nsecs, pid, comm):\n"
1344		"\tprint \"%%-20s %%5u %%05u.%%09u %%8u %%-20s \" %% \\\n\t"
1345		"(event_name, cpu, secs, nsecs, pid, comm),\n");
1346
1347	fclose(ofp);
1348
1349	fprintf(stderr, "generated Python script: %s\n", fname);
1350
1351	return 0;
1352}
1353
1354struct scripting_ops python_scripting_ops = {
1355	.name			= "Python",
1356	.start_script		= python_start_script,
1357	.flush_script		= python_flush_script,
1358	.stop_script		= python_stop_script,
1359	.process_event		= python_process_event,
1360	.process_stat		= python_process_stat,
1361	.process_stat_interval	= python_process_stat_interval,
1362	.generate_script	= python_generate_script,
1363};