arm: Fix TLB ignoring faults when table walking
This patch fixes a case where the Minor CPU can deadlock due to the lack of a response to TLB request because of a bug in fault handling in the ARM table walker. TableWalker::processWalkWrapper is the scheduler-called wrapper which handles deferred walks which calls to TableWalker::wait cannot immediately process. The handling of faults generated by processWalk{AArch64,LPAE,} calls in those two functions is is different. processWalkWrapper ignores fault returns from processWalk... which can lead to ::finish not being called on a translation. This fix provides fault handling in processWalkWrapper similar to that found in the leaf functions which BaseTLB::Translation::finish.
This commit is contained in:
parent
e5e5b80690
commit
3cd0b1f6a6
1 changed files with 13 additions and 3 deletions
|
@ -344,12 +344,22 @@ TableWalker::processWalkWrapper()
|
||||||
// We've got a valid request, lets process it
|
// We've got a valid request, lets process it
|
||||||
pending = true;
|
pending = true;
|
||||||
pendingQueue.pop_front();
|
pendingQueue.pop_front();
|
||||||
|
// Keep currState in case one of the processWalk... calls NULLs it
|
||||||
|
WalkerState *curr_state_copy = currState;
|
||||||
|
Fault f;
|
||||||
if (currState->aarch64)
|
if (currState->aarch64)
|
||||||
processWalkAArch64();
|
f = processWalkAArch64();
|
||||||
else if ((_haveLPAE && currState->ttbcr.eae) || currState->isHyp || isStage2)
|
else if ((_haveLPAE && currState->ttbcr.eae) || currState->isHyp || isStage2)
|
||||||
processWalkLPAE();
|
f = processWalkLPAE();
|
||||||
else
|
else
|
||||||
processWalk();
|
f = processWalk();
|
||||||
|
|
||||||
|
if (f != NoFault) {
|
||||||
|
curr_state_copy->transState->finish(f, curr_state_copy->req,
|
||||||
|
curr_state_copy->tc, curr_state_copy->mode);
|
||||||
|
|
||||||
|
delete curr_state_copy;
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue