Move the magic m5 PageTableFault into sim/faults.[hh,cc] since it's the same across...
authorGabe Black <gblack@eecs.umich.edu>
Wed, 7 Mar 2007 20:04:46 +0000 (20:04 +0000)
committerGabe Black <gblack@eecs.umich.edu>
Wed, 7 Mar 2007 20:04:46 +0000 (20:04 +0000)
--HG--
extra : convert_revision : 18d441eb7ac44df4df41771bfe3dec69f7fa70ec

src/arch/alpha/faults.cc
src/arch/alpha/faults.hh
src/arch/mips/faults.cc
src/arch/mips/faults.hh
src/arch/sparc/faults.cc
src/arch/sparc/faults.hh
src/mem/page_table.cc
src/sim/faults.cc
src/sim/faults.hh

index 9a842963560bdcfa4f23ada0e4aa86eb4fa1fd0c..1497293518d73a6e1471a4b0bbcc411f00e198fb 100644 (file)
@@ -59,12 +59,6 @@ FaultName ArithmeticFault::_name = "arith";
 FaultVect ArithmeticFault::_vect = 0x0501;
 FaultStat ArithmeticFault::_count;
 
-#if !FULL_SYSTEM
-FaultName PageTableFault::_name = "page_table_fault";
-FaultVect PageTableFault::_vect = 0x0000;
-FaultStat PageTableFault::_count;
-#endif
-
 FaultName InterruptFault::_name = "interrupt";
 FaultVect InterruptFault::_vect = 0x0101;
 FaultStat InterruptFault::_count;
@@ -182,32 +176,6 @@ void ItbFault::invoke(ThreadContext * tc)
     AlphaFault::invoke(tc);
 }
 
-#else //!FULL_SYSTEM
-
-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) {
-        DPRINTF(Stack,
-                "Increasing stack %#x:%#x to %#x:%#x because of access to %#x",
-                p->stack_min, p->stack_base, p->stack_min - PageBytes,
-                p->stack_base, vaddr);
-        p->stack_min -= 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, PageBytes);
-    } else {
-        warn("Page fault on address %#x\n", vaddr);
-        FaultBase::invoke(tc);
-    }
-}
-
 #endif
 
 } // namespace AlphaISA
index e2c3441e9487fb61f7fc4b257c58c1e8247c31d0..6342122c211ceb59274203a57c32d1a0e079b94f 100644 (file)
@@ -85,29 +85,6 @@ class AlignmentFault : public AlphaFault
     bool isAlignmentFault() {return true;}
 };
 
-#if !FULL_SYSTEM
-class PageTableFault : public AlphaFault
-{
-  private:
-    Addr vaddr;
-    static FaultName _name;
-    static FaultVect _vect;
-    static FaultStat _count;
-  public:
-    PageTableFault(Addr va)
-        : vaddr(va) {}
-    FaultName name() {return _name;}
-    FaultVect vect() {return _vect;}
-    FaultStat & countStat() {return _count;}
-    void invoke(ThreadContext * tc);
-};
-
-static inline Fault genPageTableFault(Addr va)
-{
-    return new PageTableFault(va);
-}
-#endif
-
 static inline Fault genMachineCheckFault()
 {
     return new MachineCheckFault;
index 2a8ab1df5d7f871980e2ceac2ffb09aed06e2fa2..c9e6aa75bd3be548dee852ab785171f52a4af886 100644 (file)
@@ -58,12 +58,6 @@ FaultName ArithmeticFault::_name = "arith";
 FaultVect ArithmeticFault::_vect = 0x0501;
 FaultStat ArithmeticFault::_count;
 
-#if !FULL_SYSTEM
-FaultName PageTableFault::_name = "page_table_fault";
-FaultVect PageTableFault::_vect = 0x0000;
-FaultStat PageTableFault::_count;
-#endif
-
 FaultName InterruptFault::_name = "interrupt";
 FaultVect InterruptFault::_vect = 0x0101;
 FaultStat InterruptFault::_count;
@@ -112,25 +106,5 @@ FaultName IntegerOverflowFault::_name = "intover";
 FaultVect IntegerOverflowFault::_vect = 0x0501;
 FaultStat IntegerOverflowFault::_count;
 
-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) {
-        p->stack_min -= 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, PageBytes);
-        warn("Increasing stack size by one page.");
-    } else {
-        FaultBase::invoke(tc);
-    }
-}
-
 } // namespace MipsISA
 
index 9d2c5df329cfbf2bd9308c39ca46c1780c070f73..86c74241331594f154c7198eb0f25da8105d942c 100644 (file)
@@ -80,30 +80,6 @@ class AlignmentFault : public MipsFault
     bool isAlignmentFault() {return true;}
 };
 
-#if !FULL_SYSTEM
-class PageTableFault : public MipsFault
-{
-  private:
-    Addr vaddr;
-    static FaultName _name;
-    static FaultVect _vect;
-    static FaultStat _count;
-  public:
-    PageTableFault(Addr va)
-        : vaddr(va) {}
-    FaultName name() {return _name;}
-    FaultVect vect() {return _vect;}
-    FaultStat & countStat() {return _count;}
-    void invoke(ThreadContext * tc);
-};
-
-static inline Fault genPageTableFault(Addr va)
-{
-    return new PageTableFault(va);
-}
-#endif
-
-
 static inline Fault genMachineCheckFault()
 {
     return new MachineCheckFault;
index f6cf978721dcc1cd860d5afc75c7297459ad00f5..88c086090eb5e4bb2308da8331f1bdc30baef4cb 100644 (file)
@@ -267,12 +267,6 @@ template<> SparcFaultBase::FaultVals
     SparcFault<TrapInstruction>::vals =
     {"trap_instruction", 0x100, 1602, {P, P, H}};
 
-#if !FULL_SYSTEM
-template<> SparcFaultBase::FaultVals
-    SparcFault<PageTableFault>::vals =
-    {"page_table_fault", 0x0000, 0, {SH, SH, SH}};
-#endif
-
 /**
  * This causes the thread context to enter RED state. This causes the side
  * effects which go with entering RED state because of a trap.
@@ -680,28 +674,6 @@ void TrapInstruction::invoke(ThreadContext *tc)
     tc->setNextNPC(tc->readNextNPC() + sizeof(MachInst));
 }
 
-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 - PageBytes)
-    {
-        p->stack_min -= 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, 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);
-    }
-}
-
 #endif
 
 } // namespace SparcISA
index 0ba897e67ea2f1c9de4a1e15d1ae907edc2c5210..10ef89279d0344425390786ea706f337c1381b56 100644 (file)
@@ -256,22 +256,6 @@ class TrapInstruction : public EnumeratedFault<TrapInstruction>
 #endif
 };
 
-#if !FULL_SYSTEM
-class PageTableFault : public SparcFault<PageTableFault>
-{
-  private:
-    Addr vaddr;
-  public:
-    PageTableFault(Addr va) : vaddr(va) {}
-    void invoke(ThreadContext * tc);
-};
-
-static inline Fault genPageTableFault(Addr va)
-{
-    return new PageTableFault(va);
-}
-#endif
-
 static inline Fault genMachineCheckFault()
 {
     return new InternalProcessorError;
index fe8094b8884403e6a1c813e797fadd0e8b47d3fb..96bc23793f32337216949fe8272f0d903ef0f938 100644 (file)
@@ -157,7 +157,7 @@ PageTable::translate(RequestPtr &req)
     assert(pageAlign(req->getVaddr() + req->getSize() - 1)
            == pageAlign(req->getVaddr()));
     if (!translate(req->getVaddr(), paddr)) {
-        return genPageTableFault(req->getVaddr());
+        return Fault(new PageTableFault(req->getVaddr()));
     }
     req->setPaddr(paddr);
     return page_check(req->getPaddr(), req->getSize());
index cea35482a363424771c4b12f107986c8398da006..7aa3ec4a12a64072388307acc390f9a4f3e42973 100644 (file)
  *          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);
+    }
+}
index 00264d8fc64b8fca78e11d6422d200c1a7383ce4..2f0b5af622c6a2360103faf8e6f99688a358e00d 100644 (file)
@@ -76,4 +76,16 @@ class UnimpFault : public FaultBase
     void invoke(ThreadContext * tc);
 };
 
+#if !FULL_SYSTEM
+class PageTableFault : public FaultBase
+{
+  private:
+    Addr vaddr;
+  public:
+    FaultName name() {return "M5 page table fault";}
+    PageTableFault(Addr va) : vaddr(va) {}
+    void invoke(ThreadContext * tc);
+};
+#endif
+
 #endif // __FAULTS_HH__