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