11a59d1b8SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later 27e4b21b8STom Zanussi /* 3133dc4c3SIngo Molnar * Context.c. Python interfaces for perf script. 47e4b21b8STom Zanussi * 57e4b21b8STom Zanussi * Copyright (C) 2010 Tom Zanussi <[email protected]> 67e4b21b8STom Zanussi */ 77e4b21b8STom Zanussi 87e4b21b8STom Zanussi #include <Python.h> 97e4b21b8STom Zanussi #include "../../../util/trace-event.h" 107e4b21b8STom Zanussi 1166dfdff0SJaroslav Škarvada #if PY_MAJOR_VERSION < 3 1266dfdff0SJaroslav Škarvada #define _PyCapsule_GetPointer(arg1, arg2) \ 1366dfdff0SJaroslav Škarvada PyCObject_AsVoidPtr(arg1) 1466dfdff0SJaroslav Škarvada 157e4b21b8STom Zanussi PyMODINIT_FUNC initperf_trace_context(void); 1666dfdff0SJaroslav Škarvada #else 1766dfdff0SJaroslav Škarvada #define _PyCapsule_GetPointer(arg1, arg2) \ 1866dfdff0SJaroslav Škarvada PyCapsule_GetPointer((arg1), (arg2)) 1966dfdff0SJaroslav Škarvada 2066dfdff0SJaroslav Škarvada PyMODINIT_FUNC PyInit_perf_trace_context(void); 2166dfdff0SJaroslav Škarvada #endif 227e4b21b8STom Zanussi 236337bd0cSAdrian Hunter static struct scripting_context *get_scripting_context(PyObject *args) 247e4b21b8STom Zanussi { 257e4b21b8STom Zanussi PyObject *context; 267e4b21b8STom Zanussi 277e4b21b8STom Zanussi if (!PyArg_ParseTuple(args, "O", &context)) 287e4b21b8STom Zanussi return NULL; 297e4b21b8STom Zanussi 306337bd0cSAdrian Hunter return _PyCapsule_GetPointer(context, NULL); 316337bd0cSAdrian Hunter } 327e4b21b8STom Zanussi 336337bd0cSAdrian Hunter static PyObject *perf_trace_context_common_pc(PyObject *obj, PyObject *args) 346337bd0cSAdrian Hunter { 356337bd0cSAdrian Hunter struct scripting_context *c = get_scripting_context(args); 366337bd0cSAdrian Hunter 376337bd0cSAdrian Hunter if (!c) 386337bd0cSAdrian Hunter return NULL; 396337bd0cSAdrian Hunter 406337bd0cSAdrian Hunter return Py_BuildValue("i", common_pc(c)); 417e4b21b8STom Zanussi } 427e4b21b8STom Zanussi 43316c7136SArnaldo Carvalho de Melo static PyObject *perf_trace_context_common_flags(PyObject *obj, 447e4b21b8STom Zanussi PyObject *args) 457e4b21b8STom Zanussi { 466337bd0cSAdrian Hunter struct scripting_context *c = get_scripting_context(args); 477e4b21b8STom Zanussi 486337bd0cSAdrian Hunter if (!c) 497e4b21b8STom Zanussi return NULL; 507e4b21b8STom Zanussi 516337bd0cSAdrian Hunter return Py_BuildValue("i", common_flags(c)); 527e4b21b8STom Zanussi } 537e4b21b8STom Zanussi 54316c7136SArnaldo Carvalho de Melo static PyObject *perf_trace_context_common_lock_depth(PyObject *obj, 557e4b21b8STom Zanussi PyObject *args) 567e4b21b8STom Zanussi { 576337bd0cSAdrian Hunter struct scripting_context *c = get_scripting_context(args); 587e4b21b8STom Zanussi 596337bd0cSAdrian Hunter if (!c) 607e4b21b8STom Zanussi return NULL; 617e4b21b8STom Zanussi 626337bd0cSAdrian Hunter return Py_BuildValue("i", common_lock_depth(c)); 637e4b21b8STom Zanussi } 647e4b21b8STom Zanussi 657e4b21b8STom Zanussi static PyMethodDef ContextMethods[] = { 667e4b21b8STom Zanussi { "common_pc", perf_trace_context_common_pc, METH_VARARGS, 677e4b21b8STom Zanussi "Get the common preempt count event field value."}, 687e4b21b8STom Zanussi { "common_flags", perf_trace_context_common_flags, METH_VARARGS, 697e4b21b8STom Zanussi "Get the common flags event field value."}, 707e4b21b8STom Zanussi { "common_lock_depth", perf_trace_context_common_lock_depth, 717e4b21b8STom Zanussi METH_VARARGS, "Get the common lock depth event field value."}, 727e4b21b8STom Zanussi { NULL, NULL, 0, NULL} 737e4b21b8STom Zanussi }; 747e4b21b8STom Zanussi 7566dfdff0SJaroslav Škarvada #if PY_MAJOR_VERSION < 3 767e4b21b8STom Zanussi PyMODINIT_FUNC initperf_trace_context(void) 777e4b21b8STom Zanussi { 787e4b21b8STom Zanussi (void) Py_InitModule("perf_trace_context", ContextMethods); 797e4b21b8STom Zanussi } 8066dfdff0SJaroslav Škarvada #else 8166dfdff0SJaroslav Škarvada PyMODINIT_FUNC PyInit_perf_trace_context(void) 8266dfdff0SJaroslav Škarvada { 8366dfdff0SJaroslav Škarvada static struct PyModuleDef moduledef = { 8466dfdff0SJaroslav Škarvada PyModuleDef_HEAD_INIT, 8566dfdff0SJaroslav Škarvada "perf_trace_context", /* m_name */ 8666dfdff0SJaroslav Škarvada "", /* m_doc */ 8766dfdff0SJaroslav Škarvada -1, /* m_size */ 8866dfdff0SJaroslav Škarvada ContextMethods, /* m_methods */ 8966dfdff0SJaroslav Škarvada NULL, /* m_reload */ 9066dfdff0SJaroslav Škarvada NULL, /* m_traverse */ 9166dfdff0SJaroslav Škarvada NULL, /* m_clear */ 9266dfdff0SJaroslav Škarvada NULL, /* m_free */ 9366dfdff0SJaroslav Škarvada }; 94*cf9bfa6cSAdrian Hunter PyObject *mod; 95*cf9bfa6cSAdrian Hunter 96*cf9bfa6cSAdrian Hunter mod = PyModule_Create(&moduledef); 97*cf9bfa6cSAdrian Hunter /* Add perf_script_context to the module so it can be imported */ 98*cf9bfa6cSAdrian Hunter PyObject_SetAttrString(mod, "perf_script_context", Py_None); 99*cf9bfa6cSAdrian Hunter 100*cf9bfa6cSAdrian Hunter return mod; 10166dfdff0SJaroslav Škarvada } 10266dfdff0SJaroslav Škarvada #endif 103