util: add m5_fail op.
authorLluís Vilanova <vilanova@ac.upc.edu>
Tue, 8 Jan 2013 13:54:12 +0000 (08:54 -0500)
committerLluís Vilanova <vilanova@ac.upc.edu>
Tue, 8 Jan 2013 13:54:12 +0000 (08:54 -0500)
Used as a command in full-system scripts helps the user ensure the benchmarks have finished successfully.

For example, one can use:

    /path/to/benchmark args || /sbin/m5 fail 1

and thus ensure gem5 will exit with an error if the benchmark fails.

configs/common/Simulation.py
src/arch/x86/isa/decoder/two_byte_opcodes.isa
src/sim/pseudo_inst.cc
src/sim/pseudo_inst.hh
util/m5/m5.c
util/m5/m5op.h
util/m5/m5op_x86.S
util/m5/m5ops.h

index ea5949efcc94315880360631c5f0fb204efebfb8..406f9ef0ffe37465ffa1bf7b109e7336bb05a536 100644 (file)
@@ -27,6 +27,7 @@
 #
 # Authors: Lisa Hsu
 
+import sys
 from os import getcwd
 from os.path import join as joinpath
 
@@ -505,3 +506,5 @@ def run(options, root, testsys, cpu_class):
     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())
index 3b187d625d37b583539083d022e62ff9bb33edb8..711be0bd58c469d0ccca09c5fe23b6b82aa3c494 100644 (file)
                         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);
index aafa5672bc07b20f0dbf8f28fe3382dabf1c6027..a57bdb2cec78f02d687de99463cbf4ec2e602787 100644 (file)
@@ -218,6 +218,13 @@ m5exit(ThreadContext *tc, Tick delay)
     exitSimLoop("m5_exit instruction encountered", 0, when);
 }
 
+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)
 {
index 4a6493a668f21d2a8e4957a851a7a737dd19a24f..efcd44a69f3f5c59cd5e65d51fd193b2536dbb20 100644 (file)
@@ -54,6 +54,7 @@ uint64_t initParam(ThreadContext *xc);
 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);
index e9fe8f1f32f05a9298d1d3229919bbb80ee40edf..021816ce37d7767e5f0018cdbc6280b707aab2cd 100644 (file)
@@ -134,6 +134,15 @@ do_exit(int argc, char *argv[])
     m5_exit(ints[0]);
 }
 
+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[])
 {
@@ -273,6 +282,7 @@ struct MainFunc
 
 struct MainFunc mainfuncs[] = {
     { "exit",           do_exit,             "[delay]" },
+    { "fail",           do_fail,             "<code> [delay]" },
     { "resetstats",     do_reset_stats,      "[delay [period]]" },
     { "dumpstats",      do_dump_stats,       "[delay [period]]" },
     { "dumpresetstats", do_dump_reset_stats, "[delay [period]]" },
index 9e693258ec335deb5bb0e2557c39591964d21ceb..9df9a7429f6aca7c5476a20197ee074d28b765f7 100644 (file)
@@ -47,6 +47,7 @@ uint64_t rpns();
 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);
index 93eacc24d5dba038e2411bbb2ad9cccc6e34c7f4..2c25785e60bc2ff91fabcb0e5baccb4b6f3575c3 100644 (file)
@@ -48,6 +48,7 @@ TWO_BYTE_OP(quiesceCycle, quiescecycle_func)
 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)
index f08524014bd4862569652ed7cf2f69bae02c0a50..8ff1ac42f1a4f7964917ed64dabe75fcb2cc5223 100644 (file)
@@ -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