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