188a189,190
> // Check if a previous walk filled this request already
> TlbEntry* te = tlb->lookup(currState->vaddr, currState->contextId, true);
190c192,197
< if (!currState->transState->squashed()) {
---
> // Check if we still need to have a walk for this request. If the requesting
> // instruction has been squashed, or a previous walk has filled the TLB with
> // a match, we just want to get rid of the walk. The latter could happen
> // when there are multiple outstanding misses to a single page and a
> // previous request has been successfully translated.
> if (!currState->transState->squashed() && !te) {
203d209
< assert(currState->transState->squashed());
205c211
< currState->transState->squashed()) {
---
> (currState->transState->squashed() || te)) {
211,213c217,225
< // finish the translation which will delete the translation object
< currState->transState->finish(new UnimpFault("Squashed Inst"),
< currState->req, currState->tc, currState->mode);
---
> if (currState->transState->squashed()) {
> // finish the translation which will delete the translation object
> currState->transState->finish(new UnimpFault("Squashed Inst"),
> currState->req, currState->tc, currState->mode);
> } else {
> // translate the request now that we know it will work
> currState->fault = tlb->translateTiming(currState->req, currState->tc,
> currState->transState, currState->mode);
> }
219c231
< if (pendingQueue.size())
---
> if (pendingQueue.size()) {
221c233,235
< else
---
> te = tlb->lookup(currState->vaddr, currState->contextId, true);
> } else {
> // Terminate the loop, nothing more to do
222a237
> }