2012-04-03 20:47:39 +02:00
|
|
|
#!/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, 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> --backend=<backend> [<options>]
|
|
|
|
|
|
|
|
Backends:
|
|
|
|
%(backends)s
|
|
|
|
|
|
|
|
Formats:
|
|
|
|
%(formats)s
|
|
|
|
|
|
|
|
Options:
|
|
|
|
--help This help message.
|
|
|
|
--list-backends Print list of available backends.
|
|
|
|
--check-backend Check if the given backend is valid.
|
2012-04-03 20:48:12 +02:00
|
|
|
--binary <path> Full path to QEMU binary.
|
|
|
|
--target-type <type> QEMU emulator target type ('system' or 'user').
|
|
|
|
--target-arch <arch> QEMU emulator target arch.
|
|
|
|
--probe-prefix <prefix> Prefix for dtrace probe names
|
|
|
|
(default: qemu-<target-type>-<target-arch>).\
|
2012-04-03 20:47:39 +02:00
|
|
|
""" % {
|
|
|
|
"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 = [ "backend=", "format=", "help", "list-backends", "check-backend" ]
|
|
|
|
long_opts += [ "binary=", "target-type=", "target-arch=", "probe-prefix=" ]
|
|
|
|
|
|
|
|
try:
|
|
|
|
opts, args = getopt.getopt(args[1:], "", long_opts)
|
2012-04-25 11:39:42 +02:00
|
|
|
except getopt.GetoptError, err:
|
2012-04-03 20:47:39 +02:00
|
|
|
error_opt(str(err))
|
|
|
|
|
|
|
|
check_backend = False
|
|
|
|
arg_backend = ""
|
|
|
|
arg_format = ""
|
2012-04-03 20:48:12 +02:00
|
|
|
binary = None
|
|
|
|
target_type = None
|
|
|
|
target_arch = None
|
|
|
|
probe_prefix = None
|
2012-04-03 20:47:39 +02:00
|
|
|
for opt, arg in opts:
|
|
|
|
if opt == "--help":
|
|
|
|
error_opt()
|
|
|
|
|
|
|
|
elif opt == "--backend":
|
|
|
|
arg_backend = arg
|
|
|
|
elif opt == "--format":
|
|
|
|
arg_format = arg
|
|
|
|
|
|
|
|
elif opt == "--list-backends":
|
2013-03-05 14:47:26 +01:00
|
|
|
public_backends = tracetool.backend.get_list(only_public = True)
|
|
|
|
out(", ".join([ b for b,_ in public_backends ]))
|
2012-04-03 20:47:39 +02:00
|
|
|
sys.exit(0)
|
|
|
|
elif opt == "--check-backend":
|
|
|
|
check_backend = True
|
|
|
|
|
2012-04-03 20:48:12 +02:00
|
|
|
elif opt == "--binary":
|
|
|
|
binary = arg
|
|
|
|
elif opt == '--target-type':
|
|
|
|
target_type = arg
|
|
|
|
elif opt == '--target-arch':
|
|
|
|
target_arch = arg
|
|
|
|
elif opt == '--probe-prefix':
|
|
|
|
probe_prefix = arg
|
|
|
|
|
2012-04-03 20:47:39 +02:00
|
|
|
else:
|
|
|
|
error_opt("unhandled option: %s" % opt)
|
|
|
|
|
|
|
|
if arg_backend is None:
|
|
|
|
error_opt("backend not set")
|
|
|
|
|
|
|
|
if check_backend:
|
|
|
|
if tracetool.backend.exists(arg_backend):
|
|
|
|
sys.exit(0)
|
|
|
|
else:
|
|
|
|
sys.exit(1)
|
|
|
|
|
2012-04-03 20:48:12 +02:00
|
|
|
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_arch is None:
|
|
|
|
error_opt("--target-arch is required for SystemTAP tapset generator")
|
|
|
|
|
|
|
|
if probe_prefix is None:
|
|
|
|
probe_prefix = ".".join([ "qemu", target_type, target_arch ])
|
|
|
|
|
2012-04-03 20:47:39 +02:00
|
|
|
try:
|
2012-04-03 20:48:12 +02:00
|
|
|
tracetool.generate(sys.stdin, arg_format, arg_backend,
|
|
|
|
binary = binary, probe_prefix = probe_prefix)
|
2012-04-25 11:39:42 +02:00
|
|
|
except tracetool.TracetoolError, e:
|
2012-04-03 20:47:39 +02:00
|
|
|
error_opt(str(e))
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
main(sys.argv)
|