cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

tracetool.py (4596B)


      1#!/usr/bin/env python3
      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@redhat.com"
     14
     15
     16import sys
     17import getopt
     18
     19from tracetool import error_write, out, out_open
     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>] <trace-events> ... <output>
     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) < 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
    153if __name__ == "__main__":
    154    main(sys.argv)