On Mon, Mar 26, 2012 at 07:38:23PM +0200, Lluís Vilanova wrote: > Signed-off-by: Lluís Vilanova <vilan...@ac.upc.edu> > --- > scripts/tracetool.py | 31 ++++++++++ > scripts/tracetool/__init__.py | 8 +++ > scripts/tracetool/backend/dtrace.py | 104 > +++++++++++++++++++++++++++++++++++ > scripts/tracetool/format/d.py | 20 +++++++ > scripts/tracetool/format/stap.py | 20 +++++++ > 5 files changed, 183 insertions(+), 0 deletions(-) > create mode 100644 scripts/tracetool/backend/dtrace.py > create mode 100644 scripts/tracetool/format/d.py > create mode 100644 scripts/tracetool/format/stap.py > > diff --git a/scripts/tracetool.py b/scripts/tracetool.py > index 22623ae..2dd9da0 100755 > --- a/scripts/tracetool.py > +++ b/scripts/tracetool.py > @@ -44,6 +44,11 @@ Options: > --help This help message. > --list-backends Print list of available backends. > --check-backend Check if the given backend is valid. > + --binary <path> Full path to QEMU binary. > + --target-type <type> QEMU emulator target type ('system' or 'user'). > + --target-arch <arch> QEMU emulator target arch. > + --probe-prefix <prefix> Prefix for dtrace probe names > + (default: qemu-<target-type>-<target-arch>).\ > """ % { > "script" : _SCRIPT, > "backends" : backend_descr, > @@ -71,6 +76,10 @@ def main(args): > check_backend = False > arg_backend = "" > arg_format = "" > + binary = None > + target_type = None > + target_arch = None > + probe_prefix = None > for opt, arg in opts: > if opt == "--help": > error_opt() > @@ -87,6 +96,15 @@ def main(args): > elif opt == "--check-backend": > check_backend = True > > + elif opt == "--binary": > + binary = arg > + elif opt == '--target-type': > + target_type = arg > + elif opt == '--target-arch': > + target_arch = arg > + elif opt == '--probe-prefix': > + probe_prefix = arg > + > else: > error_opt("unhandled option: %s" % opt) > > @@ -101,6 +119,19 @@ def main(args): > > kwargs = {} > > + if format == "stap": > + if binary is None: > + error_opt("--binary is required for SystemTAP tapset generator") > + if probe_prefix is None and target_type is None: > + error_opt("--target-type is required for SystemTAP tapset > generator") > + if probe_prefix is None and target_arch is None: > + error_opt("--target-arch is required for SystemTAP tapset > generator") > + > + if probe_prefix is None: > + probe_prefix = ".".join([ "qemu", target_type, target_arch ]) > + kwargs["binary"] = binary > + kwargs["probe_prefix"] = probe_prefix > + > try: > tracetool.generate(sys.stdin, arg_format, arg_backend, **kwargs) > except tracetool.TracetoolError as e: > diff --git a/scripts/tracetool/__init__.py b/scripts/tracetool/__init__.py > index d8e5cdd..d21f88a 100644 > --- a/scripts/tracetool/__init__.py > +++ b/scripts/tracetool/__init__.py > @@ -167,6 +167,9 @@ def generate(fevents, format, backend, **options): > # fix strange python error (UnboundLocalError tracetool) > import tracetool > > + binary = options.pop("binary", None) > + probe_prefix = options.pop("probe_prefix", None) > + > if len(options) > 0: > raise ValueError("unknown options: " + ", ".join(options)) > > @@ -188,6 +191,11 @@ def generate(fevents, format, backend, **options): > raise TracetoolError("backend '%s' not compatible with format '%s'" % > (backend, format)) > > + if backend == "dtrace": > + import tracetool.backend.dtrace > + tracetool.backend.dtrace.BINARY = binary > + tracetool.backend.dtrace.PROBEPREFIX = probe_prefix > + > events = _read_events(fevents) > > if backend == "nop": > diff --git a/scripts/tracetool/backend/dtrace.py > b/scripts/tracetool/backend/dtrace.py > new file mode 100644 > index 0000000..7c2051c > --- /dev/null > +++ b/scripts/tracetool/backend/dtrace.py > @@ -0,0 +1,104 @@ > +#!/usr/bin/env python > +# -*- coding: utf-8 -*- > + > +""" > +DTrace/SystemTAP backend. > +""" > + > +__author__ = "Lluís Vilanova <vilan...@ac.upc.edu>" > +__copyright__ = "Copyright 2012, Lluís Vilanova <vilan...@ac.upc.edu>" > +__license__ = "GPL version 2 or (at your option) any later version" > + > +__maintainer__ = "Stefan Hajnoczi" > +__email__ = "stefa...@linux.vnet.ibm.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 c(events): > + pass > + > + > +def h(events): > + out('#include "trace-dtrace.h"', > + '') > + > + for e in events: > + out('''static inline void trace_%(name)s(%(args)s) { > + QEMU_%(uppername)s(%(argnames)s); > +} > +''' % > + { > + 'name': e.name, > + 'args': e.args, > + 'uppername': e.name.upper(), > + 'argnames': ", ".join(e.args.names()), > + }) > + > + > +def d(events): > + out('provider qemu {') > + > + for e in events: > + args = e.args > + > + # DTrace provider syntax expects foo() for empty > + # params, not foo(void) > + if args == 'void':
This fails. since args is now an Arguments instace. Fixed by changing to: + if str(args) == 'void': > + args = '' > + > + # Define prototype for probe arguments > + out('', > + 'probe %(name)s(%(args)s);' % > + { > + 'name': e.name, > + 'args': args > + }) > + > + out('', > + '};') > + > + > +def stap(events): > + for e in events: > + # Define prototype for probe arguments > + out('probe %(probeprefix)s.%(name)s = > process("%(binary)s").mark("%(name)s")' % > + { > + 'probeprefix': _probeprefix(), > + 'name': e.name, > + 'binary': _binary(), > + }, > + '{') > + > + i = 1 > + if len(e.args) > 0: > + for name in e.args.names(): > + # 'limit' is a reserved keyword > + if name == 'limit': > + name = '_limit' > + out(' %s = $arg%d;' % (name.lstrip(), i)) > + i += 1 > + > + out('}') > + > + out() > diff --git a/scripts/tracetool/format/d.py b/scripts/tracetool/format/d.py > new file mode 100644 > index 0000000..a2d5947 > --- /dev/null > +++ b/scripts/tracetool/format/d.py > @@ -0,0 +1,20 @@ > +#!/usr/bin/env python > +# -*- coding: utf-8 -*- > + > +""" > +Generate .d file (DTrace only). > +""" > + > +__author__ = "Lluís Vilanova <vilan...@ac.upc.edu>" > +__copyright__ = "Copyright 2012, Lluís Vilanova <vilan...@ac.upc.edu>" > +__license__ = "GPL version 2 or (at your option) any later version" > + > +__maintainer__ = "Stefan Hajnoczi" > +__email__ = "stefa...@linux.vnet.ibm.com" > + > + > +from tracetool import out > + > + > +def begin(events): > + out('/* This file is autogenerated by tracetool, do not edit. */') > diff --git a/scripts/tracetool/format/stap.py > b/scripts/tracetool/format/stap.py > new file mode 100644 > index 0000000..50a4c69 > --- /dev/null > +++ b/scripts/tracetool/format/stap.py > @@ -0,0 +1,20 @@ > +#!/usr/bin/env python > +# -*- coding: utf-8 -*- > + > +""" > +Generate .stp file (DTrace with SystemTAP only). > +""" > + > +__author__ = "Lluís Vilanova <vilan...@ac.upc.edu>" > +__copyright__ = "Copyright 2012, Lluís Vilanova <vilan...@ac.upc.edu>" > +__license__ = "GPL version 2 or (at your option) any later version" > + > +__maintainer__ = "Stefan Hajnoczi" > +__email__ = "stefa...@linux.vnet.ibm.com" > + > + > +from tracetool import out > + > + > +def begin(events): > + out('/* This file is autogenerated by tracetool, do not edit. */') > >