summaryrefslogtreecommitdiff
path: root/cpu/checker/cpu.cc
diff options
context:
space:
mode:
Diffstat (limited to 'cpu/checker/cpu.cc')
-rw-r--r--cpu/checker/cpu.cc30
1 files changed, 26 insertions, 4 deletions
diff --git a/cpu/checker/cpu.cc b/cpu/checker/cpu.cc
index 41ff6e769..f195c8842 100644
--- a/cpu/checker/cpu.cc
+++ b/cpu/checker/cpu.cc
@@ -78,6 +78,7 @@ CheckerCPU::CheckerCPU(Params *p)
changedPC = willChangePC = changedNextPC = false;
exitOnError = p->exitOnError;
+ updateOnError = p->updateOnError;
#if FULL_SYSTEM
itb = p->itb;
dtb = p->dtb;
@@ -350,7 +351,12 @@ CheckerCPU::translateDataReadReq(MemReqPtr &req)
{
cpuXC->translateDataReadReq(req);
- if (req->vaddr != unverifiedReq->vaddr) {
+ if (!unverifiedReq) {
+ warn("%lli: Request virtual addresses do not match! Inst: N/A, "
+ "checker: %#x",
+ curTick, req->vaddr);
+ return;
+ } else if (req->vaddr != unverifiedReq->vaddr) {
warn("%lli: Request virtual addresses do not match! Inst: %#x, "
"checker: %#x",
curTick, unverifiedReq->vaddr, req->vaddr);
@@ -370,7 +376,12 @@ CheckerCPU::translateDataWriteReq(MemReqPtr &req)
{
cpuXC->translateDataWriteReq(req);
- if (req->vaddr != unverifiedReq->vaddr) {
+ if (!unverifiedReq) {
+ warn("%lli: Request virtual addresses do not match! Inst: N/A, "
+ "checker: %#x",
+ curTick, req->vaddr);
+ return;
+ } else if (req->vaddr != unverifiedReq->vaddr) {
warn("%lli: Request virtual addresses do not match! Inst: %#x, "
"checker: %#x",
curTick, unverifiedReq->vaddr, req->vaddr);
@@ -443,6 +454,8 @@ Checker<DynInstPtr>::tick(DynInstPtr &completed_inst)
}
}
+ unverifiedInst = inst;
+
// Try to check all instructions that are completed, ending if we
// run out of instructions to check or if an instruction is not
// yet completed.
@@ -516,7 +529,7 @@ Checker<DynInstPtr>::tick(DynInstPtr &completed_inst)
cpuXC->setPC(cpuXC->readNextPC());
cpuXC->setNextPC(cpuXC->readNextPC() + sizeof(MachInst));
- return;
+ break;
} else {
// The instruction is carrying an ITB fault. Handle
// the fault and see if our results match the CPU on
@@ -554,7 +567,8 @@ Checker<DynInstPtr>::tick(DynInstPtr &completed_inst)
cpuXC->func_exe_inst++;
- fault = curStaticInst->execute(this, NULL);
+ if (!inst->isUnverifiable())
+ fault = curStaticInst->execute(this, NULL);
// Checks to make sure instrution results are correct.
validateExecution(inst);
@@ -620,6 +634,7 @@ Checker<DynInstPtr>::tick(DynInstPtr &completed_inst)
break;
}
}
+ unverifiedInst = NULL;
}
template <class DynInstPtr>
@@ -718,6 +733,13 @@ template <class DynInstPtr>
void
Checker<DynInstPtr>::validateState()
{
+ if (updateThisCycle) {
+ warn("%lli: Instruction PC %#x results didn't match up, copying all "
+ "registers from main CPU", unverifiedInst->readPC());
+ // Heavy-weight copying of all registers
+ cpuXC->copyArchRegs(unverifiedInst->xcBase());
+ updateThisCycle = false;
+ }
}
template <class DynInstPtr>