{
if (!slavePort.isConnected() || !masterPort.isConnected())
fatal("Address mapper is not connected on both sides.\n");
-
- if ((slavePort.peerBlockSize() != masterPort.peerBlockSize()) &&
- slavePort.peerBlockSize() && masterPort.peerBlockSize())
- fatal("Slave port size %d, master port size %d \n "
- "don't have the same block size... Not supported.\n",
- slavePort.peerBlockSize(), masterPort.peerBlockSize());
}
BaseMasterPort&
{
Addr orig_addr = pkt->getAddr();
bool needsResponse = pkt->needsResponse();
- bool memInhibitAsserted = pkt->memInhibitAsserted();
- Packet::SenderState* senderState = pkt->senderState;
+ bool cacheResponding = pkt->cacheResponding();
- if (needsResponse && !memInhibitAsserted) {
- pkt->senderState = new AddrMapperSenderState(senderState, orig_addr);
+ if (needsResponse && !cacheResponding) {
+ pkt->pushSenderState(new AddrMapperSenderState(orig_addr));
}
pkt->setAddr(remapAddr(orig_addr));
- // Attempt to send the packet (always succeeds for inhibited
- // packets)
+ // Attempt to send the packet
bool successful = masterPort.sendTimingReq(pkt);
- // If not successful, restore the sender state
- if (!successful && needsResponse) {
- delete pkt->senderState;
- pkt->senderState = senderState;
+ // If not successful, restore the address and sender state
+ if (!successful) {
+ pkt->setAddr(orig_addr);
+
+ if (needsResponse) {
+ delete pkt->popSenderState();
+ }
}
return successful;
Addr remapped_addr = pkt->getAddr();
// Restore the state and address
- pkt->senderState = receivedState->origSenderState;
+ pkt->senderState = receivedState->predecessor;
pkt->setAddr(receivedState->origAddr);
// Attempt to send the packet
return false;
}
-unsigned
-AddrMapper::deviceBlockSizeMaster()
-{
- return slavePort.peerBlockSize();
-}
-
-unsigned
-AddrMapper::deviceBlockSizeSlave()
-{
- return masterPort.peerBlockSize();
-}
-
void
-AddrMapper::recvRetryMaster()
+AddrMapper::recvReqRetry()
{
- slavePort.sendRetry();
+ slavePort.sendRetryReq();
}
void
-AddrMapper::recvRetrySlave()
+AddrMapper::recvRespRetry()
{
- masterPort.sendRetry();
+ masterPort.sendRetryResp();
}
void
AddrRangeList
RangeAddrMapper::getAddrRanges() const
{
- AddrRangeList ranges;
- AddrRangeList actualRanges = masterPort.getAddrRanges();
-
- for (AddrRangeIter r = actualRanges.begin(); r != actualRanges.end(); ++r) {
- AddrRange range = *r;
-
- for (int j = 0; j < originalRanges.size(); ++j) {
- if (range.intersects(originalRanges[j]))
- fatal("Cannot remap range that intersects the original"
- " ranges but are not a subset.\n");
- if (range.isSubset(originalRanges[j])) {
- // range is a subset
- Addr offset = range.start() - originalRanges[j].start();
- Addr start = range.start() - offset;
- ranges.push_back(AddrRange(start, start + range.size() - 1));
- } else {
- ranges.push_back(range);
- }
- }
- }
-
+ // Simply return the original ranges as given by the parameters
+ AddrRangeList ranges(originalRanges.begin(), originalRanges.end());
return ranges;
}