mem: Fix guest corruption when caches handle uncacheable accesses
[gem5.git] / src / mem / fs_translating_port_proxy.cc
index c0898a0035e376da3220ab2f1fbdf8eebc7a71ef..9f1f7d019d5cad5ffa072d2afbb859ac5ba97231 100644 (file)
 using namespace TheISA;
 
 FSTranslatingPortProxy::FSTranslatingPortProxy(ThreadContext *tc)
-    : PortProxy(*(tc->getCpuPtr()->getPort("dcache_port"))), _tc(tc)
+    : PortProxy(tc->getCpuPtr()->getDataPort()), _tc(tc)
 {
 }
 
-FSTranslatingPortProxy::FSTranslatingPortProxy(Port &port)
+FSTranslatingPortProxy::FSTranslatingPortProxy(MasterPort &port)
     : PortProxy(port), _tc(NULL)
 {
 }
@@ -68,7 +68,7 @@ FSTranslatingPortProxy::~FSTranslatingPortProxy()
 }
 
 void
-FSTranslatingPortProxy::readBlob(Addr addr, uint8_t *p, int size)
+FSTranslatingPortProxy::readBlob(Addr addr, uint8_t *p, int size) const
 {
     Addr paddr;
     for (ChunkGenerator gen(addr, size, TheISA::PageBytes); !gen.done();
@@ -85,7 +85,7 @@ FSTranslatingPortProxy::readBlob(Addr addr, uint8_t *p, int size)
 }
 
 void
-FSTranslatingPortProxy::writeBlob(Addr addr, uint8_t *p, int size)
+FSTranslatingPortProxy::writeBlob(Addr addr, uint8_t *p, int size) const
 {
     Addr paddr;
     for (ChunkGenerator gen(addr, size, TheISA::PageBytes); !gen.done();
@@ -102,7 +102,7 @@ FSTranslatingPortProxy::writeBlob(Addr addr, uint8_t *p, int size)
 }
 
 void
-FSTranslatingPortProxy::memsetBlob(Addr address, uint8_t v, int size)
+FSTranslatingPortProxy::memsetBlob(Addr address, uint8_t v, int size) const
 {
     Addr paddr;
     for (ChunkGenerator gen(address, size, TheISA::PageBytes); !gen.done();
@@ -121,30 +121,26 @@ void
 CopyOut(ThreadContext *tc, void *dest, Addr src, size_t cplen)
 {
     uint8_t *dst = (uint8_t *)dest;
-    FSTranslatingPortProxy* vp = tc->getVirtProxy();
-
-    vp->readBlob(src, dst, cplen);
+    tc->getVirtProxy().readBlob(src, dst, cplen);
 }
 
 void
 CopyIn(ThreadContext *tc, Addr dest, void *source, size_t cplen)
 {
     uint8_t *src = (uint8_t *)source;
-    FSTranslatingPortProxy* vp = tc->getVirtProxy();
-
-    vp->writeBlob(dest, src, cplen);
+    tc->getVirtProxy().writeBlob(dest, src, cplen);
 }
 
 void
 CopyStringOut(ThreadContext *tc, char *dst, Addr vaddr, size_t maxlen)
 {
     char *start = dst;
-    FSTranslatingPortProxyvp = tc->getVirtProxy();
+    FSTranslatingPortProxy &vp = tc->getVirtProxy();
 
     bool foundNull = false;
     while ((dst - start + 1) < maxlen && !foundNull) {
-        vp->readBlob(vaddr++, (uint8_t*)dst, 1);
-        if (dst == '\0')
+        vp.readBlob(vaddr++, (uint8_t*)dst, 1);
+        if (*dst == '\0')
             foundNull = true;
         dst++;
     }
@@ -156,11 +152,11 @@ CopyStringOut(ThreadContext *tc, char *dst, Addr vaddr, size_t maxlen)
 void
 CopyStringIn(ThreadContext *tc, char *src, Addr vaddr)
 {
-    FSTranslatingPortProxyvp = tc->getVirtProxy();
+    FSTranslatingPortProxy &vp = tc->getVirtProxy();
     for (ChunkGenerator gen(vaddr, strlen(src), TheISA::PageBytes); !gen.done();
-            gen.next())
+         gen.next())
     {
-        vp->writeBlob(gen.addr(), (uint8_t*)src, gen.size());
+        vp.writeBlob(gen.addr(), (uint8_t*)src, gen.size());
         src += gen.size();
     }
 }