56a57
> numSquashable(p->num_squash_per_cycle),
187,189c188,227
< pendingQueue.pop_front();
< pending = true;
< processWalk();
---
>
>
> if (!currState->transState->squashed()) {
> // We've got a valid request, lets process it
> pending = true;
> pendingQueue.pop_front();
> processWalk();
> return;
> }
>
>
> // If the instruction that we were translating for has been
> // squashed we shouldn't bother.
> unsigned num_squashed = 0;
> ThreadContext *tc = currState->tc;
> assert(currState->transState->squashed());
> while ((num_squashed < numSquashable) && currState &&
> currState->transState->squashed()) {
> pendingQueue.pop_front();
> num_squashed++;
>
> DPRINTF(TLB, "Squashing table walk for address %#x\n", currState->vaddr);
>
> // finish the translation which will delete the translation object
> currState->transState->finish(new UnimpFault("Squashed Inst"),
> currState->req, currState->tc, currState->mode);
>
> // delete the current request
> delete currState;
>
> // peak at the next one
> if (pendingQueue.size())
> currState = pendingQueue.front();
> else
> currState = NULL;
> }
>
> // if we've still got pending translations schedule more work
> nextWalk(tc);
> currState = NULL;