17920SBrad.Beckmann@amd.com#!/bin/sh
27920SBrad.Beckmann@amd.com
37920SBrad.Beckmann@amd.com#
47920SBrad.Beckmann@amd.com# This is a tricky script to understand. When run in M5, it creates
57920SBrad.Beckmann@amd.com# a checkpoint after Linux boot up, but before any benchmarks have
67920SBrad.Beckmann@amd.com# been run. By playing around with environment variables, we can
77920SBrad.Beckmann@amd.com# detect whether the checkpoint has been taken.
87920SBrad.Beckmann@amd.com#  - If the checkpoint hasn't been taken, the script allows M5 to checkpoint the system,
97920SBrad.Beckmann@amd.com# re-read this script into a new tmp file, and re-run it. On the
107920SBrad.Beckmann@amd.com# second execution of this script (checkpoint has been taken), the
117920SBrad.Beckmann@amd.com# environment variable is already set, so the script will exit the
127920SBrad.Beckmann@amd.com# simulation
137920SBrad.Beckmann@amd.com#  - When we restore the simulation from a checkpoint, we can
147920SBrad.Beckmann@amd.com# specify a new script for M5 to execute in the full-system simulation,
157920SBrad.Beckmann@amd.com# and it will be executed as if a checkpoint had just been taken.
167920SBrad.Beckmann@amd.com#
177920SBrad.Beckmann@amd.com# Author:
187920SBrad.Beckmann@amd.com#   Joel Hestness, hestness@cs.utexas.edu
197920SBrad.Beckmann@amd.com#   while at AMD Research and Advanced Development Lab
207920SBrad.Beckmann@amd.com# Date:
217920SBrad.Beckmann@amd.com#   10/5/2010
227920SBrad.Beckmann@amd.com#
237920SBrad.Beckmann@amd.com
247920SBrad.Beckmann@amd.com# Test if the RUNSCRIPT_VAR environment variable is already set
257920SBrad.Beckmann@amd.comif [ "${RUNSCRIPT_VAR+set}" != set ]
267920SBrad.Beckmann@amd.comthen
277920SBrad.Beckmann@amd.com	# Signal our future self that it's safe to continue
287920SBrad.Beckmann@amd.com	export RUNSCRIPT_VAR=1
297920SBrad.Beckmann@amd.comelse
307920SBrad.Beckmann@amd.com	# We've already executed once, so we should exit
317920SBrad.Beckmann@amd.com	/sbin/m5 exit
327920SBrad.Beckmann@amd.comfi
337920SBrad.Beckmann@amd.com
347920SBrad.Beckmann@amd.com# Checkpoint the first execution
357920SBrad.Beckmann@amd.comecho "Checkpointing simulation..."
367920SBrad.Beckmann@amd.com/sbin/m5 checkpoint
377920SBrad.Beckmann@amd.com
387920SBrad.Beckmann@amd.com# Test if we previously okayed ourselves to run this script
397920SBrad.Beckmann@amd.comif [ "$RUNSCRIPT_VAR" -eq 1 ]
407920SBrad.Beckmann@amd.comthen
417920SBrad.Beckmann@amd.com
427920SBrad.Beckmann@amd.com	# Signal our future self not to recurse infinitely
437920SBrad.Beckmann@amd.com	export RUNSCRIPT_VAR=2
447920SBrad.Beckmann@amd.com
457920SBrad.Beckmann@amd.com	# Read the script for the checkpoint restored execution
467920SBrad.Beckmann@amd.com	echo "Loading new script..."
477920SBrad.Beckmann@amd.com	/sbin/m5 readfile > /tmp/runscript
487920SBrad.Beckmann@amd.com	chmod 755 /tmp/runscript
497920SBrad.Beckmann@amd.com
507920SBrad.Beckmann@amd.com	# Execute the new runscript
517920SBrad.Beckmann@amd.com	if [ -s /tmp/runscript ]
527920SBrad.Beckmann@amd.com	then
537920SBrad.Beckmann@amd.com		exec /tmp/runscript
547920SBrad.Beckmann@amd.com	else
557920SBrad.Beckmann@amd.com		echo "Script not specified. Dropping into shell..."
567920SBrad.Beckmann@amd.com		/bin/bash
577920SBrad.Beckmann@amd.com	fi
587920SBrad.Beckmann@amd.com
597920SBrad.Beckmann@amd.comfi
607920SBrad.Beckmann@amd.com
617920SBrad.Beckmann@amd.comecho "Fell through script. Exiting..."
627920SBrad.Beckmann@amd.com/sbin/m5 exit
63