From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:43380) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SDg5L-00008B-2p for qemu-devel@nongnu.org; Fri, 30 Mar 2012 13:58:07 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1SDg5I-0001Hb-Lb for qemu-devel@nongnu.org; Fri, 30 Mar 2012 13:58:02 -0400 Received: from roura.ac.upc.es ([147.83.33.10]:46153) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SDg5I-0001HT-9x for qemu-devel@nongnu.org; Fri, 30 Mar 2012 13:58:00 -0400 From: =?utf-8?b?TGx1w61z?= Vilanova Date: Fri, 30 Mar 2012 19:58:02 +0200 Message-Id: <20120330175801.22501.98833.stgit@ginnungagap.bsc.es> In-Reply-To: <20120330175721.22501.39566.stgit@ginnungagap.bsc.es> References: <20120330175721.22501.39566.stgit@ginnungagap.bsc.es> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [RFC PATCH v4 7/8] tracetool: Add support for the 'dtrace' backend List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: stefanha@gmail.com Signed-off-by: Llu=C3=ADs Vilanova --- scripts/tracetool.py | 32 ++++++++++- scripts/tracetool/__init__.py | 11 +++- scripts/tracetool/backend/dtrace.py | 104 +++++++++++++++++++++++++++++= ++++++ scripts/tracetool/format/d.py | 20 +++++++ scripts/tracetool/format/stap.py | 20 +++++++ 5 files changed, 185 insertions(+), 2 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 fe2ea34..cacfd99 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 Full path to QEMU binary. + --target-type QEMU emulator target type ('system' or 'use= r'). + --target-arch QEMU emulator target arch. + --probe-prefix Prefix for dtrace probe names + (default: qemu--)= .\ """ % { "script" : _SCRIPT, "backends" : backend_descr, @@ -71,6 +76,10 @@ def main(args): check_backend =3D False arg_backend =3D "" arg_format =3D "" + binary =3D None + target_type =3D None + target_arch =3D None + probe_prefix =3D None for opt, arg in opts: if opt =3D=3D "--help": error_opt() @@ -87,6 +96,15 @@ def main(args): elif opt =3D=3D "--check-backend": check_backend =3D True =20 + elif opt =3D=3D "--binary": + binary =3D arg + elif opt =3D=3D '--target-type': + target_type =3D arg + elif opt =3D=3D '--target-arch': + target_arch =3D arg + elif opt =3D=3D '--probe-prefix': + probe_prefix =3D arg + else: error_opt("unhandled option: %s" % opt) =20 @@ -99,8 +117,20 @@ def main(args): else: sys.exit(1) =20 + if arg_format =3D=3D "stap": + if binary is None: + error_opt("--binary is required for SystemTAP tapset generat= or") + if probe_prefix is None and target_type is None: + error_opt("--target-type is required for SystemTAP tapset ge= nerator") + if probe_prefix is None and target_arch is None: + error_opt("--target-arch is required for SystemTAP tapset ge= nerator") + + if probe_prefix is None: + probe_prefix =3D ".".join([ "qemu", target_type, target_arch= ]) + try: - tracetool.generate(sys.stdin, arg_format, arg_backend) + tracetool.generate(sys.stdin, arg_format, arg_backend, + binary =3D binary, probe_prefix =3D probe_pre= fix) except tracetool.TracetoolError as e: error_opt(str(e)) =20 diff --git a/scripts/tracetool/__init__.py b/scripts/tracetool/__init__.p= y index 200cb6f..5471b1a 100644 --- a/scripts/tracetool/__init__.py +++ b/scripts/tracetool/__init__.py @@ -172,7 +172,8 @@ def try_import(mod_name, attr_name =3D None, attr_def= ault =3D None): return False, None =20 =20 -def generate(fevents, format, backend): +def generate(fevents, format, backend, + binary =3D None, probe_prefix =3D None): """Generate the output for the given (format, backend) pair. =20 Parameters @@ -183,6 +184,10 @@ def generate(fevents, format, backend): Output format name. backend : str Output backend name. + binary : str or None + See tracetool.backend.dtrace.BINARY. + probe_prefix : str or None + See tracetool.backend.dtrace.PROBEPREFIX. """ # fix strange python error (UnboundLocalError tracetool) import tracetool @@ -205,6 +210,10 @@ def generate(fevents, format, backend): raise TracetoolError("backend '%s' not compatible with format '%= s'" % (backend, format)) =20 + import tracetool.backend.dtrace + tracetool.backend.dtrace.BINARY =3D binary + tracetool.backend.dtrace.PROBEPREFIX =3D probe_prefix + events =3D _read_events(fevents) =20 if backend =3D=3D "nop": diff --git a/scripts/tracetool/backend/dtrace.py b/scripts/tracetool/back= end/dtrace.py new file mode 100644 index 0000000..817d656 --- /dev/null +++ b/scripts/tracetool/backend/dtrace.py @@ -0,0 +1,104 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +DTrace/SystemTAP backend. +""" + +__author__ =3D "Llu=C3=ADs Vilanova " +__copyright__ =3D "Copyright 2012, Llu=C3=ADs Vilanova " +__license__ =3D "GPL version 2 or (at your option) any later version" + +__maintainer__ =3D "Stefan Hajnoczi" +__email__ =3D "stefanha@linux.vnet.ibm.com" + + +from tracetool import out + + +PUBLIC =3D True + + +PROBEPREFIX =3D None + +def _probeprefix(): + if PROBEPREFIX is None: + raise ValueError("you must set PROBEPREFIX") + return PROBEPREFIX + + +BINARY =3D 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 =3D str(e.args) + + # DTrace provider syntax expects foo() for empty + # params, not foo(void) + if args =3D=3D 'void': + args =3D '' + + # 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 =3D process("%(binary)s").ma= rk("%(name)s")' % + { + 'probeprefix': _probeprefix(), + 'name': e.name, + 'binary': _binary(), + }, + '{') + + i =3D 1 + if len(e.args) > 0: + for name in e.args.names(): + # 'limit' is a reserved keyword + if name =3D=3D 'limit': + name =3D '_limit' + out(' %s =3D $arg%d;' % (name.lstrip(), i)) + i +=3D 1 + + out('}') + + out() diff --git a/scripts/tracetool/format/d.py b/scripts/tracetool/format/d.p= y 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__ =3D "Llu=C3=ADs Vilanova " +__copyright__ =3D "Copyright 2012, Llu=C3=ADs Vilanova " +__license__ =3D "GPL version 2 or (at your option) any later version" + +__maintainer__ =3D "Stefan Hajnoczi" +__email__ =3D "stefanha@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__ =3D "Llu=C3=ADs Vilanova " +__copyright__ =3D "Copyright 2012, Llu=C3=ADs Vilanova " +__license__ =3D "GPL version 2 or (at your option) any later version" + +__maintainer__ =3D "Stefan Hajnoczi" +__email__ =3D "stefanha@linux.vnet.ibm.com" + + +from tracetool import out + + +def begin(events): + out('/* This file is autogenerated by tracetool, do not edit. */')