| 
									
										
										
										
											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>" | 
					
						
							| 
									
										
										
										
											2014-05-27 15:02:14 +02:00
										 |  |  | __copyright__  = "Copyright 2012-2014, Lluís Vilanova <vilanova@ac.upc.edu>" | 
					
						
							| 
									
										
										
										
											2012-04-03 20:47:39 +02:00
										 |  |  | __license__    = "GPL version 2 or (at your option) any later version" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | __maintainer__ = "Stefan Hajnoczi" | 
					
						
							|  |  |  | __email__      = "stefanha@linux.vnet.ibm.com" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import sys | 
					
						
							|  |  |  | import getopt | 
					
						
							| 
									
										
										
										
											2016-10-04 14:35:59 +01:00
										 |  |  | import os.path | 
					
						
							|  |  |  | import re | 
					
						
							| 
									
										
										
										
											2012-04-03 20:47:39 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 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("""\
 | 
					
						
							| 
									
										
										
										
											2014-05-27 15:02:14 +02:00
										 |  |  | Usage: %(script)s --format=<format> --backends=<backends> [<options>] | 
					
						
							| 
									
										
										
										
											2012-04-03 20:47:39 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | Backends: | 
					
						
							|  |  |  | %(backends)s | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Formats: | 
					
						
							|  |  |  | %(formats)s | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Options: | 
					
						
							|  |  |  |     --help                   This help message. | 
					
						
							|  |  |  |     --list-backends          Print list of available backends. | 
					
						
							| 
									
										
										
										
											2014-05-27 15:02:14 +02:00
										 |  |  |     --check-backends         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'). | 
					
						
							| 
									
										
										
										
											2013-06-04 14:45:26 +02:00
										 |  |  |     --target-name <name>     QEMU emulator target name. | 
					
						
							| 
									
										
										
										
											2017-01-25 16:14:14 +00:00
										 |  |  |     --group <name>           Name of the event group | 
					
						
							| 
									
										
										
										
											2012-04-03 20:48:12 +02:00
										 |  |  |     --probe-prefix <prefix>  Prefix for dtrace probe names | 
					
						
							| 
									
										
										
										
											2013-06-04 14:45:26 +02:00
										 |  |  |                              (default: qemu-<target-type>-<target-name>).\ | 
					
						
							| 
									
										
										
										
											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] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-27 15:02:14 +02:00
										 |  |  |     long_opts = ["backends=", "format=", "help", "list-backends", | 
					
						
							| 
									
										
										
										
											2017-01-25 16:14:14 +00:00
										 |  |  |                  "check-backends", "group="] | 
					
						
							| 
									
										
										
										
											2014-05-27 15:02:14 +02:00
										 |  |  |     long_opts += ["binary=", "target-type=", "target-name=", "probe-prefix="] | 
					
						
							| 
									
										
										
										
											2012-04-03 20:47:39 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         opts, args = getopt.getopt(args[1:], "", long_opts) | 
					
						
							| 
									
										
										
										
											2015-12-18 08:52:43 +01:00
										 |  |  |     except getopt.GetoptError as err: | 
					
						
							| 
									
										
										
										
											2012-04-03 20:47:39 +02:00
										 |  |  |         error_opt(str(err)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-27 15:02:14 +02:00
										 |  |  |     check_backends = False | 
					
						
							|  |  |  |     arg_backends = [] | 
					
						
							| 
									
										
										
										
											2012-04-03 20:47:39 +02:00
										 |  |  |     arg_format = "" | 
					
						
							| 
									
										
										
										
											2017-01-25 16:14:14 +00:00
										 |  |  |     arg_group = None | 
					
						
							| 
									
										
										
										
											2012-04-03 20:48:12 +02:00
										 |  |  |     binary = None | 
					
						
							|  |  |  |     target_type = None | 
					
						
							| 
									
										
										
										
											2013-06-04 14:45:26 +02:00
										 |  |  |     target_name = None | 
					
						
							| 
									
										
										
										
											2012-04-03 20:48:12 +02:00
										 |  |  |     probe_prefix = None | 
					
						
							| 
									
										
										
										
											2012-04-03 20:47:39 +02:00
										 |  |  |     for opt, arg in opts: | 
					
						
							|  |  |  |         if opt == "--help": | 
					
						
							|  |  |  |             error_opt() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-27 15:02:14 +02:00
										 |  |  |         elif opt == "--backends": | 
					
						
							|  |  |  |             arg_backends = arg.split(",") | 
					
						
							| 
									
										
										
										
											2017-01-25 16:14:14 +00:00
										 |  |  |         elif opt == "--group": | 
					
						
							|  |  |  |             arg_group = arg | 
					
						
							| 
									
										
										
										
											2012-04-03 20:47:39 +02:00
										 |  |  |         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) | 
					
						
							| 
									
										
										
										
											2014-05-27 15:02:14 +02:00
										 |  |  |         elif opt == "--check-backends": | 
					
						
							|  |  |  |             check_backends = True | 
					
						
							| 
									
										
										
										
											2012-04-03 20:47:39 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-03 20:48:12 +02:00
										 |  |  |         elif opt == "--binary": | 
					
						
							|  |  |  |             binary = arg | 
					
						
							|  |  |  |         elif opt == '--target-type': | 
					
						
							|  |  |  |             target_type = arg | 
					
						
							| 
									
										
										
										
											2013-06-04 14:45:26 +02:00
										 |  |  |         elif opt == '--target-name': | 
					
						
							|  |  |  |             target_name = arg | 
					
						
							| 
									
										
										
										
											2012-04-03 20:48:12 +02:00
										 |  |  |         elif opt == '--probe-prefix': | 
					
						
							|  |  |  |             probe_prefix = arg | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-03 20:47:39 +02:00
										 |  |  |         else: | 
					
						
							|  |  |  |             error_opt("unhandled option: %s" % opt) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-27 15:02:14 +02:00
										 |  |  |     if len(arg_backends) == 0: | 
					
						
							|  |  |  |         error_opt("no backends specified") | 
					
						
							| 
									
										
										
										
											2012-04-03 20:47:39 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-27 15:02:14 +02:00
										 |  |  |     if check_backends: | 
					
						
							|  |  |  |         for backend in arg_backends: | 
					
						
							|  |  |  |             if not tracetool.backend.exists(backend): | 
					
						
							|  |  |  |                 sys.exit(1) | 
					
						
							|  |  |  |         sys.exit(0) | 
					
						
							| 
									
										
										
										
											2012-04-03 20:47:39 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-25 16:14:14 +00:00
										 |  |  |     if arg_group is None: | 
					
						
							|  |  |  |         error_opt("group name is required") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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") | 
					
						
							| 
									
										
										
										
											2013-06-04 14:45:26 +02:00
										 |  |  |         if probe_prefix is None and target_name is None: | 
					
						
							|  |  |  |             error_opt("--target-name is required for SystemTAP tapset generator") | 
					
						
							| 
									
										
										
										
											2012-04-03 20:48:12 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if probe_prefix is None: | 
					
						
							| 
									
										
										
										
											2014-05-27 15:02:14 +02:00
										 |  |  |             probe_prefix = ".".join(["qemu", target_type, target_name]) | 
					
						
							| 
									
										
										
										
											2012-04-03 20:48:12 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-25 16:14:15 +00:00
										 |  |  |     if len(args) < 1: | 
					
						
							| 
									
										
										
										
											2016-10-04 14:35:58 +01:00
										 |  |  |         error_opt("missing trace-events filepath") | 
					
						
							| 
									
										
										
										
											2017-01-25 16:14:15 +00:00
										 |  |  |     events = [] | 
					
						
							|  |  |  |     for arg in args: | 
					
						
							|  |  |  |         with open(arg, "r") as fh: | 
					
						
							| 
									
										
										
										
											2018-03-06 15:46:50 +00:00
										 |  |  |             events.extend(tracetool.read_events(fh, arg)) | 
					
						
							| 
									
										
										
										
											2016-10-04 14:35:57 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-03 20:47:39 +02:00
										 |  |  |     try: | 
					
						
							| 
									
										
										
										
											2017-01-25 16:14:14 +00:00
										 |  |  |         tracetool.generate(events, arg_group, arg_format, arg_backends, | 
					
						
							| 
									
										
										
										
											2014-05-27 15:02:14 +02:00
										 |  |  |                            binary=binary, probe_prefix=probe_prefix) | 
					
						
							| 
									
										
										
										
											2015-12-18 08:52:43 +01:00
										 |  |  |     except tracetool.TracetoolError as e: | 
					
						
							| 
									
										
										
										
											2012-04-03 20:47:39 +02:00
										 |  |  |         error_opt(str(e)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == "__main__": | 
					
						
							|  |  |  |     main(sys.argv) |