Remove delVirtPort() and make getVirtPort() only return cached version.
authorAli Saidi <saidi@eecs.umich.edu>
Tue, 1 Jul 2008 14:25:07 +0000 (10:25 -0400)
committerAli Saidi <saidi@eecs.umich.edu>
Tue, 1 Jul 2008 14:25:07 +0000 (10:25 -0400)
21 files changed:
src/arch/alpha/linux/system.cc
src/arch/alpha/stacktrace.cc
src/arch/alpha/utility.cc
src/arch/mips/linux/system.cc
src/arch/mips/stacktrace.cc
src/arch/mips/utility.cc
src/arch/sparc/stacktrace.cc
src/arch/sparc/utility.cc
src/arch/x86/stacktrace.cc
src/base/remote_gdb.cc
src/cpu/checker/thread_context.hh
src/cpu/o3/thread_context.hh
src/cpu/o3/thread_context_impl.hh
src/cpu/ozone/cpu.hh
src/cpu/ozone/cpu_impl.hh
src/cpu/simple_thread.cc
src/cpu/simple_thread.hh
src/cpu/thread_context.hh
src/cpu/thread_state.hh
src/mem/vport.cc
src/sim/vptr.hh

index 1025987167825c0e4109a0bce15ca8b53e0e6627..a52bcae36c2a4a9343f951ed6197b46a16784a6d 100644 (file)
@@ -169,7 +169,6 @@ LinuxAlphaSystem::setDelayLoop(ThreadContext *tc)
 
         vp = tc->getVirtPort();
         vp->writeHtoG(addr, (uint32_t)((cpuFreq / intrFreq) * 0.9988));
-        tc->delVirtPort(vp);
     }
 }
 
index c16498e720d7aec1665efa40caef46637d7b54de..124949781646cc26e40984c1958fed93f64a2d9a 100644 (file)
@@ -71,8 +71,6 @@ namespace AlphaISA
         if (!tc->getSystemPtr()->kernelSymtab->findAddress("task_struct_comm", addr))
             panic("thread info not compiled into kernel\n");
         name_off = vp->readGtoH<int32_t>(addr);
-
-        tc->delVirtPort(vp);
     }
 
     Addr
@@ -88,7 +86,6 @@ namespace AlphaISA
 
         vp = tc->getVirtPort();
         tsk = vp->readGtoH<Addr>(base + task_off);
-        tc->delVirtPort(vp);
 
         return tsk;
     }
@@ -106,7 +103,6 @@ namespace AlphaISA
 
         vp = tc->getVirtPort();
         pd = vp->readGtoH<uint16_t>(task + pid_off);
-        tc->delVirtPort(vp);
 
         return pd;
     }
index 94e82adf37197e92acef816e93b40137506165b6..23abceb93724ba7c91f3a4c6a876b53102d0e373 100644 (file)
@@ -52,7 +52,6 @@ uint64_t getArgument(ThreadContext *tc, int number, bool fp)
         VirtualPort *vp = tc->getVirtPort();
         uint64_t arg = vp->read<uint64_t>(sp +
                            (number-NumArgumentRegs) * sizeof(uint64_t));
-        tc->delVirtPort(vp);
         return arg;
     }
 #else
index bed863e9d5d09fbfbcd5796ab705435807073753..23062c96b568fce26bfe175f1fffadf1cf850e46 100644 (file)
@@ -168,7 +168,6 @@ LinuxMipsSystem::setDelayLoop(ThreadContext *tc)
 
         vp = tc->getVirtPort();
         vp->writeHtoG(addr, (uint32_t)((cpuFreq / intrFreq) * 0.9988));
-        tc->delVirtPort(vp);
     }
 }
 
index 6c6f6bb3c34963ae2c0b894dc72e3625843971ba..482d264e8d15e2296ac80e15d208ffddbab8ed43 100644 (file)
@@ -70,8 +70,6 @@ ProcessInfo::ProcessInfo(ThreadContext *_tc)
 //     if (!tc->getSystemPtr()->kernelSymtab->findAddress("task_struct_comm", addr))
 //         panic("thread info not compiled into kernel\n");
 //     name_off = vp->readGtoH<int32_t>(addr);
-
-    tc->delVirtPort(vp);
 }
 
 Addr
@@ -87,7 +85,6 @@ ProcessInfo::task(Addr ksp) const
 
     vp = tc->getVirtPort();
     tsk = vp->readGtoH<Addr>(base + task_off);
-    tc->delVirtPort(vp);
 
     return tsk;
 }
@@ -105,7 +102,6 @@ ProcessInfo::pid(Addr ksp) const
 
     vp = tc->getVirtPort();
     pd = vp->readGtoH<uint16_t>(task + pid_off);
-    tc->delVirtPort(vp);
 
     return pd;
 }
index 52c52f8e75c2744df916538f4d7b57c311520bf6..36cf76c67b0da29e15ab377b7bf153c37c130933 100644 (file)
@@ -62,7 +62,6 @@ getArgument(ThreadContext *tc, int number, bool fp)
         VirtualPort *vp = tc->getVirtPort();
         uint64_t arg = vp->read<uint64_t>(sp +
                            (number-NumArgumentRegs) * sizeof(uint64_t));
-        tc->delVirtPort(vp);
         return arg;
     }
 #else
index 2d799126796dd426079d4f96ff9477c405272aa5..8ec1d36c88e18d7bc1c5f5cd2a9e7f37be374faa 100644 (file)
@@ -70,8 +70,6 @@ namespace SparcISA
         if (!tc->getSystemPtr()->kernelSymtab->findAddress("task_struct_comm", addr))
             panic("thread info not compiled into kernel\n");
         name_off = vp->readGtoH<int32_t>(addr);
-
-        tc->delVirtPort(vp);
     }
 
     Addr
@@ -87,7 +85,6 @@ namespace SparcISA
 
         vp = tc->getVirtPort();
         tsk = vp->readGtoH<Addr>(base + task_off);
-        tc->delVirtPort(vp);
 
         return tsk;
     }
@@ -105,7 +102,6 @@ namespace SparcISA
 
         vp = tc->getVirtPort();
         pd = vp->readGtoH<uint16_t>(task + pid_off);
-        tc->delVirtPort(vp);
 
         return pd;
     }
index 0677823afcc54d0c1899790fc45f2919f16ed45f..8f5c3e0368b613205facba848ee6cba85cc65cd5 100644 (file)
@@ -53,7 +53,6 @@ uint64_t getArgument(ThreadContext *tc, int number, bool fp) {
         VirtualPort *vp = tc->getVirtPort();
         uint64_t arg = vp->read<uint64_t>(sp + 92 +
                             (number-NumArgumentRegs) * sizeof(uint64_t));
-        tc->delVirtPort(vp);
         return arg;
     }
 #else
index 300e8dcd024e5a35179225b69549f123d638b996..87767583bbf368be11c459217689feeec1b77160 100644 (file)
@@ -70,8 +70,6 @@ namespace X86ISA
         if (!tc->getSystemPtr()->kernelSymtab->findAddress("task_struct_comm", addr))
             panic("thread info not compiled into kernel\n");
         name_off = vp->readGtoH<int32_t>(addr);
-
-        tc->delVirtPort(vp);
     }
 
     Addr
@@ -87,7 +85,6 @@ namespace X86ISA
 
         vp = tc->getVirtPort();
         tsk = vp->readGtoH<Addr>(base + task_off);
-        tc->delVirtPort(vp);
 
         return tsk;
     }
@@ -105,7 +102,6 @@ namespace X86ISA
 
         vp = tc->getVirtPort();
         pd = vp->readGtoH<uint16_t>(task + pid_off);
-        tc->delVirtPort(vp);
 
         return pd;
     }
index 1a858a3f3fb93453321709641fc6e744707d2dd5..51293e1185b2036d1aa718d09408e14493989834 100644 (file)
@@ -459,9 +459,6 @@ BaseRemoteGDB::read(Addr vaddr, size_t size, char *data)
     TranslatingPort *port = context->getMemPort();
 #endif
     port->readBlob(vaddr, (uint8_t*)data, size);
-#if FULL_SYSTEM
-    context->delVirtPort(port);
-#endif
 
 #if TRACING_ON
     if (DTRACE(GDBRead)) {
@@ -504,9 +501,7 @@ BaseRemoteGDB::write(Addr vaddr, size_t size, const char *data)
     TranslatingPort *port = context->getMemPort();
 #endif
     port->writeBlob(vaddr, (uint8_t*)data, size);
-#if FULL_SYSTEM
-    context->delVirtPort(port);
-#else
+#if !FULL_SYSTEM
     delete port;
 #endif
 
index 15454c3fea9316a33a279f6e1e179dfbb3f65f6e..4ede74c646da25f8f4e97039b18eab175643ee32 100644 (file)
@@ -98,10 +98,8 @@ class CheckerThreadContext : public ThreadContext
 
     FunctionalPort *getPhysPort() { return actualTC->getPhysPort(); }
 
-    VirtualPort *getVirtPort(ThreadContext *tc = NULL)
+    VirtualPort *getVirtPort()
     { return actualTC->getVirtPort(); }
-
-    void delVirtPort(VirtualPort *vp) { actualTC->delVirtPort(vp); }
 #else
     TranslatingPort *getMemPort() { return actualTC->getMemPort(); }
 
index 44e26729cb1e9735d466aecb3f1da94baae0f030..66dc47f0bf473b06fb149bbb91e370265ff8055f 100755 (executable)
@@ -94,9 +94,7 @@ class O3ThreadContext : public ThreadContext
 
     virtual FunctionalPort *getPhysPort() { return thread->getPhysPort(); }
 
-    virtual VirtualPort *getVirtPort(ThreadContext *src_tc = NULL);
-
-    void delVirtPort(VirtualPort *vp);
+    virtual VirtualPort *getVirtPort();
 
     virtual void connectMemPorts(ThreadContext *tc) { thread->connectMemPorts(tc); }
 #else
index 865d5863528b46568f80abad62c051bf0e4b0f72..a521c3636423aabd8d267453b913a3ea1eb7b13d 100755 (executable)
 #if FULL_SYSTEM
 template <class Impl>
 VirtualPort *
-O3ThreadContext<Impl>::getVirtPort(ThreadContext *src_tc)
+O3ThreadContext<Impl>::getVirtPort()
 {
-    if (!src_tc)
-        return thread->getVirtPort();
-
-    VirtualPort *vp;
-
-    vp = new VirtualPort("tc-vport", src_tc);
-    thread->connectToMemFunc(vp);
-    return vp;
+    return thread->getVirtPort();
 }
 
 template <class Impl>
@@ -97,18 +90,6 @@ O3ThreadContext<Impl>::takeOverFrom(ThreadContext *old_context)
     thread->trapPending = false;
 }
 
-#if FULL_SYSTEM
-template <class Impl>
-void
-O3ThreadContext<Impl>::delVirtPort(VirtualPort *vp)
-{
-    if (vp != thread->getVirtPort()) {
-        vp->removeConn();
-        delete vp;
-    }
-}
-#endif
-
 template <class Impl>
 void
 O3ThreadContext<Impl>::activate(int delay)
index b0ea2cba95c7abf661fe97fa165264e02ab25d70..c3ea3367340fa4d0e2ff0f16a63d1d97954367e9 100644 (file)
@@ -134,10 +134,8 @@ class OzoneCPU : public BaseCPU
 
         FunctionalPort *getPhysPort() { return thread->getPhysPort(); }
 
-        VirtualPort *getVirtPort(ThreadContext *tc = NULL)
-        { return thread->getVirtPort(tc); }
-
-        void delVirtPort(VirtualPort *vp);
+        VirtualPort *getVirtPort()
+        { return thread->getVirtPort(); }
 #else
         TranslatingPort *getMemPort() { return thread->getMemPort(); }
 
index 0c7105382c54bd6abf51b5999de79233273a2794..ec531d57103099b11adedc09648cb01a0790fb62 100644 (file)
@@ -742,16 +742,6 @@ OzoneCPU<Impl>::OzoneTC::setCpuId(int id)
     thread->setCpuId(id);
 }
 
-#if FULL_SYSTEM
-template <class Impl>
-void
-OzoneCPU<Impl>::OzoneTC::delVirtPort(VirtualPort *vp)
-{
-    vp->removeConn();
-    delete vp;
-}
-#endif
-
 template <class Impl>
 void
 OzoneCPU<Impl>::OzoneTC::setStatus(Status new_status)
index 5a5444de413617386bb5b9e9cb3cb36971ad140f..8d5c4eafbdd30ad5c3dde7c929c62038e541605e 100644 (file)
@@ -286,26 +286,3 @@ SimpleThread::copyArchRegs(ThreadContext *src_tc)
     TheISA::copyRegs(src_tc, tc);
 }
 
-#if FULL_SYSTEM
-VirtualPort*
-SimpleThread::getVirtPort(ThreadContext *src_tc)
-{
-    if (!src_tc)
-        return virtPort;
-
-    VirtualPort *vp = new VirtualPort("tc-vport", src_tc);
-    connectToMemFunc(vp);
-    return vp;
-}
-
-void
-SimpleThread::delVirtPort(VirtualPort *vp)
-{
-    if (vp != virtPort) {
-        vp->removeConn();
-        delete vp;
-    }
-}
-
-#endif
-
index fa80a283a27d6ecd10edad40e551d2b84bc971f0..37c3221f5c3b148b812cdb601b74e4456dd1b360 100644 (file)
@@ -208,12 +208,11 @@ class SimpleThread : public ThreadState
 
     FunctionalPort *getPhysPort() { return physPort; }
 
-    /** Return a virtual port. If no thread context is specified then a static
-     * port is returned. Otherwise a port is created and returned. It must be
-     * deleted by deleteVirtPort(). */
-    VirtualPort *getVirtPort(ThreadContext *tc);
-
-    void delVirtPort(VirtualPort *vp);
+    /** Return a virtual port. This port cannot be cached locally in an object.
+     * After a CPU switch it may point to the wrong memory object which could
+     * mean stale data.
+     */
+    VirtualPort *getVirtPort() { return virtPort; }
 #endif
 
     Status status() const { return _status; }
index b25a67d59e35ef15c70213b4de7be03008076b50..b1687a49492ed50cfb896deebc7035ae0e6b7e23 100644 (file)
@@ -130,9 +130,7 @@ class ThreadContext
 
     virtual FunctionalPort *getPhysPort() = 0;
 
-    virtual VirtualPort *getVirtPort(ThreadContext *tc = NULL) = 0;
-
-    virtual void delVirtPort(VirtualPort *vp) = 0;
+    virtual VirtualPort *getVirtPort() = 0;
 
     virtual void connectMemPorts(ThreadContext *tc) = 0;
 #else
@@ -321,9 +319,7 @@ class ProxyThreadContext : public ThreadContext
 
     FunctionalPort *getPhysPort() { return actualTC->getPhysPort(); }
 
-    VirtualPort *getVirtPort(ThreadContext *tc = NULL) { return actualTC->getVirtPort(tc); }
-
-    void delVirtPort(VirtualPort *vp) { return actualTC->delVirtPort(vp); }
+    VirtualPort *getVirtPort() { return actualTC->getVirtPort(); }
 
     void connectMemPorts(ThreadContext *tc) { actualTC->connectMemPorts(tc); }
 #else
index b6a62eebc8122f9c53a36e246ec09ffed54aca25..1b667f72a674be211897b956d52af7b9b5c3ebac 100644 (file)
@@ -111,9 +111,7 @@ struct ThreadState {
 
     void setPhysPort(FunctionalPort *port) { physPort = port; }
 
-    VirtualPort *getVirtPort(ThreadContext *tc = NULL) { return virtPort; }
-
-    void setVirtPort(VirtualPort *port) { virtPort = port; }
+    VirtualPort *getVirtPort() { return virtPort; }
 #else
     Process *getProcessPtr() { return process; }
 
index a2f8b1ecc7cd5285eece7ac9dcd38a6909517e1e..15be45c2a484e10d4a00494c6ebc8a8dc8384b7e 100644 (file)
@@ -78,9 +78,6 @@ CopyOut(ThreadContext *tc, void *dest, Addr src, size_t cplen)
     VirtualPort *vp = tc->getVirtPort();
 
     vp->readBlob(src, dst, cplen);
-
-    tc->delVirtPort(vp);
-
 }
 
 void
@@ -90,8 +87,6 @@ CopyIn(ThreadContext *tc, Addr dest, void *source, size_t cplen)
     VirtualPort *vp = tc->getVirtPort();
 
     vp->writeBlob(dest, src, cplen);
-
-    tc->delVirtPort(vp);
 }
 
 void
@@ -105,7 +100,6 @@ CopyStringOut(ThreadContext *tc, char *dst, Addr vaddr, size_t maxlen)
         vp->readBlob(vaddr++, (uint8_t*)dst++, 1);
     } while (len < maxlen && start[len++] != 0 );
 
-    tc->delVirtPort(vp);
     dst[len] = 0;
 }
 
@@ -119,5 +113,4 @@ CopyStringIn(ThreadContext *tc, char *src, Addr vaddr)
         vp->writeBlob(gen.addr(), (uint8_t*)src, gen.size());
         src += gen.size();
     }
-    tc->delVirtPort(vp);
 }
index 88b515c13be0758f04527bbddf70efed092a90ed..09aa2d2139f2c208f28e10d7b74bf1402bcf2a78 100644 (file)
@@ -73,7 +73,6 @@ class VPtr
 
         VirtualPort *port = tc->getVirtPort();
         port->readBlob(ptr, buffer, sizeof(T));
-        tc->delVirtPort(port);
     }
 
     bool