main.py revision 13671
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(): 19613671Sandreas.sandberg@arm.com if defines.TRACING_ON: 19713671Sandreas.sandberg@arm.com return 19813671Sandreas.sandberg@arm.com 19913671Sandreas.sandberg@arm.com fatal("Tracing is not enabled. Compile with TRACING_ON") 20013671Sandreas.sandberg@arm.com 2018234Snate@binkert.orgdef main(*args): 2028245Snate@binkert.org import m5 2038245Snate@binkert.org 2045801Snate@binkert.org import core 2055801Snate@binkert.org import debug 2065801Snate@binkert.org import defines 2074167Sbinkertn@umich.edu import event 2084042Sbinkertn@umich.edu import info 2095801Snate@binkert.org import stats 2105799Snate@binkert.org import trace 2115799Snate@binkert.org 21211923Sandreas.sandberg@arm.com from util import inform, fatal, panic, isInteractive 2138234Snate@binkert.org 2148234Snate@binkert.org if len(args) == 0: 2158234Snate@binkert.org options, arguments = parse_options() 2168234Snate@binkert.org elif len(args) == 2: 2178234Snate@binkert.org options, arguments = args 2188234Snate@binkert.org else: 21913663Sandreas.sandberg@arm.com raise TypeError("main() takes 0 or 2 arguments (%d given)" % len(args)) 2208234Snate@binkert.org 2218245Snate@binkert.org m5.options = options 2228245Snate@binkert.org 2239983Sstever@gmail.com # Set the main event queue for the main thread. 2249983Sstever@gmail.com event.mainq = event.getEventQueue(0) 2259983Sstever@gmail.com event.setEventQueue(event.mainq) 2269983Sstever@gmail.com 2275524Sstever@gmail.com if not os.path.isdir(options.outdir): 2285524Sstever@gmail.com os.makedirs(options.outdir) 2295524Sstever@gmail.com 2305524Sstever@gmail.com # These filenames are used only if the redirect_std* options are set 2315524Sstever@gmail.com stdout_file = os.path.join(options.outdir, options.stdout_file) 2325524Sstever@gmail.com stderr_file = os.path.join(options.outdir, options.stderr_file) 2335524Sstever@gmail.com 2345524Sstever@gmail.com # Print redirection notices here before doing any redirection 2355524Sstever@gmail.com if options.redirect_stdout and not options.redirect_stderr: 23612563Sgabeblack@google.com print("Redirecting stdout and stderr to", stdout_file) 2375524Sstever@gmail.com else: 2385524Sstever@gmail.com if options.redirect_stdout: 23912563Sgabeblack@google.com print("Redirecting stdout to", stdout_file) 2405524Sstever@gmail.com if options.redirect_stderr: 24112563Sgabeblack@google.com print("Redirecting stderr to", stderr_file) 2425524Sstever@gmail.com 2435524Sstever@gmail.com # Now redirect stdout/stderr as desired 2445524Sstever@gmail.com if options.redirect_stdout: 2455524Sstever@gmail.com redir_fd = os.open(stdout_file, os. O_WRONLY | os.O_CREAT | os.O_TRUNC) 2465524Sstever@gmail.com os.dup2(redir_fd, sys.stdout.fileno()) 2475524Sstever@gmail.com if not options.redirect_stderr: 2485524Sstever@gmail.com os.dup2(redir_fd, sys.stderr.fileno()) 2495524Sstever@gmail.com 2505524Sstever@gmail.com if options.redirect_stderr: 2515524Sstever@gmail.com redir_fd = os.open(stderr_file, os. O_WRONLY | os.O_CREAT | os.O_TRUNC) 2525524Sstever@gmail.com os.dup2(redir_fd, sys.stderr.fileno()) 2535524Sstever@gmail.com 2542889Sbinkertn@umich.edu done = False 2554850Snate@binkert.org 2564850Snate@binkert.org if options.build_info: 2574850Snate@binkert.org done = True 25812563Sgabeblack@google.com print('Build information:') 25912563Sgabeblack@google.com print() 26012563Sgabeblack@google.com print('compiled %s' % defines.compileDate) 26112563Sgabeblack@google.com print('build options:') 2625801Snate@binkert.org keys = defines.buildEnv.keys() 2634850Snate@binkert.org keys.sort() 2644850Snate@binkert.org for key in keys: 2655801Snate@binkert.org val = defines.buildEnv[key] 26612563Sgabeblack@google.com print(' %s = %s' % (key, val)) 26712563Sgabeblack@google.com print() 2684850Snate@binkert.org 2692889Sbinkertn@umich.edu if options.copyright: 2702889Sbinkertn@umich.edu done = True 27112563Sgabeblack@google.com print(info.COPYING) 27212563Sgabeblack@google.com print() 2732889Sbinkertn@umich.edu 2742889Sbinkertn@umich.edu if options.readme: 2752889Sbinkertn@umich.edu done = True 27612563Sgabeblack@google.com print('Readme:') 27712563Sgabeblack@google.com print() 27812563Sgabeblack@google.com print(info.README) 27912563Sgabeblack@google.com print() 2802889Sbinkertn@umich.edu 2818232Snate@binkert.org if options.debug_help: 2824053Sbinkertn@umich.edu done = True 28313671Sandreas.sandberg@arm.com _check_tracing() 2848232Snate@binkert.org debug.help() 2854053Sbinkertn@umich.edu 2865473Snate@binkert.org if options.list_sim_objects: 2875473Snate@binkert.org import SimObject 2885473Snate@binkert.org done = True 28912563Sgabeblack@google.com print("SimObjects:") 2905473Snate@binkert.org objects = SimObject.allClasses.keys() 2915473Snate@binkert.org objects.sort() 2925473Snate@binkert.org for name in objects: 2935473Snate@binkert.org obj = SimObject.allClasses[name] 29412563Sgabeblack@google.com print(" %s" % obj) 2955473Snate@binkert.org params = obj._params.keys() 2965473Snate@binkert.org params.sort() 2975473Snate@binkert.org for pname in params: 2985473Snate@binkert.org param = obj._params[pname] 2995473Snate@binkert.org default = getattr(param, 'default', '') 30012563Sgabeblack@google.com print(" %s" % pname) 3015473Snate@binkert.org if default: 30212563Sgabeblack@google.com print(" default: %s" % default) 30312563Sgabeblack@google.com print(" desc: %s" % param.desc) 30412563Sgabeblack@google.com print() 30512563Sgabeblack@google.com print() 3065473Snate@binkert.org 3072889Sbinkertn@umich.edu if done: 3082889Sbinkertn@umich.edu sys.exit(0) 3092889Sbinkertn@umich.edu 3105470Snate@binkert.org # setting verbose and quiet at the same time doesn't make sense 3115470Snate@binkert.org if options.verbose > 0 and options.quiet > 0: 3125470Snate@binkert.org options.usage(2) 3135470Snate@binkert.org 3145470Snate@binkert.org verbose = options.verbose - options.quiet 31510134Sstan.czerniawski@arm.com if verbose >= 0: 31612563Sgabeblack@google.com print("gem5 Simulator System. http://gem5.org") 31712563Sgabeblack@google.com print(brief_copyright) 31812563Sgabeblack@google.com print() 3195801Snate@binkert.org 32012563Sgabeblack@google.com print("gem5 compiled %s" % defines.compileDate) 3215456Ssaidi@eecs.umich.edu 32212563Sgabeblack@google.com print("gem5 started %s" % 32312563Sgabeblack@google.com datetime.datetime.now().strftime("%b %e %Y %X")) 32412563Sgabeblack@google.com print("gem5 executing on %s, pid %d" % 32512563Sgabeblack@google.com (socket.gethostname(), os.getpid())) 3265528Sstever@gmail.com 32710758Ssteve.reinhardt@amd.com # in Python 3 pipes.quote() is moved to shlex.quote() 32810758Ssteve.reinhardt@amd.com import pipes 32912563Sgabeblack@google.com print("command line:", " ".join(map(pipes.quote, sys.argv))) 33012563Sgabeblack@google.com print() 3312889Sbinkertn@umich.edu 3322889Sbinkertn@umich.edu # check to make sure we can find the listed script 3332889Sbinkertn@umich.edu if not arguments or not os.path.isfile(arguments[0]): 3342922Sktlim@umich.edu if arguments and not os.path.isfile(arguments[0]): 33512563Sgabeblack@google.com print("Script %s not found" % arguments[0]) 3364053Sbinkertn@umich.edu 3375470Snate@binkert.org options.usage(2) 3382889Sbinkertn@umich.edu 3392889Sbinkertn@umich.edu # tell C++ about output directory 3405801Snate@binkert.org core.setOutputDir(options.outdir) 3412889Sbinkertn@umich.edu 3422889Sbinkertn@umich.edu # update the system path with elements from the -p option 3432889Sbinkertn@umich.edu sys.path[0:0] = options.path 3442889Sbinkertn@umich.edu 3452889Sbinkertn@umich.edu # set stats options 34611878Sandreas.sandberg@arm.com stats.addStatVisitor(options.stats_file) 3472889Sbinkertn@umich.edu 34811923Sandreas.sandberg@arm.com # Disable listeners unless running interactively or explicitly 34911923Sandreas.sandberg@arm.com # enabled 35011923Sandreas.sandberg@arm.com if options.listener_mode == "off": 35111923Sandreas.sandberg@arm.com m5.disableAllListeners() 35211923Sandreas.sandberg@arm.com elif options.listener_mode == "auto": 35311923Sandreas.sandberg@arm.com if not isInteractive(): 35411923Sandreas.sandberg@arm.com inform("Standard input is not a terminal, disabling listeners.") 35511923Sandreas.sandberg@arm.com m5.disableAllListeners() 35611923Sandreas.sandberg@arm.com elif options.listener_mode == "on": 35711923Sandreas.sandberg@arm.com pass 35811923Sandreas.sandberg@arm.com else: 35911923Sandreas.sandberg@arm.com panic("Unhandled listener mode: %s" % options.listener_mode) 36011923Sandreas.sandberg@arm.com 36112012Sgabeblack@google.com if options.listener_loopback_only: 36212012Sgabeblack@google.com m5.listenersLoopbackOnly() 36312012Sgabeblack@google.com 3642889Sbinkertn@umich.edu # set debugging options 3655801Snate@binkert.org debug.setRemoteGDBPort(options.remote_gdb_port) 3663645Sbinkertn@umich.edu for when in options.debug_break: 3679960Sandreas.hansson@arm.com debug.schedBreak(int(when)) 3682889Sbinkertn@umich.edu 3698232Snate@binkert.org if options.debug_flags: 37013671Sandreas.sandberg@arm.com _check_tracing() 3714053Sbinkertn@umich.edu 3725586Snate@binkert.org on_flags = [] 3735586Snate@binkert.org off_flags = [] 3748232Snate@binkert.org for flag in options.debug_flags: 3755586Snate@binkert.org off = False 3765586Snate@binkert.org if flag.startswith('-'): 3775586Snate@binkert.org flag = flag[1:] 3785586Snate@binkert.org off = True 3798232Snate@binkert.org 3808232Snate@binkert.org if flag not in debug.flags: 38112563Sgabeblack@google.com print("invalid debug flag '%s'" % flag, file=sys.stderr) 3825586Snate@binkert.org sys.exit(1) 3834053Sbinkertn@umich.edu 3845586Snate@binkert.org if off: 3858232Snate@binkert.org debug.flags[flag].disable() 3865586Snate@binkert.org else: 3878232Snate@binkert.org debug.flags[flag].enable() 3884053Sbinkertn@umich.edu 3899960Sandreas.hansson@arm.com if options.debug_start: 39013671Sandreas.sandberg@arm.com _check_tracing() 3919960Sandreas.hansson@arm.com e = event.create(trace.enable, event.Event.Debug_Enable_Pri) 3929960Sandreas.hansson@arm.com event.mainq.schedule(e, options.debug_start) 3934074Sbinkertn@umich.edu else: 3945799Snate@binkert.org trace.enable() 3954042Sbinkertn@umich.edu 39611338SMichael.Lebeane@amd.com if options.debug_end: 39713671Sandreas.sandberg@arm.com _check_tracing() 39811338SMichael.Lebeane@amd.com e = event.create(trace.disable, event.Event.Debug_Enable_Pri) 39911338SMichael.Lebeane@amd.com event.mainq.schedule(e, options.debug_end) 40011338SMichael.Lebeane@amd.com 4019960Sandreas.hansson@arm.com trace.output(options.debug_file) 4024042Sbinkertn@umich.edu 4039960Sandreas.hansson@arm.com for ignore in options.debug_ignore: 40413671Sandreas.sandberg@arm.com _check_tracing() 4055799Snate@binkert.org trace.ignore(ignore) 4062889Sbinkertn@umich.edu 4072889Sbinkertn@umich.edu sys.argv = arguments 4082889Sbinkertn@umich.edu sys.path = [ os.path.dirname(sys.argv[0]) ] + sys.path 4092891Sbinkertn@umich.edu 4105604Snate@binkert.org filename = sys.argv[0] 41113670Sandreas.sandberg@arm.com filedata = open(filename, 'r').read() 4125604Snate@binkert.org filecode = compile(filedata, filename, 'exec') 4135604Snate@binkert.org scope = { '__file__' : filename, 4143887Sbinkertn@umich.edu '__name__' : '__m5_main__' } 4152899Sbinkertn@umich.edu 4162899Sbinkertn@umich.edu # if pdb was requested, execfile the thing under pdb, otherwise, 4172899Sbinkertn@umich.edu # just do the execfile normally 4182899Sbinkertn@umich.edu if options.pdb: 4195604Snate@binkert.org import pdb 4205604Snate@binkert.org import traceback 4215604Snate@binkert.org 4225604Snate@binkert.org pdb = pdb.Pdb() 4235604Snate@binkert.org try: 4245604Snate@binkert.org pdb.run(filecode, scope) 4255604Snate@binkert.org except SystemExit: 42612563Sgabeblack@google.com print("The program exited via sys.exit(). Exit status: ", end=' ') 42712563Sgabeblack@google.com print(sys.exc_info()[1]) 4285604Snate@binkert.org except: 4295604Snate@binkert.org traceback.print_exc() 43012563Sgabeblack@google.com print("Uncaught exception. Entering post mortem debugging") 4315604Snate@binkert.org t = sys.exc_info()[2] 4325604Snate@binkert.org while t.tb_next is not None: 4335604Snate@binkert.org t = t.tb_next 4345604Snate@binkert.org pdb.interaction(t.tb_frame,t) 4352899Sbinkertn@umich.edu else: 43613671Sandreas.sandberg@arm.com exec(filecode, scope) 4372889Sbinkertn@umich.edu 4382889Sbinkertn@umich.edu # once the script is done 4392889Sbinkertn@umich.edu if options.interactive: 4408219Snate@binkert.org interact(scope) 4412889Sbinkertn@umich.edu 4422889Sbinkertn@umich.eduif __name__ == '__main__': 4432889Sbinkertn@umich.edu from pprint import pprint 4442889Sbinkertn@umich.edu 4458234Snate@binkert.org options, arguments = parse_options() 4468234Snate@binkert.org 44712563Sgabeblack@google.com print('opts:') 4482889Sbinkertn@umich.edu pprint(options, indent=4) 44912563Sgabeblack@google.com print() 4502889Sbinkertn@umich.edu 45112563Sgabeblack@google.com print('args:') 4522889Sbinkertn@umich.edu pprint(arguments, indent=4) 453