From: Steve Reinhardt Date: Fri, 25 Feb 2005 17:41:08 +0000 (-0500) Subject: Fix timing modeling of faults: functionally the very next instruction after X-Git-Tag: m5_1.0_tutorial~82^2~1 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=368882a847955c712c9248eaf0fe569228c8e0fb;p=gem5.git Fix timing modeling of faults: functionally the very next instruction after 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 --- diff --git a/arch/alpha/alpha_memory.cc b/arch/alpha/alpha_memory.cc index 639abbeb8..8f6d7a51a 100644 --- a/arch/alpha/alpha_memory.cc +++ b/arch/alpha/alpha_memory.cc @@ -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; } diff --git a/arch/alpha/isa_traits.hh b/arch/alpha/isa_traits.hh index ff3da1502..8db8c6994 100644 --- a/arch/alpha/isa_traits.hh +++ b/arch/alpha/isa_traits.hh @@ -175,6 +175,9 @@ static const Addr PageOffset = PageBytes - 1; static StaticInstPtr 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 diff --git a/base/traceflags.py b/base/traceflags.py index ef13d9e2a..800c47bd3 100644 --- a/base/traceflags.py +++ b/base/traceflags.py @@ -110,7 +110,7 @@ baseFlags = [ 'IICMore', 'MSHR', 'Chains', - 'Dispatch', + 'Pipeline', 'Stats', 'StatEvents', 'Context', diff --git a/cpu/exetrace.cc b/cpu/exetrace.cc index ff7e90c9e..048a7d283 100644 --- a/cpu/exetrace.cc +++ b/cpu/exetrace.cc @@ -154,7 +154,7 @@ class ExecutionTraceParamContext : public ParamContext ExecutionTraceParamContext exeTraceParams("exetrace"); Param exe_trace_spec(&exeTraceParams, "speculative", - "capture speculative instructions", false); + "capture speculative instructions", true); Param exe_trace_print_cycle(&exeTraceParams, "print_cycle", "print cycle number", true);