1e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/*
2e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * trace-event-python.  Feed trace events to an embedded Python interpreter.
3e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
4e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Copyright (C) 2010 Tom Zanussi <tzanussi@gmail.com>
5e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
6e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *  This program is free software; you can redistribute it and/or modify
7e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *  it under the terms of the GNU General Public License as published by
8e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *  the Free Software Foundation; either version 2 of the License, or
9e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *  (at your option) any later version.
10e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
11e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *  This program is distributed in the hope that it will be useful,
12e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *  GNU General Public License for more details.
15e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
16e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *  You should have received a copy of the GNU General Public License
17e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *  along with this program; if not, write to the Free Software
18e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
20e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */
21e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
22e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <Python.h>
23e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
24e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <stdio.h>
25e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <stdlib.h>
26e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <string.h>
27e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <errno.h>
28e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
29e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "../../perf.h"
30e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "../evsel.h"
31e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "../util.h"
32e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "../event.h"
33e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "../thread.h"
34e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "../trace-event.h"
35e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
36e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen ChengPyMODINIT_FUNC initperf_trace_context(void);
37e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
38e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define FTRACE_MAX_EVENT				\
39e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	((1 << (sizeof(unsigned short) * 8)) - 1)
40e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
41e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct event_format *events[FTRACE_MAX_EVENT];
42e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
43e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define MAX_FIELDS	64
44e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define N_COMMON_FIELDS	7
45e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
46e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengextern struct scripting_context *scripting_context;
47e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
48e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic char *cur_field_name;
49e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int zero_flag_atom;
50e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
51e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic PyObject *main_module, *main_dict;
52e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
53e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic void handler_call_die(const char *handler_name)
54e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
55e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PyErr_Print();
56e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	Py_FatalError("problem in Python trace event handler");
57e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
58e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
59e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/*
60e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Insert val into into the dictionary and decrement the reference counter.
61e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * This is necessary for dictionaries since PyDict_SetItemString() does not
62e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * steal a reference, as opposed to PyTuple_SetItem().
63e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */
64e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic void pydict_set_item_string_decref(PyObject *dict, const char *key, PyObject *val)
65e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
66e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PyDict_SetItemString(dict, key, val);
67e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	Py_DECREF(val);
68e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
69e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
70e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic void define_value(enum print_arg_type field_type,
71e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			 const char *ev_name,
72e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			 const char *field_name,
73e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			 const char *field_value,
74e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			 const char *field_str)
75e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
76e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	const char *handler_name = "define_flag_value";
77e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PyObject *handler, *t, *retval;
78e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	unsigned long long value;
79e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	unsigned n = 0;
80e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
81e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (field_type == PRINT_SYMBOL)
82e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		handler_name = "define_symbolic_value";
83e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
84e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	t = PyTuple_New(4);
85e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (!t)
86e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		Py_FatalError("couldn't create Python tuple");
87e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
88e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	value = eval_flag(field_value);
89e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
90e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PyTuple_SetItem(t, n++, PyString_FromString(ev_name));
91e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PyTuple_SetItem(t, n++, PyString_FromString(field_name));
92e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PyTuple_SetItem(t, n++, PyInt_FromLong(value));
93e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PyTuple_SetItem(t, n++, PyString_FromString(field_str));
94e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
95e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	handler = PyDict_GetItemString(main_dict, handler_name);
96e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (handler && PyCallable_Check(handler)) {
97e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		retval = PyObject_CallObject(handler, t);
98e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		if (retval == NULL)
99e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			handler_call_die(handler_name);
100e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	}
101e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
102e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	Py_DECREF(t);
103e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
104e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
105e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic void define_values(enum print_arg_type field_type,
106e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			  struct print_flag_sym *field,
107e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			  const char *ev_name,
108e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			  const char *field_name)
109e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
110e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	define_value(field_type, ev_name, field_name, field->value,
111e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		     field->str);
112e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
113e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (field->next)
114e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		define_values(field_type, field->next, ev_name, field_name);
115e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
116e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
117e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic void define_field(enum print_arg_type field_type,
118e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			 const char *ev_name,
119e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			 const char *field_name,
120e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			 const char *delim)
121e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
122e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	const char *handler_name = "define_flag_field";
123e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PyObject *handler, *t, *retval;
124e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	unsigned n = 0;
125e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
126e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (field_type == PRINT_SYMBOL)
127e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		handler_name = "define_symbolic_field";
128e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
129e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (field_type == PRINT_FLAGS)
130e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		t = PyTuple_New(3);
131e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	else
132e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		t = PyTuple_New(2);
133e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (!t)
134e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		Py_FatalError("couldn't create Python tuple");
135e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
136e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PyTuple_SetItem(t, n++, PyString_FromString(ev_name));
137e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PyTuple_SetItem(t, n++, PyString_FromString(field_name));
138e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (field_type == PRINT_FLAGS)
139e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		PyTuple_SetItem(t, n++, PyString_FromString(delim));
140e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
141e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	handler = PyDict_GetItemString(main_dict, handler_name);
142e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (handler && PyCallable_Check(handler)) {
143e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		retval = PyObject_CallObject(handler, t);
144e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		if (retval == NULL)
145e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			handler_call_die(handler_name);
146e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	}
147e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
148e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	Py_DECREF(t);
149e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
150e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
151e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic void define_event_symbols(struct event_format *event,
152e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				 const char *ev_name,
153e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				 struct print_arg *args)
154e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
155e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	switch (args->type) {
156e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	case PRINT_NULL:
157e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		break;
158e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	case PRINT_ATOM:
159e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		define_value(PRINT_FLAGS, ev_name, cur_field_name, "0",
160e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			     args->atom.atom);
161e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		zero_flag_atom = 0;
162e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		break;
163e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	case PRINT_FIELD:
164e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		if (cur_field_name)
165e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			free(cur_field_name);
166e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		cur_field_name = strdup(args->field.name);
167e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		break;
168e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	case PRINT_FLAGS:
169e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		define_event_symbols(event, ev_name, args->flags.field);
170e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		define_field(PRINT_FLAGS, ev_name, cur_field_name,
171e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			     args->flags.delim);
172e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		define_values(PRINT_FLAGS, args->flags.flags, ev_name,
173e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			      cur_field_name);
174e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		break;
175e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	case PRINT_SYMBOL:
176e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		define_event_symbols(event, ev_name, args->symbol.field);
177e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		define_field(PRINT_SYMBOL, ev_name, cur_field_name, NULL);
178e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		define_values(PRINT_SYMBOL, args->symbol.symbols, ev_name,
179e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			      cur_field_name);
180e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		break;
181e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	case PRINT_HEX:
182e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		define_event_symbols(event, ev_name, args->hex.field);
183e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		define_event_symbols(event, ev_name, args->hex.size);
184e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		break;
185e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	case PRINT_STRING:
186e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		break;
187e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	case PRINT_TYPE:
188e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		define_event_symbols(event, ev_name, args->typecast.item);
189e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		break;
190e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	case PRINT_OP:
191e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		if (strcmp(args->op.op, ":") == 0)
192e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			zero_flag_atom = 1;
193e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		define_event_symbols(event, ev_name, args->op.left);
194e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		define_event_symbols(event, ev_name, args->op.right);
195e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		break;
196e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	default:
197e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		/* gcc warns for these? */
198e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	case PRINT_BSTRING:
199e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	case PRINT_DYNAMIC_ARRAY:
200e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	case PRINT_FUNC:
201e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		/* we should warn... */
202e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		return;
203e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	}
204e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
205e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (args->next)
206e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		define_event_symbols(event, ev_name, args->next);
207e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
208e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
209e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic inline struct event_format *find_cache_event(struct perf_evsel *evsel)
210e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
211e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	static char ev_name[256];
212e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct event_format *event;
213e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int type = evsel->attr.config;
214e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
215e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	/*
216e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 	 * XXX: Do we really need to cache this since now we have evsel->tp_format
217e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 	 * cached already? Need to re-read this "cache" routine that as well calls
218e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 	 * define_event_symbols() :-\
219e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 	 */
220e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (events[type])
221e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		return events[type];
222e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
223e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	events[type] = event = evsel->tp_format;
224e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (!event)
225e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		return NULL;
226e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
227e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	sprintf(ev_name, "%s__%s", event->system, event->name);
228e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
229e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	define_event_symbols(event, ev_name, event->print_fmt.args);
230e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
231e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return event;
232e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
233e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
234e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic void python_process_tracepoint(union perf_event *perf_event
235e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				      __maybe_unused,
236e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				 struct perf_sample *sample,
237e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				 struct perf_evsel *evsel,
238e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				 struct machine *machine __maybe_unused,
239e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				 struct thread *thread,
240e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				 struct addr_location *al)
241e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
242e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PyObject *handler, *retval, *context, *t, *obj, *dict = NULL;
243e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	static char handler_name[256];
244e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct format_field *field;
245e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	unsigned long long val;
246e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	unsigned long s, ns;
247e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct event_format *event;
248e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	unsigned n = 0;
249e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int pid;
250e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int cpu = sample->cpu;
251e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	void *data = sample->raw_data;
252e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	unsigned long long nsecs = sample->time;
253e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char *comm = thread->comm;
254e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
255e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	t = PyTuple_New(MAX_FIELDS);
256e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (!t)
257e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		Py_FatalError("couldn't create Python tuple");
258e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
259e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	event = find_cache_event(evsel);
260e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (!event)
261e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		die("ug! no event found for type %d", (int)evsel->attr.config);
262e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
263e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	pid = raw_field_value(event, "common_pid", data);
264e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
265e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	sprintf(handler_name, "%s__%s", event->system, event->name);
266e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
267e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	handler = PyDict_GetItemString(main_dict, handler_name);
268e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (handler && !PyCallable_Check(handler))
269e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		handler = NULL;
270e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (!handler) {
271e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		dict = PyDict_New();
272e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		if (!dict)
273e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			Py_FatalError("couldn't create Python dict");
274e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	}
275e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	s = nsecs / NSECS_PER_SEC;
276e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ns = nsecs - s * NSECS_PER_SEC;
277e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
278e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	scripting_context->event_data = data;
279e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	scripting_context->pevent = evsel->tp_format->pevent;
280e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
281e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	context = PyCObject_FromVoidPtr(scripting_context, NULL);
282e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
283e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PyTuple_SetItem(t, n++, PyString_FromString(handler_name));
284e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PyTuple_SetItem(t, n++, context);
285e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
286e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (handler) {
287e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		PyTuple_SetItem(t, n++, PyInt_FromLong(cpu));
288e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		PyTuple_SetItem(t, n++, PyInt_FromLong(s));
289e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		PyTuple_SetItem(t, n++, PyInt_FromLong(ns));
290e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		PyTuple_SetItem(t, n++, PyInt_FromLong(pid));
291e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		PyTuple_SetItem(t, n++, PyString_FromString(comm));
292e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	} else {
293e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		pydict_set_item_string_decref(dict, "common_cpu", PyInt_FromLong(cpu));
294e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		pydict_set_item_string_decref(dict, "common_s", PyInt_FromLong(s));
295e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		pydict_set_item_string_decref(dict, "common_ns", PyInt_FromLong(ns));
296e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		pydict_set_item_string_decref(dict, "common_pid", PyInt_FromLong(pid));
297e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		pydict_set_item_string_decref(dict, "common_comm", PyString_FromString(comm));
298e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	}
299e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	for (field = event->format.fields; field; field = field->next) {
300e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		if (field->flags & FIELD_IS_STRING) {
301e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			int offset;
302e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			if (field->flags & FIELD_IS_DYNAMIC) {
303e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				offset = *(int *)(data + field->offset);
304e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				offset &= 0xffff;
305e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			} else
306e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				offset = field->offset;
307e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			obj = PyString_FromString((char *)data + offset);
308e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		} else { /* FIELD_IS_NUMERIC */
309e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			val = read_size(event, data + field->offset,
310e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng					field->size);
311e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			if (field->flags & FIELD_IS_SIGNED) {
312e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				if ((long long)val >= LONG_MIN &&
313e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				    (long long)val <= LONG_MAX)
314e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng					obj = PyInt_FromLong(val);
315e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				else
316e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng					obj = PyLong_FromLongLong(val);
317e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			} else {
318e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				if (val <= LONG_MAX)
319e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng					obj = PyInt_FromLong(val);
320e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				else
321e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng					obj = PyLong_FromUnsignedLongLong(val);
322e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			}
323e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		}
324e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		if (handler)
325e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			PyTuple_SetItem(t, n++, obj);
326e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		else
327e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			pydict_set_item_string_decref(dict, field->name, obj);
328e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
329e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	}
330e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (!handler)
331e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		PyTuple_SetItem(t, n++, dict);
332e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
333e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (_PyTuple_Resize(&t, n) == -1)
334e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		Py_FatalError("error resizing Python tuple");
335e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
336e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (handler) {
337e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		retval = PyObject_CallObject(handler, t);
338e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		if (retval == NULL)
339e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			handler_call_die(handler_name);
340e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	} else {
341e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		handler = PyDict_GetItemString(main_dict, "trace_unhandled");
342e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		if (handler && PyCallable_Check(handler)) {
343e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
344e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			retval = PyObject_CallObject(handler, t);
345e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			if (retval == NULL)
346e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				handler_call_die("trace_unhandled");
347e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		}
348e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		Py_DECREF(dict);
349e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	}
350e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
351e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	Py_DECREF(t);
352e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
353e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
354e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic void python_process_general_event(union perf_event *perf_event
355e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng					 __maybe_unused,
356e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng					 struct perf_sample *sample,
357e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng					 struct perf_evsel *evsel,
358e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng					 struct machine *machine __maybe_unused,
359e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng					 struct thread *thread,
360e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng					 struct addr_location *al)
361e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
362e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PyObject *handler, *retval, *t, *dict;
363e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	static char handler_name[64];
364e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	unsigned n = 0;
365e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
366e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	/*
367e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * Use the MAX_FIELDS to make the function expandable, though
368e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * currently there is only one item for the tuple.
369e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 */
370e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	t = PyTuple_New(MAX_FIELDS);
371e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (!t)
372e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		Py_FatalError("couldn't create Python tuple");
373e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
374e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	dict = PyDict_New();
375e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (!dict)
376e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		Py_FatalError("couldn't create Python dictionary");
377e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
378e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	snprintf(handler_name, sizeof(handler_name), "%s", "process_event");
379e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
380e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	handler = PyDict_GetItemString(main_dict, handler_name);
381e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (!handler || !PyCallable_Check(handler))
382e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		goto exit;
383e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
384e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	pydict_set_item_string_decref(dict, "ev_name", PyString_FromString(perf_evsel__name(evsel)));
385e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	pydict_set_item_string_decref(dict, "attr", PyString_FromStringAndSize(
386e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			(const char *)&evsel->attr, sizeof(evsel->attr)));
387e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	pydict_set_item_string_decref(dict, "sample", PyString_FromStringAndSize(
388e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			(const char *)sample, sizeof(*sample)));
389e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	pydict_set_item_string_decref(dict, "raw_buf", PyString_FromStringAndSize(
390e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			(const char *)sample->raw_data, sample->raw_size));
391e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	pydict_set_item_string_decref(dict, "comm",
392e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			PyString_FromString(thread->comm));
393e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (al->map) {
394e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		pydict_set_item_string_decref(dict, "dso",
395e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			PyString_FromString(al->map->dso->name));
396e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	}
397e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (al->sym) {
398e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		pydict_set_item_string_decref(dict, "symbol",
399e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			PyString_FromString(al->sym->name));
400e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	}
401e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
402e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PyTuple_SetItem(t, n++, dict);
403e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (_PyTuple_Resize(&t, n) == -1)
404e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		Py_FatalError("error resizing Python tuple");
405e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
406e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	retval = PyObject_CallObject(handler, t);
407e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (retval == NULL)
408e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		handler_call_die(handler_name);
409e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengexit:
410e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	Py_DECREF(dict);
411e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	Py_DECREF(t);
412e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
413e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
414e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic void python_process_event(union perf_event *perf_event,
415e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				 struct perf_sample *sample,
416e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				 struct perf_evsel *evsel,
417e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				 struct machine *machine,
418e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				 struct thread *thread,
419e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				 struct addr_location *al)
420e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
421e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	switch (evsel->attr.type) {
422e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	case PERF_TYPE_TRACEPOINT:
423e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		python_process_tracepoint(perf_event, sample, evsel,
424e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng					  machine, thread, al);
425e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		break;
426e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	/* Reserve for future process_hw/sw/raw APIs */
427e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	default:
428e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		python_process_general_event(perf_event, sample, evsel,
429e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng					     machine, thread, al);
430e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	}
431e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
432e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
433e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int run_start_sub(void)
434e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
435e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PyObject *handler, *retval;
436e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int err = 0;
437e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
438e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	main_module = PyImport_AddModule("__main__");
439e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (main_module == NULL)
440e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		return -1;
441e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	Py_INCREF(main_module);
442e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
443e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	main_dict = PyModule_GetDict(main_module);
444e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (main_dict == NULL) {
445e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		err = -1;
446e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		goto error;
447e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	}
448e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	Py_INCREF(main_dict);
449e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
450e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	handler = PyDict_GetItemString(main_dict, "trace_begin");
451e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (handler == NULL || !PyCallable_Check(handler))
452e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		goto out;
453e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
454e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	retval = PyObject_CallObject(handler, NULL);
455e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (retval == NULL)
456e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		handler_call_die("trace_begin");
457e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
458e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	Py_DECREF(retval);
459e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return err;
460e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengerror:
461e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	Py_XDECREF(main_dict);
462e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	Py_XDECREF(main_module);
463e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengout:
464e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return err;
465e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
466e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
467e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/*
468e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Start trace script
469e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */
470e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int python_start_script(const char *script, int argc, const char **argv)
471e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
472e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	const char **command_line;
473e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char buf[PATH_MAX];
474e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int i, err = 0;
475e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FILE *fp;
476e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
477e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	command_line = malloc((argc + 1) * sizeof(const char *));
478e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	command_line[0] = script;
479e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	for (i = 1; i < argc + 1; i++)
480e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		command_line[i] = argv[i - 1];
481e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
482e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	Py_Initialize();
483e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
484e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	initperf_trace_context();
485e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
486e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PySys_SetArgv(argc + 1, (char **)command_line);
487e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
488e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	fp = fopen(script, "r");
489e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (!fp) {
490e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		sprintf(buf, "Can't open python script \"%s\"", script);
491e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		perror(buf);
492e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		err = -1;
493e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		goto error;
494e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	}
495e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
496e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	err = PyRun_SimpleFile(fp, script);
497e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (err) {
498e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		fprintf(stderr, "Error running python script %s\n", script);
499e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		goto error;
500e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	}
501e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
502e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	err = run_start_sub();
503e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (err) {
504e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		fprintf(stderr, "Error starting python script %s\n", script);
505e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		goto error;
506e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	}
507e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
508e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	free(command_line);
509e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
510e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return err;
511e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengerror:
512e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	Py_Finalize();
513e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	free(command_line);
514e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
515e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return err;
516e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
517e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
518e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/*
519e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Stop trace script
520e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */
521e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int python_stop_script(void)
522e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
523e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PyObject *handler, *retval;
524e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int err = 0;
525e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
526e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	handler = PyDict_GetItemString(main_dict, "trace_end");
527e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (handler == NULL || !PyCallable_Check(handler))
528e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		goto out;
529e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
530e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	retval = PyObject_CallObject(handler, NULL);
531e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (retval == NULL)
532e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		handler_call_die("trace_end");
533e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	else
534e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		Py_DECREF(retval);
535e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengout:
536e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	Py_XDECREF(main_dict);
537e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	Py_XDECREF(main_module);
538e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	Py_Finalize();
539e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
540e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return err;
541e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
542e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
543e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int python_generate_script(struct pevent *pevent, const char *outfile)
544e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
545e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct event_format *event = NULL;
546e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct format_field *f;
547e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char fname[PATH_MAX];
548e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int not_first, count;
549e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FILE *ofp;
550e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
551e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	sprintf(fname, "%s.py", outfile);
552e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ofp = fopen(fname, "w");
553e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (ofp == NULL) {
554e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		fprintf(stderr, "couldn't open %s\n", fname);
555e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		return -1;
556e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	}
557e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	fprintf(ofp, "# perf script event handlers, "
558e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		"generated by perf script -g python\n");
559e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
560e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	fprintf(ofp, "# Licensed under the terms of the GNU GPL"
561e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		" License version 2\n\n");
562e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
563e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	fprintf(ofp, "# The common_* event handler fields are the most useful "
564e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		"fields common to\n");
565e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
566e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	fprintf(ofp, "# all events.  They don't necessarily correspond to "
567e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		"the 'common_*' fields\n");
568e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
569e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	fprintf(ofp, "# in the format files.  Those fields not available as "
570e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		"handler params can\n");
571e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
572e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	fprintf(ofp, "# be retrieved using Python functions of the form "
573e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		"common_*(context).\n");
574e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
575e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	fprintf(ofp, "# See the perf-trace-python Documentation for the list "
576e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		"of available functions.\n\n");
577e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
578e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	fprintf(ofp, "import os\n");
579e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	fprintf(ofp, "import sys\n\n");
580e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
581e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	fprintf(ofp, "sys.path.append(os.environ['PERF_EXEC_PATH'] + \\\n");
582e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	fprintf(ofp, "\t'/scripts/python/Perf-Trace-Util/lib/Perf/Trace')\n");
583e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	fprintf(ofp, "\nfrom perf_trace_context import *\n");
584e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	fprintf(ofp, "from Core import *\n\n\n");
585e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
586e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	fprintf(ofp, "def trace_begin():\n");
587e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	fprintf(ofp, "\tprint \"in trace_begin\"\n\n");
588e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
589e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	fprintf(ofp, "def trace_end():\n");
590e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	fprintf(ofp, "\tprint \"in trace_end\"\n\n");
591e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
592e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	while ((event = trace_find_next_event(pevent, event))) {
593e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		fprintf(ofp, "def %s__%s(", event->system, event->name);
594e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		fprintf(ofp, "event_name, ");
595e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		fprintf(ofp, "context, ");
596e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		fprintf(ofp, "common_cpu,\n");
597e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		fprintf(ofp, "\tcommon_secs, ");
598e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		fprintf(ofp, "common_nsecs, ");
599e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		fprintf(ofp, "common_pid, ");
600e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		fprintf(ofp, "common_comm,\n\t");
601e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
602e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		not_first = 0;
603e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		count = 0;
604e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
605e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		for (f = event->format.fields; f; f = f->next) {
606e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			if (not_first++)
607e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				fprintf(ofp, ", ");
608e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			if (++count % 5 == 0)
609e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				fprintf(ofp, "\n\t");
610e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
611e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			fprintf(ofp, "%s", f->name);
612e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		}
613e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		fprintf(ofp, "):\n");
614e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
615e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		fprintf(ofp, "\t\tprint_header(event_name, common_cpu, "
616e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			"common_secs, common_nsecs,\n\t\t\t"
617e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			"common_pid, common_comm)\n\n");
618e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
619e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		fprintf(ofp, "\t\tprint \"");
620e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
621e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		not_first = 0;
622e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		count = 0;
623e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
624e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		for (f = event->format.fields; f; f = f->next) {
625e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			if (not_first++)
626e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				fprintf(ofp, ", ");
627e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			if (count && count % 3 == 0) {
628e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				fprintf(ofp, "\" \\\n\t\t\"");
629e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			}
630e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			count++;
631e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
632e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			fprintf(ofp, "%s=", f->name);
633e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			if (f->flags & FIELD_IS_STRING ||
634e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			    f->flags & FIELD_IS_FLAG ||
635e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			    f->flags & FIELD_IS_SYMBOLIC)
636e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				fprintf(ofp, "%%s");
637e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			else if (f->flags & FIELD_IS_SIGNED)
638e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				fprintf(ofp, "%%d");
639e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			else
640e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				fprintf(ofp, "%%u");
641e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		}
642e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
643e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		fprintf(ofp, "\\n\" %% \\\n\t\t(");
644e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
645e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		not_first = 0;
646e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		count = 0;
647e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
648e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		for (f = event->format.fields; f; f = f->next) {
649e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			if (not_first++)
650e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				fprintf(ofp, ", ");
651e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
652e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			if (++count % 5 == 0)
653e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				fprintf(ofp, "\n\t\t");
654e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
655e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			if (f->flags & FIELD_IS_FLAG) {
656e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				if ((count - 1) % 5 != 0) {
657e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng					fprintf(ofp, "\n\t\t");
658e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng					count = 4;
659e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				}
660e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				fprintf(ofp, "flag_str(\"");
661e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				fprintf(ofp, "%s__%s\", ", event->system,
662e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng					event->name);
663e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				fprintf(ofp, "\"%s\", %s)", f->name,
664e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng					f->name);
665e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			} else if (f->flags & FIELD_IS_SYMBOLIC) {
666e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				if ((count - 1) % 5 != 0) {
667e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng					fprintf(ofp, "\n\t\t");
668e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng					count = 4;
669e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				}
670e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				fprintf(ofp, "symbol_str(\"");
671e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				fprintf(ofp, "%s__%s\", ", event->system,
672e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng					event->name);
673e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				fprintf(ofp, "\"%s\", %s)", f->name,
674e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng					f->name);
675e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			} else
676e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				fprintf(ofp, "%s", f->name);
677e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		}
678e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
679e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		fprintf(ofp, "),\n\n");
680e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	}
681e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
682e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	fprintf(ofp, "def trace_unhandled(event_name, context, "
683e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		"event_fields_dict):\n");
684e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
685e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	fprintf(ofp, "\t\tprint ' '.join(['%%s=%%s'%%(k,str(v))"
686e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		"for k,v in sorted(event_fields_dict.items())])\n\n");
687e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
688e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	fprintf(ofp, "def print_header("
689e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		"event_name, cpu, secs, nsecs, pid, comm):\n"
690e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		"\tprint \"%%-20s %%5u %%05u.%%09u %%8u %%-20s \" %% \\\n\t"
691e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		"(event_name, cpu, secs, nsecs, pid, comm),\n");
692e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
693e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	fclose(ofp);
694e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
695e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	fprintf(stderr, "generated Python script: %s\n", fname);
696e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
697e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return 0;
698e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
699e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
700e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct scripting_ops python_scripting_ops = {
701e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	.name = "Python",
702e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	.start_script = python_start_script,
703e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	.stop_script = python_stop_script,
704e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	.process_event = python_process_event,
705e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	.generate_script = python_generate_script,
706e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
707