TLB: comments and a helpful warning.

Nothing big here, but when you have an address that is not in the page table request to be allocated, if it falls outside of the maximum stack range all you get is a page fault and you don't know why.  Add a little warn() to explain it a bit.  Also add some comments and alter logic a little so that you don't totally ignore the return value of checkAndAllocNextPage().
This commit is contained in:
Lisa Hsu 2011-09-02 17:04:00 -07:00
parent f6a2ef22ff
commit 365966304e
2 changed files with 17 additions and 2 deletions

View file

@ -618,8 +618,22 @@ TLB::translate(RequestPtr req, ThreadContext *tc, Translation *translation,
TlbEntry newEntry;
bool success = p->pTable->lookup(vaddr, newEntry);
if (!success && mode != Execute) {
p->checkAndAllocNextPage(vaddr);
success = p->pTable->lookup(vaddr, newEntry);
// This may fail because for some reason the requested
// address is not allocatable on the stack. If it's a stack
// address, then it's because the address fell outside of
// max stack range and user should increase max size of
// stack. Otherwise, it could be a random address that was
// not in the page table and not on the stack. Either way,
// you'll end up with a page fault.
if (p->checkAndAllocNextPage(vaddr))
// Might as well not check this if you failed to
// allocate. Partially nested this just so code
// maintainers can understand this is a separate and
// necessary step not sufficient just by reading return
// value of checkAndAlloc call because there is a side
// effect. This call will populate (it's called by
// reference).
success = p->pTable->lookup(vaddr, newEntry);
}
if (!success) {
return new PageFault(vaddr, true, mode, true, false);

View file

@ -351,6 +351,7 @@ Process::checkAndAllocNextPage(Addr vaddr)
};
return true;
}
warn("Not increasing stack: requested vaddr is outside of stack range.");
return false;
}