diff options
-rw-r--r-- | src/mem/ruby/system/RubyPort.cc | 28 | ||||
-rw-r--r-- | src/mem/ruby/system/Sequencer.cc | 2 |
2 files changed, 18 insertions, 12 deletions
diff --git a/src/mem/ruby/system/RubyPort.cc b/src/mem/ruby/system/RubyPort.cc index 3abdecf3d..66e59144f 100644 --- a/src/mem/ruby/system/RubyPort.cc +++ b/src/mem/ruby/system/RubyPort.cc @@ -180,11 +180,6 @@ bool RubyPort::MemMasterPort::recvTimingResp(PacketPtr pkt) // got a response from a device assert(pkt->isResponse()); - // In FS mode, ruby memory will receive pio responses from devices - // and it must forward these responses back to the particular CPU. - DPRINTF(RubyPort, "Pio response for address %#x, going to %d\n", - pkt->getAddr(), pkt->getDest()); - // First we must retrieve the request port from the sender State RubyPort::SenderState *senderState = safe_cast<RubyPort::SenderState *>(pkt->popSenderState()); @@ -192,6 +187,11 @@ bool RubyPort::MemMasterPort::recvTimingResp(PacketPtr pkt) assert(port != NULL); delete senderState; + // In FS mode, ruby memory will receive pio responses from devices + // and it must forward these responses back to the particular CPU. + DPRINTF(RubyPort, "Pio response for address %#x, going to %s\n", + pkt->getAddr(), port->name()); + // attempt to send the response in the next cycle port->schedTimingResp(pkt, curTick() + g_system_ptr->clockPeriod()); @@ -246,9 +246,6 @@ RubyPort::MemSlavePort::recvTimingReq(PacketPtr pkt) return true; } - // Save the port id to be used later to route the response - pkt->setSrc(id); - assert(Address(pkt->getAddr()).getOffset() + pkt->getSize() <= RubySystem::getBlockSizeBytes()); @@ -259,6 +256,10 @@ RubyPort::MemSlavePort::recvTimingReq(PacketPtr pkt) // Otherwise, we need to tell the port to retry at a later point // and return false. if (requestStatus == RequestStatus_Issued) { + // Save the port in the sender state object to be used later to + // route the response + pkt->pushSenderState(new SenderState(this)); + DPRINTF(RubyPort, "Request %s 0x%x issued\n", pkt->cmdString(), pkt->getAddr()); return true; @@ -343,11 +344,14 @@ RubyPort::ruby_hit_callback(PacketPtr pkt) assert(system->isMemAddr(pkt->getAddr())); assert(pkt->isRequest()); - // As it has not yet been turned around, the source field tells us - // which port it came from. - assert(pkt->getSrc() < slave_ports.size()); + // First we must retrieve the request port from the sender State + RubyPort::SenderState *senderState = + safe_cast<RubyPort::SenderState *>(pkt->popSenderState()); + MemSlavePort *port = senderState->port; + assert(port != NULL); + delete senderState; - slave_ports[pkt->getSrc()]->hitCallback(pkt); + port->hitCallback(pkt); // // If we had to stall the MemSlavePorts, wake them up because the sequencer diff --git a/src/mem/ruby/system/Sequencer.cc b/src/mem/ruby/system/Sequencer.cc index ef1b9676b..dbf350199 100644 --- a/src/mem/ruby/system/Sequencer.cc +++ b/src/mem/ruby/system/Sequencer.cc @@ -547,6 +547,8 @@ Sequencer::hitCallback(SequencerRequest* srequest, DataBlock& data, // subBlock with the recieved data. The tester will later access // this state. if (m_usingRubyTester) { + DPRINTF(RubySequencer, "hitCallback %s 0x%x using RubyTester\n", + pkt->cmdString(), pkt->getAddr()); RubyTester::SenderState* testerSenderState = pkt->findNextSenderState<RubyTester::SenderState>(); assert(testerSenderState); |