TLB: comments and a helpful warning.
authorLisa Hsu <Lisa.Hsu@amd.com>
Sat, 3 Sep 2011 00:04:00 +0000 (17:04 -0700)
committerLisa Hsu <Lisa.Hsu@amd.com>
Sat, 3 Sep 2011 00:04:00 +0000 (17:04 -0700)
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
src/sim/process.cc

index 199f070d310fef53199b4fd16f16a0ed0b6c65f0..d2cd5eaee2ddc2adeb25f0c2ed0ffd6675f7a74d 100644 (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);
index 28142d7317a107d9e13885793cb146703f7f6c65..bec33c70b9e937a748f9883899b9b72add57635d 100644 (file)
@@ -351,6 +351,7 @@ Process::checkAndAllocNextPage(Addr vaddr)
         };
         return true;
     }
+    warn("Not increasing stack: requested vaddr is outside of stack range.");
     return false;
 }