checkpoint.py revision 10751:11d4a587d43a
1# Copyright (c) 2015 ARM Limited 2# All rights reserved. 3# 4# The license below extends only to copyright in the software and shall 5# not be construed as granting a license to any other intellectual 6# property including but not limited to intellectual property relating 7# to a hardware implementation of the functionality of the software 8# licensed hereunder. You may use the software subject to the license 9# terms below provided that you ensure that this notice is replicated 10# unmodified and in its entirety in all distributions of the software, 11# modified or unmodified, in source code or in binary form. 12# 13# Redistribution and use in source and binary forms, with or without 14# modification, are permitted provided that the following conditions are 15# met: redistributions of source code must retain the above copyright 16# notice, this list of conditions and the following disclaimer; 17# redistributions in binary form must reproduce the above copyright 18# notice, this list of conditions and the following disclaimer in the 19# documentation and/or other materials provided with the distribution; 20# neither the name of the copyright holders nor the names of its 21# contributors may be used to endorse or promote products derived from 22# this software without specific prior written permission. 23# 24# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 25# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 26# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 27# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 28# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 29# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 30# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 31# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 32# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 33# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 34# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 35# 36# Authors: Andreas Sandberg 37 38from multiprocessing import Process 39import sys 40import os 41 42import m5 43m5.util.addToPath('../configs/common') 44 45_exit_normal = ( 46 "target called exit()", 47 "m5_exit instruction encountered", 48 ) 49 50_exit_limit = ( 51 "simulate() limit reached", 52 ) 53 54_exitcode_done = 0 55_exitcode_fail = 1 56_exitcode_checkpoint = 42 57 58 59def _run_step(name, restore=None, interval=0.5): 60 """ 61 Instantiate (optionally from a checkpoint if restore is set to the 62 checkpoitn name) the system and run for interval seconds of 63 simulated time. At the end of the simulation interval, create a 64 checkpoint and exit. 65 66 As this function is intended to run in its own process using the 67 multiprocessing framework, the exit is a true call to exit which 68 terminates the process. Exit codes are used to pass information to 69 the parent. 70 """ 71 if restore is not None: 72 m5.instantiate(restore) 73 else: 74 m5.instantiate() 75 76 e = m5.simulate(m5.ticks.fromSeconds(interval)) 77 cause = e.getCause() 78 if cause in _exit_limit: 79 m5.checkpoint(name) 80 sys.exit(_exitcode_checkpoint) 81 elif cause in _exit_normal: 82 sys.exit(_exitcode_done) 83 else: 84 print "Test failed: Unknown exit cause: %s" % cause 85 sys.exit(_exitcode_fail) 86 87def run_test(root, interval=0.5, max_checkpoints=5): 88 """ 89 Run the simulated system for a fixed amount of time and take a 90 checkpoint, then restore from the same checkpoint and run until 91 the system calls m5 exit. 92 """ 93 94 cpt_name = os.path.join(m5.options.outdir, "test.cpt") 95 restore = None 96 97 for cpt_no in range(max_checkpoints): 98 # Create a checkpoint from a separate child process. This enables 99 # us to get back to a (mostly) pristine state and restart 100 # simulation from the checkpoint. 101 p = Process(target=_run_step, 102 args=(cpt_name, ), 103 kwargs={ 104 "restore" : restore, 105 "interval" : interval, 106 }) 107 p.start() 108 109 # Wait for the child to return 110 p.join() 111 112 # Restore from the checkpoint next iteration 113 restore = cpt_name 114 115 if p.exitcode == _exitcode_done: 116 print >> sys.stderr, "Test done." 117 sys.exit(0) 118 elif p.exitcode == _exitcode_checkpoint: 119 pass 120 else: 121 print >> sys.stderr, "Test failed." 122 sys.exit(1) 123 124 # Maximum number of checkpoints reached. Just run full-speed from 125 # now on. 126 m5.instantiate() 127 e = m5.simulate() 128 cause = e.getCause() 129 if cause in _exit_normal: 130 sys.exit(0) 131 else: 132 print "Test failed: Unknown exit cause: %s" % cause 133 sys.exit(1) 134