152ef093aSLluís Vilanova# -*- coding: utf-8 -*-
252ef093aSLluís Vilanova
352ef093aSLluís Vilanova"""
452ef093aSLluís VilanovaDTrace/SystemTAP backend.
552ef093aSLluís Vilanova"""
652ef093aSLluís Vilanova
752ef093aSLluís Vilanova__author__     = "Lluís Vilanova <vilanova@ac.upc.edu>"
81ff7b531SLluís Vilanova__copyright__  = "Copyright 2012-2017, Lluís Vilanova <vilanova@ac.upc.edu>"
952ef093aSLluís Vilanova__license__    = "GPL version 2 or (at your option) any later version"
1052ef093aSLluís Vilanova
1152ef093aSLluís Vilanova__maintainer__ = "Stefan Hajnoczi"
12f892b494SPhilippe Mathieu-Daudé__email__      = "stefanha@redhat.com"
1352ef093aSLluís Vilanova
1452ef093aSLluís Vilanova
1552ef093aSLluís Vilanovafrom tracetool import out
1652ef093aSLluís Vilanova
1752ef093aSLluís Vilanova
1893fba161SLluís VilanovaPUBLIC = True
1993fba161SLluís Vilanova
2093fba161SLluís Vilanova
2152ef093aSLluís VilanovaPROBEPREFIX = None
2252ef093aSLluís Vilanova
231dad2ce9SLluís Vilanovadef probeprefix():
2452ef093aSLluís Vilanova    if PROBEPREFIX is None:
2552ef093aSLluís Vilanova        raise ValueError("you must set PROBEPREFIX")
2652ef093aSLluís Vilanova    return PROBEPREFIX
2752ef093aSLluís Vilanova
2852ef093aSLluís Vilanova
2952ef093aSLluís VilanovaBINARY = None
3052ef093aSLluís Vilanova
311dad2ce9SLluís Vilanovadef binary():
3252ef093aSLluís Vilanova    if BINARY is None:
3352ef093aSLluís Vilanova        raise ValueError("you must set BINARY")
3452ef093aSLluís Vilanova    return BINARY
3552ef093aSLluís Vilanova
3652ef093aSLluís Vilanova
3780dd5c49SDaniel P. Berrangedef generate_h_begin(events, group):
380ab8ed18SDaniel P. Berrange    if group == "root":
390ab8ed18SDaniel P. Berrange        header = "trace-dtrace-root.h"
400ab8ed18SDaniel P. Berrange    else:
41*a81df1b6SPaolo Bonzini        header = "trace-dtrace-%s.h" % group
420ab8ed18SDaniel P. Berrange
4327e08babSStefan Hajnoczi    # Workaround for ust backend, which also includes <sys/sdt.h> and may
4427e08babSStefan Hajnoczi    # require SDT_USE_VARIADIC to be defined. If dtrace includes <sys/sdt.h>
4527e08babSStefan Hajnoczi    # first without defining SDT_USE_VARIADIC then ust breaks because the
4627e08babSStefan Hajnoczi    # STAP_PROBEV() macro is not defined.
4700082244SStefan Hajnoczi    out('#ifndef SDT_USE_VARIADIC')
4827e08babSStefan Hajnoczi    out('#define SDT_USE_VARIADIC 1')
4900082244SStefan Hajnoczi    out('#endif')
5027e08babSStefan Hajnoczi
510ab8ed18SDaniel P. Berrange    out('#include "%s"' % header,
5252ef093aSLluís Vilanova        '')
5352ef093aSLluís Vilanova
5400082244SStefan Hajnoczi    out('#undef SDT_USE_VARIADIC')
5500082244SStefan Hajnoczi
563932ef3fSStefan Hajnoczi    # SystemTap defines <provider>_<name>_ENABLED() but other DTrace
573932ef3fSStefan Hajnoczi    # implementations might not.
583932ef3fSStefan Hajnoczi    for e in events:
593932ef3fSStefan Hajnoczi        out('#ifndef QEMU_%(uppername)s_ENABLED',
603932ef3fSStefan Hajnoczi            '#define QEMU_%(uppername)s_ENABLED() true',
613932ef3fSStefan Hajnoczi            '#endif',
623932ef3fSStefan Hajnoczi            uppername=e.name.upper())
6352ef093aSLluís Vilanova
6480dd5c49SDaniel P. Berrangedef generate_h(event, group):
651dad2ce9SLluís Vilanova    out('    QEMU_%(uppername)s(%(argnames)s);',
661dad2ce9SLluís Vilanova        uppername=event.name.upper(),
671dad2ce9SLluís Vilanova        argnames=", ".join(event.args.names()))
683932ef3fSStefan Hajnoczi
693932ef3fSStefan Hajnoczi
703932ef3fSStefan Hajnoczidef generate_h_backend_dstate(event, group):
713932ef3fSStefan Hajnoczi    out('    QEMU_%(uppername)s_ENABLED() || \\',
723932ef3fSStefan Hajnoczi        uppername=event.name.upper())
73