xref: /openbmc/qemu/scripts/tracetool/format/simpletrace_stap.py (revision 73d336510cf118fcc2ee7e98e774a193cf661614)
13f8b112dSStefan Hajnoczi# -*- coding: utf-8 -*-
23f8b112dSStefan Hajnoczi
33f8b112dSStefan Hajnoczi"""
43f8b112dSStefan HajnocziGenerate .stp file that outputs simpletrace binary traces (DTrace with SystemTAP only).
53f8b112dSStefan Hajnoczi"""
63f8b112dSStefan Hajnoczi
73f8b112dSStefan Hajnoczi__author__     = "Stefan Hajnoczi <redhat.com>"
83f8b112dSStefan Hajnoczi__copyright__  = "Copyright (C) 2014, Red Hat, Inc."
93f8b112dSStefan Hajnoczi__license__    = "GPL version 2 or (at your option) any later version"
103f8b112dSStefan Hajnoczi
113f8b112dSStefan Hajnoczi__maintainer__ = "Stefan Hajnoczi"
123f8b112dSStefan Hajnoczi__email__      = "stefanha@redhat.com"
133f8b112dSStefan Hajnoczi
143f8b112dSStefan Hajnoczi
153f8b112dSStefan Hajnoczifrom tracetool import out
16*9ab5a24bSPhilippe Mathieu-Daudéfrom tracetool.backend.dtrace import probeprefix
173f8b112dSStefan Hajnoczifrom tracetool.backend.simple import is_string
183f8b112dSStefan Hajnoczifrom tracetool.format.stap import stap_escape
193f8b112dSStefan Hajnoczi
20ea1ff54fSDaniel P. Berrangedef global_var_name(name):
21ea1ff54fSDaniel P. Berrange    return probeprefix().replace(".", "_") + "_" + name
223f8b112dSStefan Hajnoczi
2380dd5c49SDaniel P. Berrangedef generate(events, backend, group):
243f8b112dSStefan Hajnoczi    out('/* This file is autogenerated by tracetool, do not edit. */',
25d6b76d68SStefan Hajnoczi        '')
263f8b112dSStefan Hajnoczi
273f8b112dSStefan Hajnoczi    for event_id, e in enumerate(events):
283f8b112dSStefan Hajnoczi        if 'disable' in e.properties:
293f8b112dSStefan Hajnoczi            continue
303f8b112dSStefan Hajnoczi
313f8b112dSStefan Hajnoczi        out('probe %(probeprefix)s.simpletrace.%(name)s = %(probeprefix)s.%(name)s ?',
323f8b112dSStefan Hajnoczi            '{',
333f8b112dSStefan Hajnoczi            probeprefix=probeprefix(),
343f8b112dSStefan Hajnoczi            name=e.name)
353f8b112dSStefan Hajnoczi
363f8b112dSStefan Hajnoczi        # Calculate record size
373f8b112dSStefan Hajnoczi        sizes = ['24'] # sizeof(TraceRecord)
383f8b112dSStefan Hajnoczi        for type_, name in e.args:
393f8b112dSStefan Hajnoczi            name = stap_escape(name)
403f8b112dSStefan Hajnoczi            if is_string(type_):
413f8b112dSStefan Hajnoczi                out('    try {',
423f8b112dSStefan Hajnoczi                    '        arg%(name)s_str = %(name)s ? user_string_n(%(name)s, 512) : "<null>"',
433f8b112dSStefan Hajnoczi                    '    } catch {}',
443f8b112dSStefan Hajnoczi                    '    arg%(name)s_len = strlen(arg%(name)s_str)',
453f8b112dSStefan Hajnoczi                    name=name)
463f8b112dSStefan Hajnoczi                sizes.append('4 + arg%s_len' % name)
473f8b112dSStefan Hajnoczi            else:
483f8b112dSStefan Hajnoczi                sizes.append('8')
493f8b112dSStefan Hajnoczi        sizestr = ' + '.join(sizes)
503f8b112dSStefan Hajnoczi
513f8b112dSStefan Hajnoczi        # Generate format string and value pairs for record header and arguments
52d6b76d68SStefan Hajnoczi        fields = [('8b', str(event_id)),
533f8b112dSStefan Hajnoczi                  ('8b', 'gettimeofday_ns()'),
543f8b112dSStefan Hajnoczi                  ('4b', sizestr),
553f8b112dSStefan Hajnoczi                  ('4b', 'pid()')]
563f8b112dSStefan Hajnoczi        for type_, name in e.args:
573f8b112dSStefan Hajnoczi            name = stap_escape(name)
583f8b112dSStefan Hajnoczi            if is_string(type_):
593f8b112dSStefan Hajnoczi                fields.extend([('4b', 'arg%s_len' % name),
603f8b112dSStefan Hajnoczi                               ('.*s', 'arg%s_len, arg%s_str' % (name, name))])
613f8b112dSStefan Hajnoczi            else:
623f8b112dSStefan Hajnoczi                fields.append(('8b', name))
633f8b112dSStefan Hajnoczi
643f8b112dSStefan Hajnoczi        # Emit the entire record in a single SystemTap printf()
653f8b112dSStefan Hajnoczi        fmt_str = '%'.join(fmt for fmt, _ in fields)
663f8b112dSStefan Hajnoczi        arg_str = ', '.join(arg for _, arg in fields)
677f1b588fSDaniel P. Berrange        out('    printf("%%8b%%%(fmt_str)s", 1, %(arg_str)s)',
683f8b112dSStefan Hajnoczi            fmt_str=fmt_str, arg_str=arg_str)
693f8b112dSStefan Hajnoczi
703f8b112dSStefan Hajnoczi        out('}')
713f8b112dSStefan Hajnoczi
723f8b112dSStefan Hajnoczi    out()
73