Bug fix: can't increment an iterator after you erase
the thing it points to. Somehow Linux doesn't care, but Cygwin sure does. --HG-- extra : convert_revision : 1209a75831f080f17a95433e546d7074f9f07332
This commit is contained in:
parent
809230bbde
commit
39ce4fbaf9
1 changed files with 7 additions and 3 deletions
|
@ -177,6 +177,7 @@ AlphaTLB::insert(Addr addr, AlphaISA::PTE &pte)
|
||||||
void
|
void
|
||||||
AlphaTLB::flushAll()
|
AlphaTLB::flushAll()
|
||||||
{
|
{
|
||||||
|
DPRINTF(TLB, "flushAll\n");
|
||||||
memset(table, 0, sizeof(AlphaISA::PTE[size]));
|
memset(table, 0, sizeof(AlphaISA::PTE[size]));
|
||||||
lookupTable.clear();
|
lookupTable.clear();
|
||||||
nlu = 0;
|
nlu = 0;
|
||||||
|
@ -192,13 +193,16 @@ AlphaTLB::flushProcesses()
|
||||||
AlphaISA::PTE *pte = &table[index];
|
AlphaISA::PTE *pte = &table[index];
|
||||||
assert(pte->valid);
|
assert(pte->valid);
|
||||||
|
|
||||||
|
// we can't increment i after we erase it, so save a copy and
|
||||||
|
// increment it to get the next entry now
|
||||||
|
PageTable::iterator cur = i;
|
||||||
|
++i;
|
||||||
|
|
||||||
if (!pte->asma) {
|
if (!pte->asma) {
|
||||||
DPRINTF(TLB, "flush @%d: %#x -> %#x\n", index, pte->tag, pte->ppn);
|
DPRINTF(TLB, "flush @%d: %#x -> %#x\n", index, pte->tag, pte->ppn);
|
||||||
pte->valid = false;
|
pte->valid = false;
|
||||||
lookupTable.erase(i);
|
lookupTable.erase(cur);
|
||||||
}
|
}
|
||||||
|
|
||||||
++i;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue