main.py revision 13709
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 } 15113671Sandreas.sandberg@arm.com exec(compile(open(options_file).read(), options_file, 'exec'), 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 19413671Sandreas.sandberg@arm.com 19513671Sandreas.sandberg@arm.comdef _check_tracing(): 19613674Sandreas.sandberg@arm.com import defines 19713674Sandreas.sandberg@arm.com 19813671Sandreas.sandberg@arm.com if defines.TRACING_ON: 19913671Sandreas.sandberg@arm.com return 20013671Sandreas.sandberg@arm.com 20113671Sandreas.sandberg@arm.com fatal("Tracing is not enabled. Compile with TRACING_ON") 20213671Sandreas.sandberg@arm.com 2038234Snate@binkert.orgdef main(*args): 2048245Snate@binkert.org import m5 2058245Snate@binkert.org 2065801Snate@binkert.org import core 2075801Snate@binkert.org import debug 2085801Snate@binkert.org import defines 2094167Sbinkertn@umich.edu import event 2104042Sbinkertn@umich.edu import info 2115801Snate@binkert.org import stats 2125799Snate@binkert.org import trace 2135799Snate@binkert.org 21411923Sandreas.sandberg@arm.com from util import inform, fatal, panic, isInteractive 2158234Snate@binkert.org 2168234Snate@binkert.org if len(args) == 0: 2178234Snate@binkert.org options, arguments = parse_options() 2188234Snate@binkert.org elif len(args) == 2: 2198234Snate@binkert.org options, arguments = args 2208234Snate@binkert.org else: 22113663Sandreas.sandberg@arm.com raise TypeError("main() takes 0 or 2 arguments (%d given)" % len(args)) 2228234Snate@binkert.org 2238245Snate@binkert.org m5.options = options 2248245Snate@binkert.org 2259983Sstever@gmail.com # Set the main event queue for the main thread. 2269983Sstever@gmail.com event.mainq = event.getEventQueue(0) 2279983Sstever@gmail.com event.setEventQueue(event.mainq) 2289983Sstever@gmail.com 2295524Sstever@gmail.com if not os.path.isdir(options.outdir): 2305524Sstever@gmail.com os.makedirs(options.outdir) 2315524Sstever@gmail.com 2325524Sstever@gmail.com # These filenames are used only if the redirect_std* options are set 2335524Sstever@gmail.com stdout_file = os.path.join(options.outdir, options.stdout_file) 2345524Sstever@gmail.com stderr_file = os.path.join(options.outdir, options.stderr_file) 2355524Sstever@gmail.com 2365524Sstever@gmail.com # Print redirection notices here before doing any redirection 2375524Sstever@gmail.com if options.redirect_stdout and not options.redirect_stderr: 23812563Sgabeblack@google.com print("Redirecting stdout and stderr to", stdout_file) 2395524Sstever@gmail.com else: 2405524Sstever@gmail.com if options.redirect_stdout: 24112563Sgabeblack@google.com print("Redirecting stdout to", stdout_file) 2425524Sstever@gmail.com if options.redirect_stderr: 24312563Sgabeblack@google.com print("Redirecting stderr to", stderr_file) 2445524Sstever@gmail.com 2455524Sstever@gmail.com # Now redirect stdout/stderr as desired 2465524Sstever@gmail.com if options.redirect_stdout: 2475524Sstever@gmail.com redir_fd = os.open(stdout_file, os. O_WRONLY | os.O_CREAT | os.O_TRUNC) 2485524Sstever@gmail.com os.dup2(redir_fd, sys.stdout.fileno()) 2495524Sstever@gmail.com if not options.redirect_stderr: 2505524Sstever@gmail.com os.dup2(redir_fd, sys.stderr.fileno()) 2515524Sstever@gmail.com 2525524Sstever@gmail.com if options.redirect_stderr: 2535524Sstever@gmail.com redir_fd = os.open(stderr_file, os. O_WRONLY | os.O_CREAT | os.O_TRUNC) 2545524Sstever@gmail.com os.dup2(redir_fd, sys.stderr.fileno()) 2555524Sstever@gmail.com 2562889Sbinkertn@umich.edu done = False 2574850Snate@binkert.org 2584850Snate@binkert.org if options.build_info: 2594850Snate@binkert.org done = True 26012563Sgabeblack@google.com print('Build information:') 26112563Sgabeblack@google.com print() 26212563Sgabeblack@google.com print('compiled %s' % defines.compileDate) 26312563Sgabeblack@google.com print('build options:') 26413709Sandreas.sandberg@arm.com keys = list(defines.buildEnv.keys()) 2654850Snate@binkert.org keys.sort() 2664850Snate@binkert.org for key in keys: 2675801Snate@binkert.org val = defines.buildEnv[key] 26812563Sgabeblack@google.com print(' %s = %s' % (key, val)) 26912563Sgabeblack@google.com print() 2704850Snate@binkert.org 2712889Sbinkertn@umich.edu if options.copyright: 2722889Sbinkertn@umich.edu done = True 27312563Sgabeblack@google.com print(info.COPYING) 27412563Sgabeblack@google.com print() 2752889Sbinkertn@umich.edu 2762889Sbinkertn@umich.edu if options.readme: 2772889Sbinkertn@umich.edu done = True 27812563Sgabeblack@google.com print('Readme:') 27912563Sgabeblack@google.com print() 28012563Sgabeblack@google.com print(info.README) 28112563Sgabeblack@google.com print() 2822889Sbinkertn@umich.edu 2838232Snate@binkert.org if options.debug_help: 2844053Sbinkertn@umich.edu done = True 28513671Sandreas.sandberg@arm.com _check_tracing() 2868232Snate@binkert.org debug.help() 2874053Sbinkertn@umich.edu 2885473Snate@binkert.org if options.list_sim_objects: 2895473Snate@binkert.org import SimObject 2905473Snate@binkert.org done = True 29112563Sgabeblack@google.com print("SimObjects:") 29213709Sandreas.sandberg@arm.com objects = list(SimObject.allClasses.keys()) 2935473Snate@binkert.org objects.sort() 2945473Snate@binkert.org for name in objects: 2955473Snate@binkert.org obj = SimObject.allClasses[name] 29612563Sgabeblack@google.com print(" %s" % obj) 29713709Sandreas.sandberg@arm.com params = list(obj._params.keys()) 2985473Snate@binkert.org params.sort() 2995473Snate@binkert.org for pname in params: 3005473Snate@binkert.org param = obj._params[pname] 3015473Snate@binkert.org default = getattr(param, 'default', '') 30212563Sgabeblack@google.com print(" %s" % pname) 3035473Snate@binkert.org if default: 30412563Sgabeblack@google.com print(" default: %s" % default) 30512563Sgabeblack@google.com print(" desc: %s" % param.desc) 30612563Sgabeblack@google.com print() 30712563Sgabeblack@google.com print() 3085473Snate@binkert.org 3092889Sbinkertn@umich.edu if done: 3102889Sbinkertn@umich.edu sys.exit(0) 3112889Sbinkertn@umich.edu 3125470Snate@binkert.org # setting verbose and quiet at the same time doesn't make sense 3135470Snate@binkert.org if options.verbose > 0 and options.quiet > 0: 3145470Snate@binkert.org options.usage(2) 3155470Snate@binkert.org 3165470Snate@binkert.org verbose = options.verbose - options.quiet 31710134Sstan.czerniawski@arm.com if verbose >= 0: 31812563Sgabeblack@google.com print("gem5 Simulator System. http://gem5.org") 31912563Sgabeblack@google.com print(brief_copyright) 32012563Sgabeblack@google.com print() 3215801Snate@binkert.org 32212563Sgabeblack@google.com print("gem5 compiled %s" % defines.compileDate) 3235456Ssaidi@eecs.umich.edu 32412563Sgabeblack@google.com print("gem5 started %s" % 32512563Sgabeblack@google.com datetime.datetime.now().strftime("%b %e %Y %X")) 32612563Sgabeblack@google.com print("gem5 executing on %s, pid %d" % 32712563Sgabeblack@google.com (socket.gethostname(), os.getpid())) 3285528Sstever@gmail.com 32910758Ssteve.reinhardt@amd.com # in Python 3 pipes.quote() is moved to shlex.quote() 33010758Ssteve.reinhardt@amd.com import pipes 33112563Sgabeblack@google.com print("command line:", " ".join(map(pipes.quote, sys.argv))) 33212563Sgabeblack@google.com print() 3332889Sbinkertn@umich.edu 3342889Sbinkertn@umich.edu # check to make sure we can find the listed script 3352889Sbinkertn@umich.edu if not arguments or not os.path.isfile(arguments[0]): 3362922Sktlim@umich.edu if arguments and not os.path.isfile(arguments[0]): 33712563Sgabeblack@google.com print("Script %s not found" % arguments[0]) 3384053Sbinkertn@umich.edu 3395470Snate@binkert.org options.usage(2) 3402889Sbinkertn@umich.edu 3412889Sbinkertn@umich.edu # tell C++ about output directory 3425801Snate@binkert.org core.setOutputDir(options.outdir) 3432889Sbinkertn@umich.edu 3442889Sbinkertn@umich.edu # update the system path with elements from the -p option 3452889Sbinkertn@umich.edu sys.path[0:0] = options.path 3462889Sbinkertn@umich.edu 3472889Sbinkertn@umich.edu # set stats options 34811878Sandreas.sandberg@arm.com stats.addStatVisitor(options.stats_file) 3492889Sbinkertn@umich.edu 35011923Sandreas.sandberg@arm.com # Disable listeners unless running interactively or explicitly 35111923Sandreas.sandberg@arm.com # enabled 35211923Sandreas.sandberg@arm.com if options.listener_mode == "off": 35311923Sandreas.sandberg@arm.com m5.disableAllListeners() 35411923Sandreas.sandberg@arm.com elif options.listener_mode == "auto": 35511923Sandreas.sandberg@arm.com if not isInteractive(): 35611923Sandreas.sandberg@arm.com inform("Standard input is not a terminal, disabling listeners.") 35711923Sandreas.sandberg@arm.com m5.disableAllListeners() 35811923Sandreas.sandberg@arm.com elif options.listener_mode == "on": 35911923Sandreas.sandberg@arm.com pass 36011923Sandreas.sandberg@arm.com else: 36111923Sandreas.sandberg@arm.com panic("Unhandled listener mode: %s" % options.listener_mode) 36211923Sandreas.sandberg@arm.com 36312012Sgabeblack@google.com if options.listener_loopback_only: 36412012Sgabeblack@google.com m5.listenersLoopbackOnly() 36512012Sgabeblack@google.com 3662889Sbinkertn@umich.edu # set debugging options 3675801Snate@binkert.org debug.setRemoteGDBPort(options.remote_gdb_port) 3683645Sbinkertn@umich.edu for when in options.debug_break: 3699960Sandreas.hansson@arm.com debug.schedBreak(int(when)) 3702889Sbinkertn@umich.edu 3718232Snate@binkert.org if options.debug_flags: 37213671Sandreas.sandberg@arm.com _check_tracing() 3734053Sbinkertn@umich.edu 3745586Snate@binkert.org on_flags = [] 3755586Snate@binkert.org off_flags = [] 3768232Snate@binkert.org for flag in options.debug_flags: 3775586Snate@binkert.org off = False 3785586Snate@binkert.org if flag.startswith('-'): 3795586Snate@binkert.org flag = flag[1:] 3805586Snate@binkert.org off = True 3818232Snate@binkert.org 3828232Snate@binkert.org if flag not in debug.flags: 38312563Sgabeblack@google.com print("invalid debug flag '%s'" % flag, file=sys.stderr) 3845586Snate@binkert.org sys.exit(1) 3854053Sbinkertn@umich.edu 3865586Snate@binkert.org if off: 3878232Snate@binkert.org debug.flags[flag].disable() 3885586Snate@binkert.org else: 3898232Snate@binkert.org debug.flags[flag].enable() 3904053Sbinkertn@umich.edu 3919960Sandreas.hansson@arm.com if options.debug_start: 39213671Sandreas.sandberg@arm.com _check_tracing() 3939960Sandreas.hansson@arm.com e = event.create(trace.enable, event.Event.Debug_Enable_Pri) 3949960Sandreas.hansson@arm.com event.mainq.schedule(e, options.debug_start) 3954074Sbinkertn@umich.edu else: 3965799Snate@binkert.org trace.enable() 3974042Sbinkertn@umich.edu 39811338SMichael.Lebeane@amd.com if options.debug_end: 39913671Sandreas.sandberg@arm.com _check_tracing() 40011338SMichael.Lebeane@amd.com e = event.create(trace.disable, event.Event.Debug_Enable_Pri) 40111338SMichael.Lebeane@amd.com event.mainq.schedule(e, options.debug_end) 40211338SMichael.Lebeane@amd.com 4039960Sandreas.hansson@arm.com trace.output(options.debug_file) 4044042Sbinkertn@umich.edu 4059960Sandreas.hansson@arm.com for ignore in options.debug_ignore: 40613671Sandreas.sandberg@arm.com _check_tracing() 4075799Snate@binkert.org trace.ignore(ignore) 4082889Sbinkertn@umich.edu 4092889Sbinkertn@umich.edu sys.argv = arguments 4102889Sbinkertn@umich.edu sys.path = [ os.path.dirname(sys.argv[0]) ] + sys.path 4112891Sbinkertn@umich.edu 4125604Snate@binkert.org filename = sys.argv[0] 41313670Sandreas.sandberg@arm.com filedata = open(filename, 'r').read() 4145604Snate@binkert.org filecode = compile(filedata, filename, 'exec') 4155604Snate@binkert.org scope = { '__file__' : filename, 4163887Sbinkertn@umich.edu '__name__' : '__m5_main__' } 4172899Sbinkertn@umich.edu 4182899Sbinkertn@umich.edu # if pdb was requested, execfile the thing under pdb, otherwise, 4192899Sbinkertn@umich.edu # just do the execfile normally 4202899Sbinkertn@umich.edu if options.pdb: 4215604Snate@binkert.org import pdb 4225604Snate@binkert.org import traceback 4235604Snate@binkert.org 4245604Snate@binkert.org pdb = pdb.Pdb() 4255604Snate@binkert.org try: 4265604Snate@binkert.org pdb.run(filecode, scope) 4275604Snate@binkert.org except SystemExit: 42812563Sgabeblack@google.com print("The program exited via sys.exit(). Exit status: ", end=' ') 42912563Sgabeblack@google.com print(sys.exc_info()[1]) 4305604Snate@binkert.org except: 4315604Snate@binkert.org traceback.print_exc() 43212563Sgabeblack@google.com print("Uncaught exception. Entering post mortem debugging") 4335604Snate@binkert.org t = sys.exc_info()[2] 4345604Snate@binkert.org while t.tb_next is not None: 4355604Snate@binkert.org t = t.tb_next 4365604Snate@binkert.org pdb.interaction(t.tb_frame,t) 4372899Sbinkertn@umich.edu else: 43813671Sandreas.sandberg@arm.com exec(filecode, scope) 4392889Sbinkertn@umich.edu 4402889Sbinkertn@umich.edu # once the script is done 4412889Sbinkertn@umich.edu if options.interactive: 4428219Snate@binkert.org interact(scope) 4432889Sbinkertn@umich.edu 4442889Sbinkertn@umich.eduif __name__ == '__main__': 4452889Sbinkertn@umich.edu from pprint import pprint 4462889Sbinkertn@umich.edu 4478234Snate@binkert.org options, arguments = parse_options() 4488234Snate@binkert.org 44912563Sgabeblack@google.com print('opts:') 4502889Sbinkertn@umich.edu pprint(options, indent=4) 45112563Sgabeblack@google.com print() 4522889Sbinkertn@umich.edu 45312563Sgabeblack@google.com print('args:') 4542889Sbinkertn@umich.edu pprint(arguments, indent=4) 455