diff options
Diffstat (limited to 'qemu/scripts/tracetool.py')
-rwxr-xr-x | qemu/scripts/tracetool.py | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/qemu/scripts/tracetool.py b/qemu/scripts/tracetool.py new file mode 100755 index 000000000..83bde7bda --- /dev/null +++ b/qemu/scripts/tracetool.py @@ -0,0 +1,139 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +Command-line wrapper for the tracetool machinery. +""" + +__author__ = "Lluís Vilanova <vilanova@ac.upc.edu>" +__copyright__ = "Copyright 2012-2014, Lluís Vilanova <vilanova@ac.upc.edu>" +__license__ = "GPL version 2 or (at your option) any later version" + +__maintainer__ = "Stefan Hajnoczi" +__email__ = "stefanha@linux.vnet.ibm.com" + + +import sys +import getopt + +from tracetool import error_write, out +import tracetool.backend +import tracetool.format + + +_SCRIPT = "" + +def error_opt(msg = None): + if msg is not None: + error_write("Error: " + msg + "\n") + + backend_descr = "\n".join([ " %-15s %s" % (n, d) + for n,d in tracetool.backend.get_list() ]) + format_descr = "\n".join([ " %-15s %s" % (n, d) + for n,d in tracetool.format.get_list() ]) + error_write("""\ +Usage: %(script)s --format=<format> --backends=<backends> [<options>] + +Backends: +%(backends)s + +Formats: +%(formats)s + +Options: + --help This help message. + --list-backends Print list of available backends. + --check-backends 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-name <name> QEMU emulator target name. + --probe-prefix <prefix> Prefix for dtrace probe names + (default: qemu-<target-type>-<target-name>).\ +""" % { + "script" : _SCRIPT, + "backends" : backend_descr, + "formats" : format_descr, + }) + + if msg is None: + sys.exit(0) + else: + sys.exit(1) + + +def main(args): + global _SCRIPT + _SCRIPT = args[0] + + long_opts = ["backends=", "format=", "help", "list-backends", + "check-backends"] + long_opts += ["binary=", "target-type=", "target-name=", "probe-prefix="] + + try: + opts, args = getopt.getopt(args[1:], "", long_opts) + except getopt.GetoptError, err: + error_opt(str(err)) + + check_backends = False + arg_backends = [] + arg_format = "" + binary = None + target_type = None + target_name = None + probe_prefix = None + for opt, arg in opts: + if opt == "--help": + error_opt() + + elif opt == "--backends": + arg_backends = arg.split(",") + elif opt == "--format": + arg_format = arg + + elif opt == "--list-backends": + public_backends = tracetool.backend.get_list(only_public = True) + out(", ".join([ b for b,_ in public_backends ])) + sys.exit(0) + elif opt == "--check-backends": + check_backends = True + + elif opt == "--binary": + binary = arg + elif opt == '--target-type': + target_type = arg + elif opt == '--target-name': + target_name = arg + elif opt == '--probe-prefix': + probe_prefix = arg + + else: + error_opt("unhandled option: %s" % opt) + + if len(arg_backends) == 0: + error_opt("no backends specified") + + if check_backends: + for backend in arg_backends: + if not tracetool.backend.exists(backend): + sys.exit(1) + sys.exit(0) + + if arg_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_name is None: + error_opt("--target-name is required for SystemTAP tapset generator") + + if probe_prefix is None: + probe_prefix = ".".join(["qemu", target_type, target_name]) + + try: + tracetool.generate(sys.stdin, arg_format, arg_backends, + binary=binary, probe_prefix=probe_prefix) + except tracetool.TracetoolError, e: + error_opt(str(e)) + +if __name__ == "__main__": + main(sys.argv) |