~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/tools/perf/scripts/python/Perf-Trace-Util/Context.c

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 // SPDX-License-Identifier: GPL-2.0-or-later
  2 /*
  3  * Context.c.  Python interfaces for perf script.
  4  *
  5  * Copyright (C) 2010 Tom Zanussi <tzanussi@gmail.com>
  6  */
  7 
  8 /*
  9  * Use Py_ssize_t for '#' formats to avoid DeprecationWarning: PY_SSIZE_T_CLEAN
 10  * will be required for '#' formats.
 11  */
 12 #define PY_SSIZE_T_CLEAN
 13 
 14 #include <Python.h>
 15 #include "../../../util/trace-event.h"
 16 #include "../../../util/event.h"
 17 #include "../../../util/symbol.h"
 18 #include "../../../util/thread.h"
 19 #include "../../../util/map.h"
 20 #include "../../../util/maps.h"
 21 #include "../../../util/auxtrace.h"
 22 #include "../../../util/session.h"
 23 #include "../../../util/srcline.h"
 24 #include "../../../util/srccode.h"
 25 
 26 #if PY_MAJOR_VERSION < 3
 27 #define _PyCapsule_GetPointer(arg1, arg2) \
 28   PyCObject_AsVoidPtr(arg1)
 29 #define _PyBytes_FromStringAndSize(arg1, arg2) \
 30   PyString_FromStringAndSize((arg1), (arg2))
 31 #define _PyUnicode_AsUTF8(arg) \
 32   PyString_AsString(arg)
 33 
 34 PyMODINIT_FUNC initperf_trace_context(void);
 35 #else
 36 #define _PyCapsule_GetPointer(arg1, arg2) \
 37   PyCapsule_GetPointer((arg1), (arg2))
 38 #define _PyBytes_FromStringAndSize(arg1, arg2) \
 39   PyBytes_FromStringAndSize((arg1), (arg2))
 40 #define _PyUnicode_AsUTF8(arg) \
 41   PyUnicode_AsUTF8(arg)
 42 
 43 PyMODINIT_FUNC PyInit_perf_trace_context(void);
 44 #endif
 45 
 46 static struct scripting_context *get_args(PyObject *args, const char *name, PyObject **arg2)
 47 {
 48         int cnt = 1 + !!arg2;
 49         PyObject *context;
 50 
 51         if (!PyArg_UnpackTuple(args, name, 1, cnt, &context, arg2))
 52                 return NULL;
 53 
 54         return _PyCapsule_GetPointer(context, NULL);
 55 }
 56 
 57 static struct scripting_context *get_scripting_context(PyObject *args)
 58 {
 59         return get_args(args, "context", NULL);
 60 }
 61 
 62 #ifdef HAVE_LIBTRACEEVENT
 63 static PyObject *perf_trace_context_common_pc(PyObject *obj, PyObject *args)
 64 {
 65         struct scripting_context *c = get_scripting_context(args);
 66 
 67         if (!c)
 68                 return NULL;
 69 
 70         return Py_BuildValue("i", common_pc(c));
 71 }
 72 
 73 static PyObject *perf_trace_context_common_flags(PyObject *obj,
 74                                                  PyObject *args)
 75 {
 76         struct scripting_context *c = get_scripting_context(args);
 77 
 78         if (!c)
 79                 return NULL;
 80 
 81         return Py_BuildValue("i", common_flags(c));
 82 }
 83 
 84 static PyObject *perf_trace_context_common_lock_depth(PyObject *obj,
 85                                                       PyObject *args)
 86 {
 87         struct scripting_context *c = get_scripting_context(args);
 88 
 89         if (!c)
 90                 return NULL;
 91 
 92         return Py_BuildValue("i", common_lock_depth(c));
 93 }
 94 #endif
 95 
 96 static PyObject *perf_sample_insn(PyObject *obj, PyObject *args)
 97 {
 98         struct scripting_context *c = get_scripting_context(args);
 99 
100         if (!c)
101                 return NULL;
102 
103         if (c->sample->ip && !c->sample->insn_len && thread__maps(c->al->thread)) {
104                 struct machine *machine =  maps__machine(thread__maps(c->al->thread));
105 
106                 script_fetch_insn(c->sample, c->al->thread, machine);
107         }
108         if (!c->sample->insn_len)
109                 Py_RETURN_NONE; /* N.B. This is a return statement */
110 
111         return _PyBytes_FromStringAndSize(c->sample->insn, c->sample->insn_len);
112 }
113 
114 static PyObject *perf_set_itrace_options(PyObject *obj, PyObject *args)
115 {
116         struct scripting_context *c;
117         const char *itrace_options;
118         int retval = -1;
119         PyObject *str;
120 
121         c = get_args(args, "itrace_options", &str);
122         if (!c)
123                 return NULL;
124 
125         if (!c->session || !c->session->itrace_synth_opts)
126                 goto out;
127 
128         if (c->session->itrace_synth_opts->set) {
129                 retval = 1;
130                 goto out;
131         }
132 
133         itrace_options = _PyUnicode_AsUTF8(str);
134 
135         retval = itrace_do_parse_synth_opts(c->session->itrace_synth_opts, itrace_options, 0);
136 out:
137         return Py_BuildValue("i", retval);
138 }
139 
140 static PyObject *perf_sample_src(PyObject *obj, PyObject *args, bool get_srccode)
141 {
142         struct scripting_context *c = get_scripting_context(args);
143         unsigned int line = 0;
144         char *srcfile = NULL;
145         char *srccode = NULL;
146         PyObject *result;
147         struct map *map;
148         struct dso *dso;
149         int len = 0;
150         u64 addr;
151 
152         if (!c)
153                 return NULL;
154 
155         map = c->al->map;
156         addr = c->al->addr;
157         dso = map ? map__dso(map) : NULL;
158 
159         if (dso)
160                 srcfile = get_srcline_split(dso, map__rip_2objdump(map, addr), &line);
161 
162         if (get_srccode) {
163                 if (srcfile)
164                         srccode = find_sourceline(srcfile, line, &len);
165                 result = Py_BuildValue("(sIs#)", srcfile, line, srccode, (Py_ssize_t)len);
166         } else {
167                 result = Py_BuildValue("(sI)", srcfile, line);
168         }
169 
170         free(srcfile);
171 
172         return result;
173 }
174 
175 static PyObject *perf_sample_srcline(PyObject *obj, PyObject *args)
176 {
177         return perf_sample_src(obj, args, false);
178 }
179 
180 static PyObject *perf_sample_srccode(PyObject *obj, PyObject *args)
181 {
182         return perf_sample_src(obj, args, true);
183 }
184 
185 static PyMethodDef ContextMethods[] = {
186 #ifdef HAVE_LIBTRACEEVENT
187         { "common_pc", perf_trace_context_common_pc, METH_VARARGS,
188           "Get the common preempt count event field value."},
189         { "common_flags", perf_trace_context_common_flags, METH_VARARGS,
190           "Get the common flags event field value."},
191         { "common_lock_depth", perf_trace_context_common_lock_depth,
192           METH_VARARGS, "Get the common lock depth event field value."},
193 #endif
194         { "perf_sample_insn", perf_sample_insn,
195           METH_VARARGS, "Get the machine code instruction."},
196         { "perf_set_itrace_options", perf_set_itrace_options,
197           METH_VARARGS, "Set --itrace options."},
198         { "perf_sample_srcline", perf_sample_srcline,
199           METH_VARARGS, "Get source file name and line number."},
200         { "perf_sample_srccode", perf_sample_srccode,
201           METH_VARARGS, "Get source file name, line number and line."},
202         { NULL, NULL, 0, NULL}
203 };
204 
205 #if PY_MAJOR_VERSION < 3
206 PyMODINIT_FUNC initperf_trace_context(void)
207 {
208         (void) Py_InitModule("perf_trace_context", ContextMethods);
209 }
210 #else
211 PyMODINIT_FUNC PyInit_perf_trace_context(void)
212 {
213         static struct PyModuleDef moduledef = {
214                 PyModuleDef_HEAD_INIT,
215                 "perf_trace_context",   /* m_name */
216                 "",                     /* m_doc */
217                 -1,                     /* m_size */
218                 ContextMethods,         /* m_methods */
219                 NULL,                   /* m_reload */
220                 NULL,                   /* m_traverse */
221                 NULL,                   /* m_clear */
222                 NULL,                   /* m_free */
223         };
224         PyObject *mod;
225 
226         mod = PyModule_Create(&moduledef);
227         /* Add perf_script_context to the module so it can be imported */
228         PyObject_SetAttrString(mod, "perf_script_context", Py_None);
229 
230         return mod;
231 }
232 #endif
233 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php