mem-cache: Add multiple eviction stats
[gem5.git] / src / arch / x86 / vtophys.cc
index e0bb6c993bb3dc874c4db84e4e2331a8e54c5092..d0287f2ce7d46270c2ddf01ae8a81cae76a99f02 100644 (file)
  * Authors: Gabe Black
  */
 
+#include "arch/x86/vtophys.hh"
+
 #include <string>
 
-#include "arch/x86/vtophys.hh"
+#include "arch/x86/pagetable_walker.hh"
+#include "arch/x86/tlb.hh"
+#include "base/trace.hh"
+#include "cpu/thread_context.hh"
+#include "debug/VtoPhys.hh"
 
 using namespace std;
 
 namespace X86ISA
 {
-    Addr vtophys(Addr vaddr)
+    Addr
+    vtophys(Addr vaddr)
     {
-        return vaddr;
+        panic("Need access to page tables\n");
     }
 
-    Addr vtophys(ThreadContext *tc, Addr addr)
+    Addr
+    vtophys(ThreadContext *tc, Addr vaddr)
     {
-        return addr;
+        Walker *walker = dynamic_cast<TLB *>(tc->getDTBPtr())->getWalker();
+        unsigned logBytes;
+        Addr addr = vaddr;
+        Fault fault = walker->startFunctional(
+                tc, addr, logBytes, BaseTLB::Read);
+        if (fault != NoFault)
+            panic("vtophys page walk returned fault\n");
+        Addr masked_addr = vaddr & mask(logBytes);
+        Addr paddr = addr | masked_addr;
+        DPRINTF(VtoPhys, "vtophys(%#x) -> %#x\n", vaddr, paddr);
+        return paddr;
     }
 }