From 365966304e37d05f5e9e1f987a5956d55ea5f2c7 Mon Sep 17 00:00:00 2001 From: Lisa Hsu Date: Fri, 2 Sep 2011 17:04:00 -0700 Subject: [PATCH] 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(). --- src/arch/x86/tlb.cc | 18 ++++++++++++++++-- src/sim/process.cc | 1 + 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/arch/x86/tlb.cc b/src/arch/x86/tlb.cc index 199f070d3..d2cd5eaee 100644 --- a/src/arch/x86/tlb.cc +++ b/src/arch/x86/tlb.cc @@ -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); diff --git a/src/sim/process.cc b/src/sim/process.cc index 28142d731..bec33c70b 100644 --- a/src/sim/process.cc +++ b/src/sim/process.cc @@ -351,6 +351,7 @@ Process::checkAndAllocNextPage(Addr vaddr) }; return true; } + warn("Not increasing stack: requested vaddr is outside of stack range."); return false; } -- 2.30.2