18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Context.c.  Python interfaces for perf script.
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Copyright (C) 2010 Tom Zanussi <tzanussi@gmail.com>
68c2ecf20Sopenharmony_ci */
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci#include <Python.h>
98c2ecf20Sopenharmony_ci#include "../../../util/trace-event.h"
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci#if PY_MAJOR_VERSION < 3
128c2ecf20Sopenharmony_ci#define _PyCapsule_GetPointer(arg1, arg2) \
138c2ecf20Sopenharmony_ci  PyCObject_AsVoidPtr(arg1)
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ciPyMODINIT_FUNC initperf_trace_context(void);
168c2ecf20Sopenharmony_ci#else
178c2ecf20Sopenharmony_ci#define _PyCapsule_GetPointer(arg1, arg2) \
188c2ecf20Sopenharmony_ci  PyCapsule_GetPointer((arg1), (arg2))
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_ciPyMODINIT_FUNC PyInit_perf_trace_context(void);
218c2ecf20Sopenharmony_ci#endif
228c2ecf20Sopenharmony_ci
238c2ecf20Sopenharmony_cistatic PyObject *perf_trace_context_common_pc(PyObject *obj, PyObject *args)
248c2ecf20Sopenharmony_ci{
258c2ecf20Sopenharmony_ci	static struct scripting_context *scripting_context;
268c2ecf20Sopenharmony_ci	PyObject *context;
278c2ecf20Sopenharmony_ci	int retval;
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_ci	if (!PyArg_ParseTuple(args, "O", &context))
308c2ecf20Sopenharmony_ci		return NULL;
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_ci	scripting_context = _PyCapsule_GetPointer(context, NULL);
338c2ecf20Sopenharmony_ci	retval = common_pc(scripting_context);
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_ci	return Py_BuildValue("i", retval);
368c2ecf20Sopenharmony_ci}
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_cistatic PyObject *perf_trace_context_common_flags(PyObject *obj,
398c2ecf20Sopenharmony_ci						 PyObject *args)
408c2ecf20Sopenharmony_ci{
418c2ecf20Sopenharmony_ci	static struct scripting_context *scripting_context;
428c2ecf20Sopenharmony_ci	PyObject *context;
438c2ecf20Sopenharmony_ci	int retval;
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_ci	if (!PyArg_ParseTuple(args, "O", &context))
468c2ecf20Sopenharmony_ci		return NULL;
478c2ecf20Sopenharmony_ci
488c2ecf20Sopenharmony_ci	scripting_context = _PyCapsule_GetPointer(context, NULL);
498c2ecf20Sopenharmony_ci	retval = common_flags(scripting_context);
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_ci	return Py_BuildValue("i", retval);
528c2ecf20Sopenharmony_ci}
538c2ecf20Sopenharmony_ci
548c2ecf20Sopenharmony_cistatic PyObject *perf_trace_context_common_lock_depth(PyObject *obj,
558c2ecf20Sopenharmony_ci						      PyObject *args)
568c2ecf20Sopenharmony_ci{
578c2ecf20Sopenharmony_ci	static struct scripting_context *scripting_context;
588c2ecf20Sopenharmony_ci	PyObject *context;
598c2ecf20Sopenharmony_ci	int retval;
608c2ecf20Sopenharmony_ci
618c2ecf20Sopenharmony_ci	if (!PyArg_ParseTuple(args, "O", &context))
628c2ecf20Sopenharmony_ci		return NULL;
638c2ecf20Sopenharmony_ci
648c2ecf20Sopenharmony_ci	scripting_context = _PyCapsule_GetPointer(context, NULL);
658c2ecf20Sopenharmony_ci	retval = common_lock_depth(scripting_context);
668c2ecf20Sopenharmony_ci
678c2ecf20Sopenharmony_ci	return Py_BuildValue("i", retval);
688c2ecf20Sopenharmony_ci}
698c2ecf20Sopenharmony_ci
708c2ecf20Sopenharmony_cistatic PyMethodDef ContextMethods[] = {
718c2ecf20Sopenharmony_ci	{ "common_pc", perf_trace_context_common_pc, METH_VARARGS,
728c2ecf20Sopenharmony_ci	  "Get the common preempt count event field value."},
738c2ecf20Sopenharmony_ci	{ "common_flags", perf_trace_context_common_flags, METH_VARARGS,
748c2ecf20Sopenharmony_ci	  "Get the common flags event field value."},
758c2ecf20Sopenharmony_ci	{ "common_lock_depth", perf_trace_context_common_lock_depth,
768c2ecf20Sopenharmony_ci	  METH_VARARGS,	"Get the common lock depth event field value."},
778c2ecf20Sopenharmony_ci	{ NULL, NULL, 0, NULL}
788c2ecf20Sopenharmony_ci};
798c2ecf20Sopenharmony_ci
808c2ecf20Sopenharmony_ci#if PY_MAJOR_VERSION < 3
818c2ecf20Sopenharmony_ciPyMODINIT_FUNC initperf_trace_context(void)
828c2ecf20Sopenharmony_ci{
838c2ecf20Sopenharmony_ci	(void) Py_InitModule("perf_trace_context", ContextMethods);
848c2ecf20Sopenharmony_ci}
858c2ecf20Sopenharmony_ci#else
868c2ecf20Sopenharmony_ciPyMODINIT_FUNC PyInit_perf_trace_context(void)
878c2ecf20Sopenharmony_ci{
888c2ecf20Sopenharmony_ci	static struct PyModuleDef moduledef = {
898c2ecf20Sopenharmony_ci		PyModuleDef_HEAD_INIT,
908c2ecf20Sopenharmony_ci		"perf_trace_context",	/* m_name */
918c2ecf20Sopenharmony_ci		"",			/* m_doc */
928c2ecf20Sopenharmony_ci		-1,			/* m_size */
938c2ecf20Sopenharmony_ci		ContextMethods,		/* m_methods */
948c2ecf20Sopenharmony_ci		NULL,			/* m_reload */
958c2ecf20Sopenharmony_ci		NULL,			/* m_traverse */
968c2ecf20Sopenharmony_ci		NULL,			/* m_clear */
978c2ecf20Sopenharmony_ci		NULL,			/* m_free */
988c2ecf20Sopenharmony_ci	};
998c2ecf20Sopenharmony_ci	return PyModule_Create(&moduledef);
1008c2ecf20Sopenharmony_ci}
1018c2ecf20Sopenharmony_ci#endif
102