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