diff -r f634a34f2f0b -r 4f6f5fa237a3 configs/common/Simulation.py --- a/configs/common/Simulation.py Tue Oct 23 04:49:48 2012 -0400 +++ b/configs/common/Simulation.py Tue Oct 23 20:36:13 2012 +0200 @@ -27,6 +27,7 @@ # # Authors: Lisa Hsu +import sys from os import getcwd from os.path import join as joinpath @@ -506,3 +507,5 @@ print 'Exiting @ tick %i because %s' % (m5.curTick(), exit_cause) if options.checkpoint_at_end: m5.checkpoint(joinpath(cptdir, "cpt.%d")) + + sys.exit(exit_event.getCode()) diff -r f634a34f2f0b -r 4f6f5fa237a3 src/arch/x86/isa/decoder/two_byte_opcodes.isa --- a/src/arch/x86/isa/decoder/two_byte_opcodes.isa Tue Oct 23 04:49:48 2012 -0400 +++ b/src/arch/x86/isa/decoder/two_byte_opcodes.isa Tue Oct 23 20:36:13 2012 +0200 @@ -157,6 +157,9 @@ 0x21: m5exit({{ PseudoInst::m5exit(xc->tcBase(), Rdi); }}, IsNonSpeculative); + 0x22: m5fail({{ + PseudoInst::m5fail(xc->tcBase(), Rdi, Rsi); + }}, IsNonSpeculative); 0x30: m5initparam({{ Rax = PseudoInst::initParam(xc->tcBase()); }}, IsNonSpeculative); diff -r f634a34f2f0b -r 4f6f5fa237a3 src/sim/pseudo_inst.hh --- a/src/sim/pseudo_inst.hh Tue Oct 23 04:49:48 2012 -0400 +++ b/src/sim/pseudo_inst.hh Tue Oct 23 20:36:13 2012 +0200 @@ -61,6 +61,7 @@ uint64_t rpns(ThreadContext *tc); void wakeCPU(ThreadContext *tc, uint64_t cpuid); void m5exit(ThreadContext *tc, Tick delay); +void m5fail(ThreadContext *tc, Tick delay, uint64_t code); void resetstats(ThreadContext *tc, Tick delay, Tick period); void dumpstats(ThreadContext *tc, Tick delay, Tick period); void dumpresetstats(ThreadContext *tc, Tick delay, Tick period); diff -r f634a34f2f0b -r 4f6f5fa237a3 src/sim/pseudo_inst.cc --- a/src/sim/pseudo_inst.cc Tue Oct 23 04:49:48 2012 -0400 +++ b/src/sim/pseudo_inst.cc Tue Oct 23 20:36:13 2012 +0200 @@ -219,6 +219,13 @@ } void +m5fail(ThreadContext *tc, Tick delay, uint64_t code) +{ + Tick when = curTick() + delay * SimClock::Int::ns; + exitSimLoop("m5_fail instruction encountered", code, when); +} + +void loadsymbol(ThreadContext *tc) { if (!FullSystem) diff -r f634a34f2f0b -r 4f6f5fa237a3 util/m5/m5.c --- a/util/m5/m5.c Tue Oct 23 04:49:48 2012 -0400 +++ b/util/m5/m5.c Tue Oct 23 20:36:13 2012 +0200 @@ -135,6 +135,15 @@ } void +do_fail(int argc, char *argv[]) +{ + if (argc < 1 || argc > 2) + usage(); + + m5_fail((argc > 1) ? strtoul(argv[1], NULL, 0) : 0, strtoul(argv[0], NULL, 0)); +} + +void do_reset_stats(int argc, char *argv[]) { uint64_t ints[2]; @@ -273,6 +282,7 @@ struct MainFunc mainfuncs[] = { { "exit", do_exit, "[delay]" }, + { "fail", do_fail, " [delay]" }, { "resetstats", do_reset_stats, "[delay [period]]" }, { "dumpstats", do_dump_stats, "[delay [period]]" }, { "dumpresetstats", do_dump_reset_stats, "[delay [period]]" }, diff -r f634a34f2f0b -r 4f6f5fa237a3 util/m5/m5op.h --- a/util/m5/m5op.h Tue Oct 23 04:49:48 2012 -0400 +++ b/util/m5/m5op.h Tue Oct 23 20:36:13 2012 +0200 @@ -43,6 +43,7 @@ void wakeCPU(uint64_t cpuid); void m5_exit(uint64_t ns_delay); +void m5_fail(uint64_t ns_delay, uint64_t code); uint64_t m5_initparam(void); void m5_checkpoint(uint64_t ns_delay, uint64_t ns_period); void m5_reset_stats(uint64_t ns_delay, uint64_t ns_period); diff -r f634a34f2f0b -r 4f6f5fa237a3 util/m5/m5op_x86.S --- a/util/m5/m5op_x86.S Tue Oct 23 04:49:48 2012 -0400 +++ b/util/m5/m5op_x86.S Tue Oct 23 20:36:13 2012 +0200 @@ -48,6 +48,7 @@ TWO_BYTE_OP(quiesceTime, quiescetime_func) TWO_BYTE_OP(rpns, rpns_func) TWO_BYTE_OP(m5_exit, exit_func) +TWO_BYTE_OP(m5_fail, fail_func) TWO_BYTE_OP(m5_initparam, initparam_func) TWO_BYTE_OP(m5_loadsymbol, loadsymbol_func) TWO_BYTE_OP(m5_reset_stats, resetstats_func) diff -r f634a34f2f0b -r 4f6f5fa237a3 util/m5/m5ops.h --- a/util/m5/m5ops.h Tue Oct 23 04:49:48 2012 -0400 +++ b/util/m5/m5ops.h Tue Oct 23 20:36:13 2012 +0200 @@ -40,6 +40,7 @@ #define deprecated2_func 0x11 // obsolete ivle #define deprecated3_func 0x20 // deprecated exit function #define exit_func 0x21 +#define fail_func 0x22 #define initparam_func 0x30 #define loadsymbol_func 0x31 #define resetstats_func 0x40