Change how Page Faults work in SPARC. It now prints the faulting address, and panics...
authorGabe Black <gblack@eecs.umich.edu>
Thu, 7 Dec 2006 23:43:55 +0000 (18:43 -0500)
committerGabe Black <gblack@eecs.umich.edu>
Thu, 7 Dec 2006 23:43:55 +0000 (18:43 -0500)
--HG--
extra : convert_revision : 3b14c99edaf649e0809977c9579afb2b7b0d72e9

src/arch/sparc/faults.cc

index 67920a3d18ec239afeb0e8a1d642c2be5d7212ac..4326e8b67a9e9f9caac13ea4113d3468be529a17 100644 (file)
@@ -690,19 +690,21 @@ void PageTableFault::invoke(ThreadContext *tc)
 {
     Process *p = tc->getProcessPtr();
 
-    // address is higher than the stack region or in the current stack region
-    if (vaddr > p->stack_base || vaddr > p->stack_min)
-        FaultBase::invoke(tc);
-
-    // We've accessed the next page
-    if (vaddr > p->stack_min - PageBytes) {
+    // We've accessed the next page of the stack, so extend the stack
+    // to cover it.
+    if(vaddr < p->stack_min && vaddr >= p->stack_min - PageBytes)
+    {
         p->stack_min -= PageBytes;
-        if (p->stack_base - p->stack_min > 8*1024*1024)
+        if(p->stack_base - p->stack_min > 8*1024*1024)
             fatal("Over max stack size for one thread\n");
         p->pTable->allocate(p->stack_min, PageBytes);
         warn("Increasing stack size by one page.");
-    } else {
-        FaultBase::invoke(tc);
+    }
+    // Otherwise, we have an unexpected page fault. Report that fact,
+    // and what address was accessed to cause the fault.
+    else
+    {
+        panic("Page table fault when accessing virtual address %#x\n", vaddr);
     }
 }