From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:53680) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SEm90-0006m1-Nb for qemu-devel@nongnu.org; Mon, 02 Apr 2012 14:38:24 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1SEm8v-0007Te-BB for qemu-devel@nongnu.org; Mon, 02 Apr 2012 14:38:22 -0400 Received: from roura.ac.upc.es ([147.83.33.10]:59233) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SEm8u-0007TD-Vj for qemu-devel@nongnu.org; Mon, 02 Apr 2012 14:38:17 -0400 From: =?utf-8?b?TGx1w61z?= Vilanova Date: Mon, 2 Apr 2012 20:38:22 +0200 Message-Id: <20120402183822.27095.62476.stgit@ginnungagap.bsc.es> In-Reply-To: <20120402183742.27095.83752.stgit@ginnungagap.bsc.es> References: <20120402183742.27095.83752.stgit@ginnungagap.bsc.es> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PATCH v6 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 | 97 +++++++++++++++++++++++++++++= ++++++ scripts/tracetool/format/d.py | 20 +++++++ scripts/tracetool/format/stap.py | 20 +++++++ 5 files changed, 178 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 dabdfa5..4ae3305 100644 --- a/scripts/tracetool/__init__.py +++ b/scripts/tracetool/__init__.py @@ -213,7 +213,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 @@ -224,6 +225,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 @@ -246,6 +251,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..cebbd57 --- /dev/null +++ b/scripts/tracetool/backend/dtrace.py @@ -0,0 +1,97 @@ +#!/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 + + +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 =3D e.name, + args =3D e.args, + uppername =3D e.name.upper(), + argnames =3D ", ".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 =3D e.name, + args =3D 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 =3D _probeprefix(), + name =3D e.name, + binary =3D _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. */')