diff options
Diffstat (limited to 'scripts/tracetool/backend/dtrace.py')
-rw-r--r-- | scripts/tracetool/backend/dtrace.py | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/scripts/tracetool/backend/dtrace.py b/scripts/tracetool/backend/dtrace.py new file mode 100644 index 000000000..e17edc9b9 --- /dev/null +++ b/scripts/tracetool/backend/dtrace.py @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- + +""" +DTrace/SystemTAP backend. +""" + +__author__ = "Lluís Vilanova <vilanova@ac.upc.edu>" +__copyright__ = "Copyright 2012-2017, Lluís Vilanova <vilanova@ac.upc.edu>" +__license__ = "GPL version 2 or (at your option) any later version" + +__maintainer__ = "Stefan Hajnoczi" +__email__ = "stefanha@redhat.com" + + +from tracetool import out + + +PUBLIC = True + + +PROBEPREFIX = None + +def probeprefix(): + if PROBEPREFIX is None: + raise ValueError("you must set PROBEPREFIX") + return PROBEPREFIX + + +BINARY = None + +def binary(): + if BINARY is None: + raise ValueError("you must set BINARY") + return BINARY + + +def generate_h_begin(events, group): + if group == "root": + header = "trace-dtrace-root.h" + else: + header = "trace-dtrace-%s.h" % group + + # Workaround for ust backend, which also includes <sys/sdt.h> and may + # require SDT_USE_VARIADIC to be defined. If dtrace includes <sys/sdt.h> + # first without defining SDT_USE_VARIADIC then ust breaks because the + # STAP_PROBEV() macro is not defined. + out('#ifndef SDT_USE_VARIADIC') + out('#define SDT_USE_VARIADIC 1') + out('#endif') + + out('#include "%s"' % header, + '') + + out('#undef SDT_USE_VARIADIC') + + # SystemTap defines <provider>_<name>_ENABLED() but other DTrace + # implementations might not. + for e in events: + out('#ifndef QEMU_%(uppername)s_ENABLED', + '#define QEMU_%(uppername)s_ENABLED() true', + '#endif', + uppername=e.name.upper()) + +def generate_h(event, group): + out(' QEMU_%(uppername)s(%(argnames)s);', + uppername=event.name.upper(), + argnames=", ".join(event.args.names())) + + +def generate_h_backend_dstate(event, group): + out(' QEMU_%(uppername)s_ENABLED() || \\', + uppername=event.name.upper()) |