syscall_emul: style changes and FDArray refactor
[gem5.git] / src / sim / vptr.hh
index a0e74139ffe96a320ac2701dd5694bcacc71d686..6eefd59373c1f04ba5de87d53e8f354e08a440e4 100644 (file)
 #ifndef __ARCH_ALPHA_VPTR_HH__
 #define __ARCH_ALPHA_VPTR_HH__
 
-#include "arch/vtophys.hh"
-#include "arch/isa_traits.hh"
+#include "mem/fs_translating_port_proxy.hh"
 
-class ExecContext;
+class ThreadContext;
 
 template <class T>
 class VPtr
@@ -42,82 +41,94 @@ class VPtr
   public:
     typedef T Type;
 
-  private:
-    ExecContext *xc;
+  protected:
+    ThreadContext *tc;
     Addr ptr;
+    Addr buffer[(sizeof(T)-1)/sizeof(Addr) + 1];
 
   public:
-    ExecContext *GetXC() const { return xc; }
-    Addr GetPointer() const { return ptr; }
+    explicit VPtr(ThreadContext *_tc, Addr p = 0)
+        : tc(_tc), ptr(p)
+    {
+        refresh();
+    }
 
-  public:
-    explicit VPtr(ExecContext *_xc, Addr p = 0) : xc(_xc), ptr(p) { }
     template <class U>
-    VPtr(const VPtr<U> &vp) : xc(vp.GetXC()), ptr(vp.GetPointer()) {}
-    ~VPtr() {}
+    VPtr(const VPtr<U> &vp)
+        : tc(vp.tc), ptr(vp.ptr)
+    {
+        refresh();
+    }
+
+    ~VPtr()
+    {}
 
-    bool operator!() const
+    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)
     {
-        xc = vp.GetXC();
-        ptr = vp.GetPointer();
+        tc = vp.tc;
+        ptr = vp.ptr;
+        refresh();
 
         return *this;
     }
 
     operator T *()
     {
-        panic("Needs to be rewritten\n");
-/*     void *addr = vtomem(xc, ptr, sizeof(T));
-        return (T *)addr;
-        */
+        return (T *)buffer;
     }
 
-    T *operator->()
+    T *
+    operator->()
     {
-        panic("Needs to be rewritten\n");
-/*     void *addr = vtomem(xc, ptr, sizeof(T));
-        return (T *)addr;
-        */
+        return (T *)buffer;
     }
 
-    T &operator*()
+    T &
+    operator*()
     {
-        panic("Needs to be rewritten\n");
-/*     void *addr = vtomem(xc, ptr, sizeof(T));
-        return *(T *)addr;
-        */
+        return *(T *)buffer;
     }
 };