qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

tracetool.py (4596B)


      1 #!/usr/bin/env python3
      2 # -*- coding: utf-8 -*-
      3 
      4 """
      5 Command-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@redhat.com"
     14 
     15 
     16 import sys
     17 import getopt
     18 
     19 from tracetool import error_write, out, out_open
     20 import tracetool.backend
     21 import tracetool.format
     22 
     23 
     24 _SCRIPT = ""
     25 
     26 def 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("""\
     35 Usage: %(script)s --format=<format> --backends=<backends> [<options>] <trace-events> ... <output>
     36 
     37 Backends:
     38 %(backends)s
     39 
     40 Formats:
     41 %(formats)s
     42 
     43 Options:
     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 
     64 def 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) < 2:
    139         error_opt("missing trace-events and output filepaths")
    140     events = []
    141     for arg in args[:-1]:
    142         with open(arg, "r") as fh:
    143             events.extend(tracetool.read_events(fh, arg))
    144 
    145     out_open(args[-1])
    146 
    147     try:
    148         tracetool.generate(events, arg_group, arg_format, arg_backends,
    149                            binary=binary, probe_prefix=probe_prefix)
    150     except tracetool.TracetoolError as e:
    151         error_opt(str(e))
    152 
    153 if __name__ == "__main__":
    154     main(sys.argv)