summaryrefslogtreecommitdiff
path: root/src/sim/faults.cc
diff options
context:
space:
mode:
authorGabe Black <gblack@eecs.umich.edu>2007-03-07 20:04:46 +0000
committerGabe Black <gblack@eecs.umich.edu>2007-03-07 20:04:46 +0000
commit54fc750924ebeeb34d598018b664a886cc3f7ac5 (patch)
tree87f21e528a20ac3d44540922a1ebc0e7df3e9389 /src/sim/faults.cc
parent8edc9d79cee3edd6d16a8254a0180aaa242974c7 (diff)
downloadgem5-54fc750924ebeeb34d598018b664a886cc3f7ac5.tar.xz
Move the magic m5 PageTableFault into sim/faults.[hh,cc] since it's the same across all architectures.
--HG-- extra : convert_revision : 18d441eb7ac44df4df41771bfe3dec69f7fa70ec
Diffstat (limited to 'src/sim/faults.cc')
-rw-r--r--src/sim/faults.cc27
1 files changed, 26 insertions, 1 deletions
diff --git a/src/sim/faults.cc b/src/sim/faults.cc
index cea35482a..7aa3ec4a1 100644
--- a/src/sim/faults.cc
+++ b/src/sim/faults.cc
@@ -29,10 +29,13 @@
* Gabe Black
*/
+#include "arch/isa_traits.hh"
#include "base/misc.hh"
-#include "sim/faults.hh"
#include "cpu/thread_context.hh"
#include "cpu/base.hh"
+#include "sim/faults.hh"
+#include "sim/process.hh"
+#include "mem/page_table.hh"
#if !FULL_SYSTEM
void FaultBase::invoke(ThreadContext * tc)
@@ -53,3 +56,25 @@ void UnimpFault::invoke(ThreadContext * tc)
{
panic("Unimpfault: %s\n", panicStr.c_str());
}
+
+void PageTableFault::invoke(ThreadContext *tc)
+{
+ Process *p = tc->getProcessPtr();
+
+ // 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 - TheISA::PageBytes)
+ {
+ p->stack_min -= TheISA::PageBytes;
+ 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, TheISA::PageBytes);
+ warn("Increasing stack size by one page.");
+ }
+ // 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);
+ }
+}