qemu/scripts/tracetool.py
<<
>>
Prefs
   1#!/usr/bin/env python
   2# -*- coding: utf-8 -*-
   3
   4"""
   5Command-line wrapper for the tracetool machinery.
   6"""
   7
   8__author__     = "Lluís Vilanova <vilanova@ac.upc.edu>"
   9__copyright__  = "Copyright 2012-2014, Lluís Vilanova <vilanova@ac.upc.edu>"
  10__license__    = "GPL version 2 or (at your option) any later version"
  11
  12__maintainer__ = "Stefan Hajnoczi"
  13__email__      = "stefanha@linux.vnet.ibm.com"
  14
  15
  16import sys
  17import getopt
  18
  19from tracetool import error_write, out
  20import tracetool.backend
  21import tracetool.format
  22
  23
  24_SCRIPT = ""
  25
  26def error_opt(msg = None):
  27    if msg is not None:
  28        error_write("Error: " + msg + "\n")
  29
  30    backend_descr = "\n".join([ "    %-15s %s" % (n, d)
  31                                for n,d in tracetool.backend.get_list() ])
  32    format_descr = "\n".join([ "    %-15s %s" % (n, d)
  33                               for n,d in tracetool.format.get_list() ])
  34    error_write("""\
  35Usage: %(script)s --format=<format> --backends=<backends> [<options>]
  36
  37Backends:
  38%(backends)s
  39
  40Formats:
  41%(formats)s
  42
  43Options:
  44    --help                   This help message.
  45    --list-backends          Print list of available backends.
  46    --check-backends         Check if the given backend is valid.
  47    --binary <path>          Full path to QEMU binary.
  48    --target-type <type>     QEMU emulator target type ('system' or 'user').
  49    --target-name <name>     QEMU emulator target name.
  50    --group <name>           Name of the event group
  51    --probe-prefix <prefix>  Prefix for dtrace probe names
  52                             (default: qemu-<target-type>-<target-name>).\
  53""" % {
  54            "script" : _SCRIPT,
  55            "backends" : backend_descr,
  56            "formats" : format_descr,
  57            })
  58
  59    if msg is None:
  60        sys.exit(0)
  61    else:
  62        sys.exit(1)
  63
  64def main(args):
  65    global _SCRIPT
  66    _SCRIPT = args[0]
  67
  68    long_opts = ["backends=", "format=", "help", "list-backends",
  69                 "check-backends", "group="]
  70    long_opts += ["binary=", "target-type=", "target-name=", "probe-prefix="]
  71
  72    try:
  73        opts, args = getopt.getopt(args[1:], "", long_opts)
  74    except getopt.GetoptError as err:
  75        error_opt(str(err))
  76
  77    check_backends = False
  78    arg_backends = []
  79    arg_format = ""
  80    arg_group = None
  81    binary = None
  82    target_type = None
  83    target_name = None
  84    probe_prefix = None
  85    for opt, arg in opts:
  86        if opt == "--help":
  87            error_opt()
  88
  89        elif opt == "--backends":
  90            arg_backends = arg.split(",")
  91        elif opt == "--group":
  92            arg_group = arg
  93        elif opt == "--format":
  94            arg_format = arg
  95
  96        elif opt == "--list-backends":
  97            public_backends = tracetool.backend.get_list(only_public = True)
  98            out(", ".join([ b for b,_ in public_backends ]))
  99            sys.exit(0)
 100        elif opt == "--check-backends":
 101            check_backends = True
 102
 103        elif opt == "--binary":
 104            binary = arg
 105        elif opt == '--target-type':
 106            target_type = arg
 107        elif opt == '--target-name':
 108            target_name = arg
 109        elif opt == '--probe-prefix':
 110            probe_prefix = arg
 111
 112        else:
 113            error_opt("unhandled option: %s" % opt)
 114
 115    if len(arg_backends) == 0:
 116        error_opt("no backends specified")
 117
 118    if check_backends:
 119        for backend in arg_backends:
 120            if not tracetool.backend.exists(backend):
 121                sys.exit(1)
 122        sys.exit(0)
 123
 124    if arg_group is None:
 125        error_opt("group name is required")
 126
 127    if arg_format == "stap":
 128        if binary is None:
 129            error_opt("--binary is required for SystemTAP tapset generator")
 130        if probe_prefix is None and target_type is None:
 131            error_opt("--target-type is required for SystemTAP tapset generator")
 132        if probe_prefix is None and target_name is None:
 133            error_opt("--target-name is required for SystemTAP tapset generator")
 134
 135        if probe_prefix is None:
 136            probe_prefix = ".".join(["qemu", target_type, target_name])
 137
 138    if len(args) < 1:
 139        error_opt("missing trace-events filepath")
 140    events = []
 141    for arg in args:
 142        with open(arg, "r") as fh:
 143            events.extend(tracetool.read_events(fh, arg))
 144
 145    try:
 146        tracetool.generate(events, arg_group, arg_format, arg_backends,
 147                           binary=binary, probe_prefix=probe_prefix)
 148    except tracetool.TracetoolError as e:
 149        error_opt(str(e))
 150
 151if __name__ == "__main__":
 152    main(sys.argv)
 153