- assert(newTC->readCpuId() == oldTC->readCpuId());
-#if FULL_SYSTEM
- system->replaceThreadContext(newTC, newTC->readCpuId());
-#else
- assert(newTC->getProcessPtr() == oldTC->getProcessPtr());
- newTC->getProcessPtr()->replaceThreadContext(newTC, newTC->readCpuId());
-#endif
-
-// TheISA::compareXCs(oldXC, newXC);
+ assert(newTC->contextId() == oldTC->contextId());
+ assert(newTC->threadId() == oldTC->threadId());
+ system->replaceThreadContext(newTC, newTC->contextId());
+
+ /* This code no longer works since the zero register (e.g.,
+ * r31 on Alpha) doesn't necessarily contain zero at this
+ * point.
+ if (DTRACE(Context))
+ ThreadContext::compare(oldTC, newTC);
+ */
+
+ Port *old_itb_port, *old_dtb_port, *new_itb_port, *new_dtb_port;
+ old_itb_port = oldTC->getITBPtr()->getPort();
+ old_dtb_port = oldTC->getDTBPtr()->getPort();
+ new_itb_port = newTC->getITBPtr()->getPort();
+ new_dtb_port = newTC->getDTBPtr()->getPort();
+
+ // Move over any table walker ports if they exist
+ if (new_itb_port && !new_itb_port->isConnected()) {
+ assert(old_itb_port);
+ Port *peer = old_itb_port->getPeer();;
+ new_itb_port->setPeer(peer);
+ peer->setPeer(new_itb_port);
+ }
+ if (new_dtb_port && !new_dtb_port->isConnected()) {
+ assert(old_dtb_port);
+ Port *peer = old_dtb_port->getPeer();;
+ new_dtb_port->setPeer(peer);
+ peer->setPeer(new_dtb_port);
+ }