X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fsim%2Fvptr.hh;h=6eefd59373c1f04ba5de87d53e8f354e08a440e4;hb=aa56ed4dc50255869e72b9399c671c21d88e88d4;hp=a0e74139ffe96a320ac2701dd5694bcacc71d686;hpb=cb0cf2dd8ab1cd60ef13de925ac862268c07297f;p=gem5.git diff --git a/src/sim/vptr.hh b/src/sim/vptr.hh index a0e74139f..6eefd5937 100644 --- a/src/sim/vptr.hh +++ b/src/sim/vptr.hh @@ -31,10 +31,9 @@ #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 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 - VPtr(const VPtr &vp) : xc(vp.GetXC()), ptr(vp.GetPointer()) {} - ~VPtr() {} + VPtr(const VPtr &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 operator+(int offset) + bool + operator!() const { - VPtr ptr(*this); - ptr += offset; + return ptr == 0; + } - return ptr; + VPtr + operator+(int offset) + { + return VPtr(tc, ptr + offset); } - const VPtr &operator+=(int offset) + const VPtr & + operator+=(int offset) { ptr += offset; - assert((ptr & (TheISA::PageBytes - 1)) + sizeof(T) - < TheISA::PageBytes); + refresh(); return *this; } - const VPtr &operator=(Addr p) + const VPtr & + operator=(Addr p) { - assert((p & (TheISA::PageBytes - 1)) + sizeof(T) - < TheISA::PageBytes); ptr = p; + refresh(); return *this; } template - const VPtr &operator=(const VPtr &vp) + const VPtr & + operator=(const VPtr &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; } };