Fix timing modeling of faults: functionally the very next instruction after
authorSteve Reinhardt <stever@eecs.umich.edu>
Fri, 25 Feb 2005 17:41:08 +0000 (12:41 -0500)
committerSteve Reinhardt <stever@eecs.umich.edu>
Fri, 25 Feb 2005 17:41:08 +0000 (12:41 -0500)
a faulting instruction is the fault handler, which appears as an independent
instruction to the timing model.  New code will stall fetch and not fetch the
fault handler as long as there's a faulting instruction in the pipeline (i.e.,
the faulting inst has to commit first).

Also fix Ali's bad-address assertion that doesn't apply to full system.

Added some more debugging support in the process.  Hopefully we'll move to the new
cpu model soon and we won't need it anymore.

arch/alpha/alpha_memory.cc:
    Reorganize lookup() so we can trace the result of the lookup as well.
arch/alpha/isa_traits.hh:
    Add NoopMachInst (so we can insert them in the pipeline on ifetch faults).
base/traceflags.py:
    Replace "Dispatch" flag with "Pipeline" (since I added similar
    DPRINTFs in other pipe stages).
cpu/exetrace.cc:
    Change default for printing mis-speculated instructions to true (since
    that's often what we want, and right now you can't change it from the
    command line...).

--HG--
extra : convert_revision : a29a98a373076d62bbbb1d6f40ba51ecae436dbc

arch/alpha/alpha_memory.cc
arch/alpha/isa_traits.hh
base/traceflags.py
cpu/exetrace.cc

index 639abbeb8eb3fc9dbdf9c9fea716795e4c494e16..8f6d7a51a97a6b04acea8b6646c50e3aeb221e43 100644 (file)
@@ -68,24 +68,27 @@ AlphaTLB::~AlphaTLB()
 AlphaISA::PTE *
 AlphaTLB::lookup(Addr vpn, uint8_t asn) const
 {
-    DPRINTF(TLB, "lookup %#x, asn %#x\n", vpn, (int)asn);
+    // assume not found...
+    AlphaISA::PTE *retval = NULL;
 
     PageTable::const_iterator i = lookupTable.find(vpn);
-    if (i == lookupTable.end())
-        return NULL;
-
-    while (i->first == vpn) {
-        int index = i->second;
-        AlphaISA::PTE *pte = &table[index];
-        assert(pte->valid);
-        if (vpn == pte->tag && (pte->asma || pte->asn == asn))
-            return pte;
+    if (i != lookupTable.end()) {
+        while (i->first == vpn) {
+            int index = i->second;
+            AlphaISA::PTE *pte = &table[index];
+            assert(pte->valid);
+            if (vpn == pte->tag && (pte->asma || pte->asn == asn)) {
+                retval = pte;
+                break;
+            }
 
-        ++i;
+            ++i;
+        }
     }
 
-    // not found...
-    return NULL;
+    DPRINTF(TLB, "lookup %#x, asn %#x -> %s ppn %#x\n", vpn, (int)asn,
+            retval ? "hit" : "miss", retval ? retval->ppn : 0);
+    return retval;
 }
 
 
index ff3da1502ad89f340f0c8a1de2140d46ecddc4ca..8db8c699405409ac87f415e5750a89678cfa0210 100644 (file)
@@ -175,6 +175,9 @@ static const Addr PageOffset = PageBytes - 1;
 
     static StaticInstPtr<AlphaISA> decodeInst(MachInst);
 
+    // return a no-op instruction... used for instruction fetch faults
+    static const MachInst NoopMachInst;
+
     enum annotes {
         ANNOTE_NONE = 0,
         // An impossible number for instruction annotations
index ef13d9e2a3b19ff4dc4eeb600451c7981c41891e..800c47bd3f181468effc6808a01c713a927e35e6 100644 (file)
@@ -110,7 +110,7 @@ baseFlags = [
     'IICMore',
     'MSHR',
     'Chains',
-    'Dispatch',
+    'Pipeline',
     'Stats',
     'StatEvents',
     'Context',
index ff7e90c9ec670e79bb0be5a2a63584f469de9e41..048a7d283f7a2eecdb14b07f1f427ec80d6d9a91 100644 (file)
@@ -154,7 +154,7 @@ class ExecutionTraceParamContext : public ParamContext
 ExecutionTraceParamContext exeTraceParams("exetrace");
 
 Param<bool> exe_trace_spec(&exeTraceParams, "speculative",
-                           "capture speculative instructions", false);
+                           "capture speculative instructions", true);
 
 Param<bool> exe_trace_print_cycle(&exeTraceParams, "print_cycle",
                                   "print cycle number", true);