main.py revision 13663
111923Sandreas.sandberg@arm.com# Copyright (c) 2016 ARM Limited 211923Sandreas.sandberg@arm.com# All rights reserved. 311923Sandreas.sandberg@arm.com# 411923Sandreas.sandberg@arm.com# The license below extends only to copyright in the software and shall 511923Sandreas.sandberg@arm.com# not be construed as granting a license to any other intellectual 611923Sandreas.sandberg@arm.com# property including but not limited to intellectual property relating 711923Sandreas.sandberg@arm.com# to a hardware implementation of the functionality of the software 811923Sandreas.sandberg@arm.com# licensed hereunder. You may use the software subject to the license 911923Sandreas.sandberg@arm.com# terms below provided that you ensure that this notice is replicated 1011923Sandreas.sandberg@arm.com# unmodified and in its entirety in all distributions of the software, 1111923Sandreas.sandberg@arm.com# modified or unmodified, in source code or in binary form. 1211923Sandreas.sandberg@arm.com# 132889Sbinkertn@umich.edu# Copyright (c) 2005 The Regents of The University of Michigan 142889Sbinkertn@umich.edu# All rights reserved. 152889Sbinkertn@umich.edu# 162889Sbinkertn@umich.edu# Redistribution and use in source and binary forms, with or without 172889Sbinkertn@umich.edu# modification, are permitted provided that the following conditions are 182889Sbinkertn@umich.edu# met: redistributions of source code must retain the above copyright 192889Sbinkertn@umich.edu# notice, this list of conditions and the following disclaimer; 202889Sbinkertn@umich.edu# redistributions in binary form must reproduce the above copyright 212889Sbinkertn@umich.edu# notice, this list of conditions and the following disclaimer in the 222889Sbinkertn@umich.edu# documentation and/or other materials provided with the distribution; 232889Sbinkertn@umich.edu# neither the name of the copyright holders nor the names of its 242889Sbinkertn@umich.edu# contributors may be used to endorse or promote products derived from 252889Sbinkertn@umich.edu# this software without specific prior written permission. 262889Sbinkertn@umich.edu# 272889Sbinkertn@umich.edu# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 282889Sbinkertn@umich.edu# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 292889Sbinkertn@umich.edu# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 302889Sbinkertn@umich.edu# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 312889Sbinkertn@umich.edu# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 322889Sbinkertn@umich.edu# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 332889Sbinkertn@umich.edu# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 342889Sbinkertn@umich.edu# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 352889Sbinkertn@umich.edu# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 362889Sbinkertn@umich.edu# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 372889Sbinkertn@umich.edu# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 382889Sbinkertn@umich.edu# 392889Sbinkertn@umich.edu# Authors: Nathan Binkert 402889Sbinkertn@umich.edu 4112563Sgabeblack@google.comfrom __future__ import print_function 4212563Sgabeblack@google.com 434850Snate@binkert.orgimport code 444850Snate@binkert.orgimport datetime 454850Snate@binkert.orgimport os 464850Snate@binkert.orgimport socket 474850Snate@binkert.orgimport sys 484850Snate@binkert.org 492889Sbinkertn@umich.edu__all__ = [ 'options', 'arguments', 'main' ] 502889Sbinkertn@umich.edu 518327Sgblack@eecs.umich.eduusage="%prog [gem5 options] script.py [script options]" 525470Snate@binkert.orgversion="%prog 2.0" 538333Snate@binkert.orgbrief_copyright=\ 548333Snate@binkert.org "gem5 is copyrighted software; use the --copyright option for details." 552889Sbinkertn@umich.edu 568234Snate@binkert.orgdef parse_options(): 578234Snate@binkert.org import config 588234Snate@binkert.org from options import OptionParser 592889Sbinkertn@umich.edu 608234Snate@binkert.org options = OptionParser(usage=usage, version=version, 618234Snate@binkert.org description=brief_copyright) 628234Snate@binkert.org option = options.add_option 638234Snate@binkert.org group = options.set_group 642889Sbinkertn@umich.edu 6511923Sandreas.sandberg@arm.com listener_modes = ( "on", "off", "auto" ) 6611923Sandreas.sandberg@arm.com 678234Snate@binkert.org # Help options 688234Snate@binkert.org option('-B', "--build-info", action="store_true", default=False, 698234Snate@binkert.org help="Show build information") 708234Snate@binkert.org option('-C', "--copyright", action="store_true", default=False, 718234Snate@binkert.org help="Show full copyright information") 728234Snate@binkert.org option('-R', "--readme", action="store_true", default=False, 738234Snate@binkert.org help="Show the readme") 742889Sbinkertn@umich.edu 758234Snate@binkert.org # Options for configuring the base simulator 768234Snate@binkert.org option('-d', "--outdir", metavar="DIR", default="m5out", 778234Snate@binkert.org help="Set the output directory to DIR [Default: %default]") 788234Snate@binkert.org option('-r', "--redirect-stdout", action="store_true", default=False, 798234Snate@binkert.org help="Redirect stdout (& stderr, without -e) to file") 808234Snate@binkert.org option('-e', "--redirect-stderr", action="store_true", default=False, 818234Snate@binkert.org help="Redirect stderr to file") 828234Snate@binkert.org option("--stdout-file", metavar="FILE", default="simout", 838234Snate@binkert.org help="Filename for -r redirection [Default: %default]") 848234Snate@binkert.org option("--stderr-file", metavar="FILE", default="simerr", 858234Snate@binkert.org help="Filename for -e redirection [Default: %default]") 8611923Sandreas.sandberg@arm.com option("--listener-mode", metavar="{on,off,auto}", 8711923Sandreas.sandberg@arm.com choices=listener_modes, default="auto", 8811923Sandreas.sandberg@arm.com help="Port (e.g., gdb) listener mode (auto: Enable if running " \ 8911923Sandreas.sandberg@arm.com "interactively) [Default: %default]") 9012012Sgabeblack@google.com option("--listener-loopback-only", action="store_true", default=False, 9112012Sgabeblack@google.com help="Port listeners will only accept connections over the " \ 9212012Sgabeblack@google.com "loopback device") 938234Snate@binkert.org option('-i', "--interactive", action="store_true", default=False, 948234Snate@binkert.org help="Invoke the interactive interpreter after running the script") 958234Snate@binkert.org option("--pdb", action="store_true", default=False, 968234Snate@binkert.org help="Invoke the python debugger before running the script") 978234Snate@binkert.org option('-p', "--path", metavar="PATH[:PATH]", action='append', split=':', 988234Snate@binkert.org help="Prepend PATH to the system path when invoking the script") 998234Snate@binkert.org option('-q', "--quiet", action="count", default=0, 1008234Snate@binkert.org help="Reduce verbosity") 1018234Snate@binkert.org option('-v', "--verbose", action="count", default=0, 1028234Snate@binkert.org help="Increase verbosity") 1032889Sbinkertn@umich.edu 1048234Snate@binkert.org # Statistics options 1058234Snate@binkert.org group("Statistics Options") 1068234Snate@binkert.org option("--stats-file", metavar="FILE", default="stats.txt", 1078234Snate@binkert.org help="Sets the output file for statistics [Default: %default]") 1085773Snate@binkert.org 1098234Snate@binkert.org # Configuration Options 1108234Snate@binkert.org group("Configuration Options") 1118234Snate@binkert.org option("--dump-config", metavar="FILE", default="config.ini", 1128234Snate@binkert.org help="Dump configuration output file [Default: %default]") 1138664SAli.Saidi@ARM.com option("--json-config", metavar="FILE", default="config.json", 1148664SAli.Saidi@ARM.com help="Create JSON output of the configuration [Default: %default]") 1158998Suri.wiener@arm.com option("--dot-config", metavar="FILE", default="config.dot", 1168998Suri.wiener@arm.com help="Create DOT & pdf outputs of the configuration [Default: %default]") 11711431Ssascha.bischoff@arm.com option("--dot-dvfs-config", metavar="FILE", default=None, 11811418Ssascha.bischoff@arm.com help="Create DOT & pdf outputs of the DVFS configuration" + \ 11911418Ssascha.bischoff@arm.com " [Default: %default]") 1202889Sbinkertn@umich.edu 1218234Snate@binkert.org # Debugging options 1228234Snate@binkert.org group("Debugging Options") 12311299Ssteve.reinhardt@amd.com option("--debug-break", metavar="TICK[,TICK]", action='append', split=',', 12411299Ssteve.reinhardt@amd.com help="Create breakpoint(s) at TICK(s) " \ 12511299Ssteve.reinhardt@amd.com "(kills process if no debugger attached)") 1268234Snate@binkert.org option("--debug-help", action='store_true', 1279960Sandreas.hansson@arm.com help="Print help on debug flags") 1288234Snate@binkert.org option("--debug-flags", metavar="FLAG[,FLAG]", action='append', split=',', 1299960Sandreas.hansson@arm.com help="Sets the flags for debug output (-FLAG disables a flag)") 13011299Ssteve.reinhardt@amd.com option("--debug-start", metavar="TICK", type='int', 13111304Ssteve.reinhardt@amd.com help="Start debug output at TICK") 13211338SMichael.Lebeane@amd.com option("--debug-end", metavar="TICK", type='int', 13311338SMichael.Lebeane@amd.com help="End debug output at TICK") 1349960Sandreas.hansson@arm.com option("--debug-file", metavar="FILE", default="cout", 1359960Sandreas.hansson@arm.com help="Sets the output file for debug [Default: %default]") 1369960Sandreas.hansson@arm.com option("--debug-ignore", metavar="EXPR", action='append', split=':', 1379960Sandreas.hansson@arm.com help="Ignore EXPR sim objects") 1388234Snate@binkert.org option("--remote-gdb-port", type='int', default=7000, 1398234Snate@binkert.org help="Remote gdb base port (set to 0 to disable listening)") 1402889Sbinkertn@umich.edu 1418234Snate@binkert.org # Help options 1428234Snate@binkert.org group("Help Options") 1438234Snate@binkert.org option("--list-sim-objects", action='store_true', default=False, 1448234Snate@binkert.org help="List all built-in SimObjects, their params and default values") 1456171Snate@binkert.org 1468234Snate@binkert.org # load the options.py config file to allow people to set their own 1478234Snate@binkert.org # default options 1488234Snate@binkert.org options_file = config.get('options.py') 1498234Snate@binkert.org if options_file: 1508234Snate@binkert.org scope = { 'options' : options } 1518234Snate@binkert.org execfile(options_file, scope) 1528234Snate@binkert.org 1538234Snate@binkert.org arguments = options.parse_args() 1548234Snate@binkert.org return options,arguments 1556171Snate@binkert.org 1568219Snate@binkert.orgdef interact(scope): 1578327Sgblack@eecs.umich.edu banner = "gem5 Interactive Console" 1589512Sandreas@sandberg.pp.se 1599512Sandreas@sandberg.pp.se ipshell = None 1609512Sandreas@sandberg.pp.se prompt_in1 = "gem5 \\#> " 1619512Sandreas@sandberg.pp.se prompt_out = "gem5 \\#: " 1629512Sandreas@sandberg.pp.se 1639512Sandreas@sandberg.pp.se # Is IPython version 0.10 or earlier available? 1648219Snate@binkert.org try: 1658219Snate@binkert.org from IPython.Shell import IPShellEmbed 1669512Sandreas@sandberg.pp.se ipshell = IPShellEmbed(argv=["-prompt_in1", prompt_in1, 1679512Sandreas@sandberg.pp.se "-prompt_out", prompt_out], 1689512Sandreas@sandberg.pp.se banner=banner, user_ns=scope) 1699512Sandreas@sandberg.pp.se except ImportError: 1709512Sandreas@sandberg.pp.se pass 1719512Sandreas@sandberg.pp.se 1729512Sandreas@sandberg.pp.se # Is IPython version 0.11 or later available? 1739512Sandreas@sandberg.pp.se if not ipshell: 1749512Sandreas@sandberg.pp.se try: 1759512Sandreas@sandberg.pp.se import IPython 1769512Sandreas@sandberg.pp.se from IPython.config.loader import Config 17711635SCurtis.Dunham@arm.com from IPython.terminal.embed import InteractiveShellEmbed 1789512Sandreas@sandberg.pp.se 1799512Sandreas@sandberg.pp.se cfg = Config() 1809512Sandreas@sandberg.pp.se cfg.PromptManager.in_template = prompt_in1 1819512Sandreas@sandberg.pp.se cfg.PromptManager.out_template = prompt_out 1829512Sandreas@sandberg.pp.se ipshell = InteractiveShellEmbed(config=cfg, user_ns=scope, 1839512Sandreas@sandberg.pp.se banner1=banner) 1849512Sandreas@sandberg.pp.se except ImportError: 1859512Sandreas@sandberg.pp.se pass 1869512Sandreas@sandberg.pp.se 1879512Sandreas@sandberg.pp.se if ipshell: 1888219Snate@binkert.org ipshell() 1899512Sandreas@sandberg.pp.se else: 1909512Sandreas@sandberg.pp.se # Use the Python shell in the standard library if IPython 1919512Sandreas@sandberg.pp.se # isn't available. 1928219Snate@binkert.org code.InteractiveConsole(scope).interact(banner) 1938219Snate@binkert.org 1948234Snate@binkert.orgdef main(*args): 1958245Snate@binkert.org import m5 1968245Snate@binkert.org 1975801Snate@binkert.org import core 1985801Snate@binkert.org import debug 1995801Snate@binkert.org import defines 2004167Sbinkertn@umich.edu import event 2014042Sbinkertn@umich.edu import info 2025801Snate@binkert.org import stats 2035799Snate@binkert.org import trace 2045799Snate@binkert.org 20511923Sandreas.sandberg@arm.com from util import inform, fatal, panic, isInteractive 2068234Snate@binkert.org 2078234Snate@binkert.org if len(args) == 0: 2088234Snate@binkert.org options, arguments = parse_options() 2098234Snate@binkert.org elif len(args) == 2: 2108234Snate@binkert.org options, arguments = args 2118234Snate@binkert.org else: 21213663Sandreas.sandberg@arm.com raise TypeError("main() takes 0 or 2 arguments (%d given)" % len(args)) 2138234Snate@binkert.org 2148245Snate@binkert.org m5.options = options 2158245Snate@binkert.org 2165799Snate@binkert.org def check_tracing(): 2175799Snate@binkert.org if defines.TRACING_ON: 2185799Snate@binkert.org return 2195799Snate@binkert.org 2205802Snate@binkert.org fatal("Tracing is not enabled. Compile with TRACING_ON") 2212889Sbinkertn@umich.edu 2229983Sstever@gmail.com # Set the main event queue for the main thread. 2239983Sstever@gmail.com event.mainq = event.getEventQueue(0) 2249983Sstever@gmail.com event.setEventQueue(event.mainq) 2259983Sstever@gmail.com 2265524Sstever@gmail.com if not os.path.isdir(options.outdir): 2275524Sstever@gmail.com os.makedirs(options.outdir) 2285524Sstever@gmail.com 2295524Sstever@gmail.com # These filenames are used only if the redirect_std* options are set 2305524Sstever@gmail.com stdout_file = os.path.join(options.outdir, options.stdout_file) 2315524Sstever@gmail.com stderr_file = os.path.join(options.outdir, options.stderr_file) 2325524Sstever@gmail.com 2335524Sstever@gmail.com # Print redirection notices here before doing any redirection 2345524Sstever@gmail.com if options.redirect_stdout and not options.redirect_stderr: 23512563Sgabeblack@google.com print("Redirecting stdout and stderr to", stdout_file) 2365524Sstever@gmail.com else: 2375524Sstever@gmail.com if options.redirect_stdout: 23812563Sgabeblack@google.com print("Redirecting stdout to", stdout_file) 2395524Sstever@gmail.com if options.redirect_stderr: 24012563Sgabeblack@google.com print("Redirecting stderr to", stderr_file) 2415524Sstever@gmail.com 2425524Sstever@gmail.com # Now redirect stdout/stderr as desired 2435524Sstever@gmail.com if options.redirect_stdout: 2445524Sstever@gmail.com redir_fd = os.open(stdout_file, os. O_WRONLY | os.O_CREAT | os.O_TRUNC) 2455524Sstever@gmail.com os.dup2(redir_fd, sys.stdout.fileno()) 2465524Sstever@gmail.com if not options.redirect_stderr: 2475524Sstever@gmail.com os.dup2(redir_fd, sys.stderr.fileno()) 2485524Sstever@gmail.com 2495524Sstever@gmail.com if options.redirect_stderr: 2505524Sstever@gmail.com redir_fd = os.open(stderr_file, os. O_WRONLY | os.O_CREAT | os.O_TRUNC) 2515524Sstever@gmail.com os.dup2(redir_fd, sys.stderr.fileno()) 2525524Sstever@gmail.com 2532889Sbinkertn@umich.edu done = False 2544850Snate@binkert.org 2554850Snate@binkert.org if options.build_info: 2564850Snate@binkert.org done = True 25712563Sgabeblack@google.com print('Build information:') 25812563Sgabeblack@google.com print() 25912563Sgabeblack@google.com print('compiled %s' % defines.compileDate) 26012563Sgabeblack@google.com print('build options:') 2615801Snate@binkert.org keys = defines.buildEnv.keys() 2624850Snate@binkert.org keys.sort() 2634850Snate@binkert.org for key in keys: 2645801Snate@binkert.org val = defines.buildEnv[key] 26512563Sgabeblack@google.com print(' %s = %s' % (key, val)) 26612563Sgabeblack@google.com print() 2674850Snate@binkert.org 2682889Sbinkertn@umich.edu if options.copyright: 2692889Sbinkertn@umich.edu done = True 27012563Sgabeblack@google.com print(info.COPYING) 27112563Sgabeblack@google.com print() 2722889Sbinkertn@umich.edu 2732889Sbinkertn@umich.edu if options.readme: 2742889Sbinkertn@umich.edu done = True 27512563Sgabeblack@google.com print('Readme:') 27612563Sgabeblack@google.com print() 27712563Sgabeblack@google.com print(info.README) 27812563Sgabeblack@google.com print() 2792889Sbinkertn@umich.edu 2808232Snate@binkert.org if options.debug_help: 2814053Sbinkertn@umich.edu done = True 2825799Snate@binkert.org check_tracing() 2838232Snate@binkert.org debug.help() 2844053Sbinkertn@umich.edu 2855473Snate@binkert.org if options.list_sim_objects: 2865473Snate@binkert.org import SimObject 2875473Snate@binkert.org done = True 28812563Sgabeblack@google.com print("SimObjects:") 2895473Snate@binkert.org objects = SimObject.allClasses.keys() 2905473Snate@binkert.org objects.sort() 2915473Snate@binkert.org for name in objects: 2925473Snate@binkert.org obj = SimObject.allClasses[name] 29312563Sgabeblack@google.com print(" %s" % obj) 2945473Snate@binkert.org params = obj._params.keys() 2955473Snate@binkert.org params.sort() 2965473Snate@binkert.org for pname in params: 2975473Snate@binkert.org param = obj._params[pname] 2985473Snate@binkert.org default = getattr(param, 'default', '') 29912563Sgabeblack@google.com print(" %s" % pname) 3005473Snate@binkert.org if default: 30112563Sgabeblack@google.com print(" default: %s" % default) 30212563Sgabeblack@google.com print(" desc: %s" % param.desc) 30312563Sgabeblack@google.com print() 30412563Sgabeblack@google.com print() 3055473Snate@binkert.org 3062889Sbinkertn@umich.edu if done: 3072889Sbinkertn@umich.edu sys.exit(0) 3082889Sbinkertn@umich.edu 3095470Snate@binkert.org # setting verbose and quiet at the same time doesn't make sense 3105470Snate@binkert.org if options.verbose > 0 and options.quiet > 0: 3115470Snate@binkert.org options.usage(2) 3125470Snate@binkert.org 3135470Snate@binkert.org verbose = options.verbose - options.quiet 31410134Sstan.czerniawski@arm.com if verbose >= 0: 31512563Sgabeblack@google.com print("gem5 Simulator System. http://gem5.org") 31612563Sgabeblack@google.com print(brief_copyright) 31712563Sgabeblack@google.com print() 3185801Snate@binkert.org 31912563Sgabeblack@google.com print("gem5 compiled %s" % defines.compileDate) 3205456Ssaidi@eecs.umich.edu 32112563Sgabeblack@google.com print("gem5 started %s" % 32212563Sgabeblack@google.com datetime.datetime.now().strftime("%b %e %Y %X")) 32312563Sgabeblack@google.com print("gem5 executing on %s, pid %d" % 32412563Sgabeblack@google.com (socket.gethostname(), os.getpid())) 3255528Sstever@gmail.com 32610758Ssteve.reinhardt@amd.com # in Python 3 pipes.quote() is moved to shlex.quote() 32710758Ssteve.reinhardt@amd.com import pipes 32812563Sgabeblack@google.com print("command line:", " ".join(map(pipes.quote, sys.argv))) 32912563Sgabeblack@google.com print() 3302889Sbinkertn@umich.edu 3312889Sbinkertn@umich.edu # check to make sure we can find the listed script 3322889Sbinkertn@umich.edu if not arguments or not os.path.isfile(arguments[0]): 3332922Sktlim@umich.edu if arguments and not os.path.isfile(arguments[0]): 33412563Sgabeblack@google.com print("Script %s not found" % arguments[0]) 3354053Sbinkertn@umich.edu 3365470Snate@binkert.org options.usage(2) 3372889Sbinkertn@umich.edu 3382889Sbinkertn@umich.edu # tell C++ about output directory 3395801Snate@binkert.org core.setOutputDir(options.outdir) 3402889Sbinkertn@umich.edu 3412889Sbinkertn@umich.edu # update the system path with elements from the -p option 3422889Sbinkertn@umich.edu sys.path[0:0] = options.path 3432889Sbinkertn@umich.edu 3442889Sbinkertn@umich.edu # set stats options 34511878Sandreas.sandberg@arm.com stats.addStatVisitor(options.stats_file) 3462889Sbinkertn@umich.edu 34711923Sandreas.sandberg@arm.com # Disable listeners unless running interactively or explicitly 34811923Sandreas.sandberg@arm.com # enabled 34911923Sandreas.sandberg@arm.com if options.listener_mode == "off": 35011923Sandreas.sandberg@arm.com m5.disableAllListeners() 35111923Sandreas.sandberg@arm.com elif options.listener_mode == "auto": 35211923Sandreas.sandberg@arm.com if not isInteractive(): 35311923Sandreas.sandberg@arm.com inform("Standard input is not a terminal, disabling listeners.") 35411923Sandreas.sandberg@arm.com m5.disableAllListeners() 35511923Sandreas.sandberg@arm.com elif options.listener_mode == "on": 35611923Sandreas.sandberg@arm.com pass 35711923Sandreas.sandberg@arm.com else: 35811923Sandreas.sandberg@arm.com panic("Unhandled listener mode: %s" % options.listener_mode) 35911923Sandreas.sandberg@arm.com 36012012Sgabeblack@google.com if options.listener_loopback_only: 36112012Sgabeblack@google.com m5.listenersLoopbackOnly() 36212012Sgabeblack@google.com 3632889Sbinkertn@umich.edu # set debugging options 3645801Snate@binkert.org debug.setRemoteGDBPort(options.remote_gdb_port) 3653645Sbinkertn@umich.edu for when in options.debug_break: 3669960Sandreas.hansson@arm.com debug.schedBreak(int(when)) 3672889Sbinkertn@umich.edu 3688232Snate@binkert.org if options.debug_flags: 3695799Snate@binkert.org check_tracing() 3704053Sbinkertn@umich.edu 3715586Snate@binkert.org on_flags = [] 3725586Snate@binkert.org off_flags = [] 3738232Snate@binkert.org for flag in options.debug_flags: 3745586Snate@binkert.org off = False 3755586Snate@binkert.org if flag.startswith('-'): 3765586Snate@binkert.org flag = flag[1:] 3775586Snate@binkert.org off = True 3788232Snate@binkert.org 3798232Snate@binkert.org if flag not in debug.flags: 38012563Sgabeblack@google.com print("invalid debug flag '%s'" % flag, file=sys.stderr) 3815586Snate@binkert.org sys.exit(1) 3824053Sbinkertn@umich.edu 3835586Snate@binkert.org if off: 3848232Snate@binkert.org debug.flags[flag].disable() 3855586Snate@binkert.org else: 3868232Snate@binkert.org debug.flags[flag].enable() 3874053Sbinkertn@umich.edu 3889960Sandreas.hansson@arm.com if options.debug_start: 3895799Snate@binkert.org check_tracing() 3909960Sandreas.hansson@arm.com e = event.create(trace.enable, event.Event.Debug_Enable_Pri) 3919960Sandreas.hansson@arm.com event.mainq.schedule(e, options.debug_start) 3924074Sbinkertn@umich.edu else: 3935799Snate@binkert.org trace.enable() 3944042Sbinkertn@umich.edu 39511338SMichael.Lebeane@amd.com if options.debug_end: 39611338SMichael.Lebeane@amd.com check_tracing() 39711338SMichael.Lebeane@amd.com e = event.create(trace.disable, event.Event.Debug_Enable_Pri) 39811338SMichael.Lebeane@amd.com event.mainq.schedule(e, options.debug_end) 39911338SMichael.Lebeane@amd.com 4009960Sandreas.hansson@arm.com trace.output(options.debug_file) 4014042Sbinkertn@umich.edu 4029960Sandreas.hansson@arm.com for ignore in options.debug_ignore: 4035799Snate@binkert.org check_tracing() 4045799Snate@binkert.org trace.ignore(ignore) 4052889Sbinkertn@umich.edu 4062889Sbinkertn@umich.edu sys.argv = arguments 4072889Sbinkertn@umich.edu sys.path = [ os.path.dirname(sys.argv[0]) ] + sys.path 4082891Sbinkertn@umich.edu 4095604Snate@binkert.org filename = sys.argv[0] 4105604Snate@binkert.org filedata = file(filename, 'r').read() 4115604Snate@binkert.org filecode = compile(filedata, filename, 'exec') 4125604Snate@binkert.org scope = { '__file__' : filename, 4133887Sbinkertn@umich.edu '__name__' : '__m5_main__' } 4142899Sbinkertn@umich.edu 4152899Sbinkertn@umich.edu # if pdb was requested, execfile the thing under pdb, otherwise, 4162899Sbinkertn@umich.edu # just do the execfile normally 4172899Sbinkertn@umich.edu if options.pdb: 4185604Snate@binkert.org import pdb 4195604Snate@binkert.org import traceback 4205604Snate@binkert.org 4215604Snate@binkert.org pdb = pdb.Pdb() 4225604Snate@binkert.org try: 4235604Snate@binkert.org pdb.run(filecode, scope) 4245604Snate@binkert.org except SystemExit: 42512563Sgabeblack@google.com print("The program exited via sys.exit(). Exit status: ", end=' ') 42612563Sgabeblack@google.com print(sys.exc_info()[1]) 4275604Snate@binkert.org except: 4285604Snate@binkert.org traceback.print_exc() 42912563Sgabeblack@google.com print("Uncaught exception. Entering post mortem debugging") 4305604Snate@binkert.org t = sys.exc_info()[2] 4315604Snate@binkert.org while t.tb_next is not None: 4325604Snate@binkert.org t = t.tb_next 4335604Snate@binkert.org pdb.interaction(t.tb_frame,t) 4342899Sbinkertn@umich.edu else: 4355604Snate@binkert.org exec filecode in scope 4362889Sbinkertn@umich.edu 4372889Sbinkertn@umich.edu # once the script is done 4382889Sbinkertn@umich.edu if options.interactive: 4398219Snate@binkert.org interact(scope) 4402889Sbinkertn@umich.edu 4412889Sbinkertn@umich.eduif __name__ == '__main__': 4422889Sbinkertn@umich.edu from pprint import pprint 4432889Sbinkertn@umich.edu 4448234Snate@binkert.org options, arguments = parse_options() 4458234Snate@binkert.org 44612563Sgabeblack@google.com print('opts:') 4472889Sbinkertn@umich.edu pprint(options, indent=4) 44812563Sgabeblack@google.com print() 4492889Sbinkertn@umich.edu 45012563Sgabeblack@google.com print('args:') 4512889Sbinkertn@umich.edu pprint(arguments, indent=4) 452