sim: Adding support for power models
[gem5.git] / src / sim / vptr.hh
index bcc22f0caba56470075bce57ed49cca64464d8d3..658959a905ac682aecf96278d66a1b782a509ebe 100644 (file)
@@ -31,8 +31,9 @@
 #ifndef __ARCH_ALPHA_VPTR_HH__
 #define __ARCH_ALPHA_VPTR_HH__
 
-#include "arch/vtophys.hh"
 #include "arch/isa_traits.hh"
+#include "arch/vtophys.hh"
+#include "mem/fs_translating_port_proxy.hh"
 
 class ThreadContext;
 
@@ -42,82 +43,94 @@ class VPtr
   public:
     typedef T Type;
 
-  private:
+  protected:
     ThreadContext *tc;
     Addr ptr;
+    Addr buffer[(sizeof(T)-1)/sizeof(Addr) + 1];
 
   public:
-    ThreadContext *GetTC() const { return tc; }
-    Addr GetPointer() const { return ptr; }
+    explicit VPtr(ThreadContext *_tc, Addr p = 0)
+        : tc(_tc), ptr(p)
+    {
+        refresh();
+    }
 
-  public:
-    explicit VPtr(ThreadContext *_tc, Addr p = 0) : tc(_tc), ptr(p) { }
     template <class U>
-    VPtr(const VPtr<U> &vp) : tc(vp.GetTC()), ptr(vp.GetPointer()) {}
-    ~VPtr() {}
+    VPtr(const VPtr<U> &vp)
+        : tc(vp.tc), ptr(vp.ptr)
+    {
+        refresh();
+    }
 
-    bool operator!() const
+    ~VPtr()
+    {}
+
+    void
+    refresh()
     {
-        return ptr == 0;
+        if (!ptr)
+            return;
+
+        FSTranslatingPortProxy &proxy = tc->getVirtProxy();
+        proxy.readBlob(ptr, buffer, sizeof(T));
     }
 
-    VPtr<T> operator+(int offset)
+    bool
+    operator!() const
     {
-        VPtr<T> ptr(*this);
-        ptr += offset;
+        return ptr == 0;
+    }
 
-        return ptr;
+    VPtr<T>
+    operator+(int offset)
+    {
+        return VPtr<T>(tc, ptr + offset);
     }
 
-    const VPtr<T> &operator+=(int offset)
+    const VPtr<T> &
+    operator+=(int offset)
     {
         ptr += offset;
-        assert((ptr & (TheISA::PageBytes - 1)) + sizeof(T)
-               < TheISA::PageBytes);
+        refresh();
 
         return *this;
     }
 
-    const VPtr<T> &operator=(Addr p)
+    const VPtr<T> &
+    operator=(Addr p)
     {
-        assert((p & (TheISA::PageBytes - 1)) + sizeof(T)
-               < TheISA::PageBytes);
         ptr = p;
+        refresh();
 
         return *this;
     }
 
     template <class U>
-    const VPtr<T> &operator=(const VPtr<U> &vp)
+    const VPtr<T> &
+    operator=(const VPtr<U> &vp)
     {
-        tc = vp.GetTC();
-        ptr = vp.GetPointer();
+        tc = vp.tc;
+        ptr = vp.ptr;
+        refresh();
 
         return *this;
     }
 
     operator T *()
     {
-        panic("Needs to be rewritten\n");
-/*     void *addr = vtomem(tc, ptr, sizeof(T));
-        return (T *)addr;
-        */
+        return (T *)buffer;
     }
 
-    T *operator->()
+    T *
+    operator->()
     {
-        panic("Needs to be rewritten\n");
-/*     void *addr = vtomem(tc, ptr, sizeof(T));
-        return (T *)addr;
-        */
+        return (T *)buffer;
     }
 
-    T &operator*()
+    T &
+    operator*()
     {
-        panic("Needs to be rewritten\n");
-/*     void *addr = vtomem(tc, ptr, sizeof(T));
-        return *(T *)addr;
-        */
+        return *(T *)buffer;
     }
 };