X86: Make the TLB fault instead of panic when something is unmapped in SE mode.

The fault object, if invoked, would then panic. This is a bit less direct, but
it means speculative execution won't panic the simulator.
This commit is contained in:
Gabe Black 2010-08-23 09:44:19 -07:00
parent 172e45fc97
commit f6182f948b
3 changed files with 18 additions and 16 deletions

View file

@ -267,6 +267,22 @@ namespace X86ISA
tc->setNextPC(tc->readPC() + sizeof(MachInst));
}
#else
void
PageFault::invoke(ThreadContext * tc)
{
PageFaultErrorCode code = errorCode;
const char *modeStr = "";
if (code.fetch)
modeStr = "execute";
else if (code.write)
modeStr = "write";
else
modeStr = "read";
panic("Tried to %s unmapped address %#x.\n", modeStr, addr);
}
#endif
} // namespace X86ISA

View file

@ -327,9 +327,9 @@ namespace X86ISA
errorCode = code;
}
#if FULL_SYSTEM
void invoke(ThreadContext * tc);
#if FULL_SYSTEM
virtual std::string describe() const;
#endif
};

View file

@ -619,21 +619,7 @@ TLB::translate(RequestPtr req, ThreadContext *tc, Translation *translation,
success = p->pTable->lookup(vaddr, newEntry);
}
if (!success) {
if (req->isPrefetch()) {
return new PageFault(vaddr, true, mode, true, false);
} else {
const char *modeStr = "";
if (mode == Execute)
modeStr = "execute";
else if (mode == Read)
modeStr = "read";
else if (mode == Write)
modeStr = "write";
else
modeStr = "?";
panic("Tried to %s unmapped address %#x.\n",
modeStr, vaddr);
}
return new PageFault(vaddr, true, mode, true, false);
} else {
Addr alignedVaddr = p->pTable->pageAlign(vaddr);
DPRINTF(TLB, "Mapping %#x to %#x\n", alignedVaddr,