changeset 73c0aaaaf186 in /z/repo/m5
details: http://repo.m5sim.org/m5?cmd=changeset;node=73c0aaaaf186
description:
        X86: Pass whether an access was a read/write/fetch so faults can behave 
accordingly.

diffstat:

6 files changed, 21 insertions(+), 12 deletions(-)
src/arch/x86/faults.cc           |    4 ++--
src/arch/x86/faults.hh           |   12 ++++++++----
src/arch/x86/pagetable_walker.cc |    4 +++-
src/arch/x86/pagetable_walker.hh |    5 ++++-
src/arch/x86/tlb.cc              |    6 +++---
src/arch/x86/tlb.hh              |    2 +-

diffs (129 lines):

diff -r 6fd7648e1b8d -r 73c0aaaaf186 src/arch/x86/faults.cc
--- a/src/arch/x86/faults.cc    Fri Feb 20 11:02:48 2009 -0500
+++ b/src/arch/x86/faults.cc    Mon Feb 23 00:20:34 2009 -0800
@@ -166,13 +166,13 @@
     void FakeITLBFault::invoke(ThreadContext * tc)
     {
         // Start the page table walker.
-        tc->getITBPtr()->walk(tc, vaddr);
+        tc->getITBPtr()->walk(tc, vaddr, write, execute);
     }
 
     void FakeDTLBFault::invoke(ThreadContext * tc)
     {
         // Start the page table walker.
-        tc->getDTBPtr()->walk(tc, vaddr);
+        tc->getDTBPtr()->walk(tc, vaddr, write, execute);
     }
 
 #else // !FULL_SYSTEM
diff -r 6fd7648e1b8d -r 73c0aaaaf186 src/arch/x86/faults.hh
--- a/src/arch/x86/faults.hh    Fri Feb 20 11:02:48 2009 -0500
+++ b/src/arch/x86/faults.hh    Mon Feb 23 00:20:34 2009 -0800
@@ -429,10 +429,12 @@
     {
       protected:
         Addr vaddr;
+        bool write;
+        bool execute;
       public:
-        FakeITLBFault(Addr _vaddr) :
+        FakeITLBFault(Addr _vaddr, bool _write, bool _execute) :
             X86Fault("fake instruction tlb fault", "itlb", 0),
-            vaddr(_vaddr)
+            vaddr(_vaddr), write(_write), execute(_execute)
         {}
 
         void invoke(ThreadContext * tc);
@@ -442,10 +444,12 @@
     {
       protected:
         Addr vaddr;
+        bool write;
+        bool execute;
       public:
-        FakeDTLBFault(Addr _vaddr) :
+        FakeDTLBFault(Addr _vaddr, bool _write, bool _execute) :
             X86Fault("fake data tlb fault", "dtlb", 0),
-            vaddr(_vaddr)
+            vaddr(_vaddr), write(_write), execute(_execute)
         {}
 
         void invoke(ThreadContext * tc);
diff -r 6fd7648e1b8d -r 73c0aaaaf186 src/arch/x86/pagetable_walker.cc
--- a/src/arch/x86/pagetable_walker.cc  Fri Feb 20 11:02:48 2009 -0500
+++ b/src/arch/x86/pagetable_walker.cc  Mon Feb 23 00:20:34 2009 -0800
@@ -319,11 +319,13 @@
 }
 
 void
-Walker::start(ThreadContext * _tc, Addr vaddr)
+Walker::start(ThreadContext * _tc, Addr vaddr, bool _write, bool _execute)
 {
     assert(state == Ready);
     assert(!tc);
     tc = _tc;
+    execute = _execute;
+    write = _write;
 
     VAddr addr = vaddr;
 
diff -r 6fd7648e1b8d -r 73c0aaaaf186 src/arch/x86/pagetable_walker.hh
--- a/src/arch/x86/pagetable_walker.hh  Fri Feb 20 11:02:48 2009 -0500
+++ b/src/arch/x86/pagetable_walker.hh  Mon Feb 23 00:20:34 2009 -0800
@@ -95,7 +95,7 @@
         void doNext(PacketPtr &read, PacketPtr &write);
 
         // Kick off the state machine.
-        void start(ThreadContext * _tc, Addr vaddr);
+        void start(ThreadContext * _tc, Addr vaddr, bool write, bool execute);
 
       protected:
 
@@ -165,7 +165,10 @@
         State nextState;
         int size;
         bool enableNX;
+        bool write, execute;
         TlbEntry entry;
+        
+        Fault pageFault(bool present);
 
       public:
 
diff -r 6fd7648e1b8d -r 73c0aaaaf186 src/arch/x86/tlb.cc
--- a/src/arch/x86/tlb.cc       Fri Feb 20 11:02:48 2009 -0500
+++ b/src/arch/x86/tlb.cc       Mon Feb 23 00:20:34 2009 -0800
@@ -140,9 +140,9 @@
 
 #if FULL_SYSTEM
 void
-TLB::walk(ThreadContext * _tc, Addr vaddr)
+TLB::walk(ThreadContext * _tc, Addr vaddr, bool write, bool execute)
 {
-    walker->start(_tc, vaddr);
+    walker->start(_tc, vaddr, write, execute);
 }
 #endif
 
@@ -616,7 +616,7 @@
             // The vaddr already has the segment base applied.
             TlbEntry *entry = lookup(vaddr);
             if (!entry) {
-                return new TlbFault(vaddr);
+                return new TlbFault(vaddr, write, execute);
             } else {
                 // Do paging protection checks.
                 DPRINTF(TLB, "Entry found with paddr %#x, doing protection 
checks.\n", entry->paddr);
diff -r 6fd7648e1b8d -r 73c0aaaaf186 src/arch/x86/tlb.hh
--- a/src/arch/x86/tlb.hh       Fri Feb 20 11:02:48 2009 -0500
+++ b/src/arch/x86/tlb.hh       Mon Feb 23 00:20:34 2009 -0800
@@ -119,7 +119,7 @@
 
         Walker * walker;
 
-        void walk(ThreadContext * _tc, Addr vaddr);
+        void walk(ThreadContext * _tc, Addr vaddr, bool write, bool execute);
 #endif
 
       public:
_______________________________________________
m5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/m5-dev

Reply via email to