ARM: Fix bug that let two table walks occur in parallel.
This commit is contained in:
parent
f05f35df99
commit
ae3d456855
3 changed files with 8 additions and 6 deletions
|
@ -141,12 +141,12 @@ TableWalker::walk(RequestPtr _req, ThreadContext *_tc, uint8_t _cid, TLB::Mode _
|
|||
if (!currState->timing)
|
||||
return processWalk();
|
||||
|
||||
if (pending) {
|
||||
if (pending || pendingQueue.size()) {
|
||||
pendingQueue.push_back(currState);
|
||||
currState = NULL;
|
||||
} else {
|
||||
pending = true;
|
||||
processWalk();
|
||||
return processWalk();
|
||||
}
|
||||
|
||||
return NoFault;
|
||||
|
@ -194,10 +194,8 @@ TableWalker::processWalk()
|
|||
f = tlb->walkTrickBoxCheck(l1desc_addr, currState->vaddr, sizeof(uint32_t),
|
||||
currState->isFetch, currState->isWrite, 0, true);
|
||||
if (f) {
|
||||
DPRINTF(TLB, "Trickbox check caused fault on %#x\n", currState->vaddr);
|
||||
if (currState->timing) {
|
||||
currState->transState->finish(f, currState->req,
|
||||
currState->tc, currState->mode);
|
||||
|
||||
pending = false;
|
||||
nextWalk(currState->tc);
|
||||
currState = NULL;
|
||||
|
|
|
@ -529,7 +529,7 @@ TLB::translateFs(RequestPtr req, ThreadContext *tc, Mode mode,
|
|||
vaddr, contextId);
|
||||
fault = tableWalker->walk(req, tc, contextId, mode, translation,
|
||||
timing);
|
||||
if (timing) {
|
||||
if (timing && fault == NoFault) {
|
||||
delay = true;
|
||||
// for timing mode, return and wait for table walk
|
||||
return fault;
|
||||
|
@ -694,6 +694,8 @@ TLB::translateTiming(RequestPtr req, ThreadContext *tc,
|
|||
#else
|
||||
fault = translateSe(req, tc, mode, translation, delay, true);
|
||||
#endif
|
||||
DPRINTF(TLB, "Translation returning delay=%d fault=%d\n", delay, fault !=
|
||||
NoFault);
|
||||
if (!delay)
|
||||
translation->finish(fault, req, tc, mode);
|
||||
else
|
||||
|
|
|
@ -1142,6 +1142,8 @@ DefaultCommit<Impl>::commitHead(DynInstPtr &head_inst, unsigned inst_num)
|
|||
|
||||
commitStatus[tid] = TrapPending;
|
||||
|
||||
DPRINTF(Commit, "Committing instruction with fault [sn:%lli]\n",
|
||||
head_inst->seqNum);
|
||||
if (head_inst->traceData) {
|
||||
if (DTRACE(ExecFaulting)) {
|
||||
head_inst->traceData->setFetchSeq(head_inst->seqNum);
|
||||
|
|
Loading…
Reference in a new issue