projects
/
gem5.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
syscall_emul: style changes and FDArray refactor
[gem5.git]
/
src
/
sim
/
vptr.hh
diff --git
a/src/sim/vptr.hh
b/src/sim/vptr.hh
index a0e74139ffe96a320ac2701dd5694bcacc71d686..6eefd59373c1f04ba5de87d53e8f354e08a440e4 100644
(file)
--- a/
src/sim/vptr.hh
+++ b/
src/sim/vptr.hh
@@
-31,10
+31,9
@@
#ifndef __ARCH_ALPHA_VPTR_HH__
#define __ARCH_ALPHA_VPTR_HH__
#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
Exec
Context;
+class
Thread
Context;
template <class T>
class VPtr
template <class T>
class VPtr
@@
-42,82
+41,94
@@
class VPtr
public:
typedef T Type;
public:
typedef T Type;
- pr
ivate
:
-
ExecContext *x
c;
+ pr
otected
:
+
ThreadContext *t
c;
Addr ptr;
Addr ptr;
+ Addr buffer[(sizeof(T)-1)/sizeof(Addr) + 1];
public:
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>
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;
{
ptr += offset;
- assert((ptr & (TheISA::PageBytes - 1)) + sizeof(T)
- < TheISA::PageBytes);
+ refresh();
return *this;
}
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;
ptr = p;
+ refresh();
return *this;
}
template <class U>
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 *()
{
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;
}
};
}
};