mem: Allow packet to provide its own addr range
Add a getter to Packet to allow it to provide its own addr range. Change-Id: I2128ea3b71906502d10d9376b050a62407defd23 Signed-off-by: Daniel R. Carvalho <odanrc@yahoo.com.br> Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/17536 Tested-by: kokoro <noreply+kokoro@google.com> Reviewed-by: Nikos Nikoleris <nikos.nikoleris@arm.com> Maintainer: Nikos Nikoleris <nikos.nikoleris@arm.com>
This commit is contained in:
committed by
Daniel Carvalho
parent
3d4e412694
commit
22abf7916e
@@ -339,8 +339,7 @@ AbstractMemory::access(PacketPtr pkt)
|
||||
return;
|
||||
}
|
||||
|
||||
assert(AddrRange(pkt->getAddr(),
|
||||
pkt->getAddr() + (pkt->getSize() - 1)).isSubset(range));
|
||||
assert(pkt->getAddrRange().isSubset(range));
|
||||
|
||||
uint8_t *hostAddr = pmemAddr + pkt->getAddr() - range.start();
|
||||
|
||||
@@ -430,8 +429,7 @@ AbstractMemory::access(PacketPtr pkt)
|
||||
void
|
||||
AbstractMemory::functionalAccess(PacketPtr pkt)
|
||||
{
|
||||
assert(AddrRange(pkt->getAddr(),
|
||||
pkt->getAddr() + pkt->getSize() - 1).isSubset(range));
|
||||
assert(pkt->getAddrRange().isSubset(range));
|
||||
|
||||
uint8_t *hostAddr = pmemAddr + pkt->getAddr() - range.start();
|
||||
|
||||
|
||||
@@ -152,8 +152,7 @@ CoherentXBar::recvTimingReq(PacketPtr pkt, PortID slave_port_id)
|
||||
assert(is_express_snoop == cache_responding);
|
||||
|
||||
// determine the destination based on the destination address range
|
||||
AddrRange addr_range = RangeSize(pkt->getAddr(), pkt->getSize());
|
||||
PortID master_port_id = findPort(addr_range);
|
||||
PortID master_port_id = findPort(pkt->getAddrRange());
|
||||
|
||||
// test if the crossbar should be considered occupied for the current
|
||||
// port, and exclude express snoops from the check
|
||||
@@ -552,9 +551,7 @@ CoherentXBar::recvTimingSnoopReq(PacketPtr pkt, PortID master_port_id)
|
||||
// device responsible for the address range something is
|
||||
// wrong, hence there is nothing further to do as the packet
|
||||
// would be going back to where it came from
|
||||
AddrRange addr_range M5_VAR_USED =
|
||||
RangeSize(pkt->getAddr(), pkt->getSize());
|
||||
assert(findPort(addr_range) == master_port_id);
|
||||
assert(findPort(pkt->getAddrRange()) == master_port_id);
|
||||
}
|
||||
|
||||
bool
|
||||
@@ -785,8 +782,7 @@ CoherentXBar::recvAtomicBackdoor(PacketPtr pkt, PortID slave_port_id,
|
||||
|
||||
// even if we had a snoop response, we must continue and also
|
||||
// perform the actual request at the destination
|
||||
AddrRange addr_range = RangeSize(pkt->getAddr(), pkt->getSize());
|
||||
PortID master_port_id = findPort(addr_range);
|
||||
PortID master_port_id = findPort(pkt->getAddrRange());
|
||||
|
||||
if (sink_packet) {
|
||||
DPRINTF(CoherentXBar, "%s: Not forwarding %s\n", __func__,
|
||||
@@ -1013,7 +1009,7 @@ CoherentXBar::recvFunctional(PacketPtr pkt, PortID slave_port_id)
|
||||
}
|
||||
}
|
||||
|
||||
PortID dest_id = findPort(RangeSize(pkt->getAddr(), pkt->getSize()));
|
||||
PortID dest_id = findPort(pkt->getAddrRange());
|
||||
|
||||
masterPorts[dest_id]->sendFunctional(pkt);
|
||||
}
|
||||
|
||||
@@ -108,8 +108,7 @@ NoncoherentXBar::recvTimingReq(PacketPtr pkt, PortID slave_port_id)
|
||||
assert(!pkt->isExpressSnoop());
|
||||
|
||||
// determine the destination based on the address
|
||||
AddrRange addr_range = RangeSize(pkt->getAddr(), pkt->getSize());
|
||||
PortID master_port_id = findPort(addr_range);
|
||||
PortID master_port_id = findPort(pkt->getAddrRange());
|
||||
|
||||
// test if the layer should be considered occupied for the current
|
||||
// port
|
||||
@@ -255,8 +254,7 @@ NoncoherentXBar::recvAtomicBackdoor(PacketPtr pkt, PortID slave_port_id,
|
||||
unsigned int pkt_cmd = pkt->cmdToIndex();
|
||||
|
||||
// determine the destination port
|
||||
AddrRange addr_range = RangeSize(pkt->getAddr(), pkt->getSize());
|
||||
PortID master_port_id = findPort(addr_range);
|
||||
PortID master_port_id = findPort(pkt->getAddrRange());
|
||||
|
||||
// stats updates for the request
|
||||
pktCount[slave_port_id][master_port_id]++;
|
||||
@@ -308,8 +306,7 @@ NoncoherentXBar::recvFunctional(PacketPtr pkt, PortID slave_port_id)
|
||||
}
|
||||
|
||||
// determine the destination port
|
||||
AddrRange addr_range = RangeSize(pkt->getAddr(), pkt->getSize());
|
||||
PortID dest_id = findPort(addr_range);
|
||||
PortID dest_id = findPort(pkt->getAddrRange());
|
||||
|
||||
// forward the request to the appropriate destination
|
||||
masterPorts[dest_id]->sendFunctional(pkt);
|
||||
|
||||
@@ -227,6 +227,12 @@ MemCmd::commandInfo[] =
|
||||
InvalidCmd, "InvalidateResp" }
|
||||
};
|
||||
|
||||
AddrRange
|
||||
Packet::getAddrRange() const
|
||||
{
|
||||
return RangeSize(getAddr(), getSize());
|
||||
}
|
||||
|
||||
bool
|
||||
Packet::trySatisfyFunctional(Printable *obj, Addr addr, bool is_secure, int size,
|
||||
uint8_t *_data)
|
||||
|
||||
@@ -57,6 +57,7 @@
|
||||
#include <cassert>
|
||||
#include <list>
|
||||
|
||||
#include "base/addr_range.hh"
|
||||
#include "base/cast.hh"
|
||||
#include "base/compiler.hh"
|
||||
#include "base/flags.hh"
|
||||
@@ -736,6 +737,13 @@ class Packet : public Printable
|
||||
|
||||
unsigned getSize() const { assert(flags.isSet(VALID_SIZE)); return size; }
|
||||
|
||||
/**
|
||||
* Get address range to which this packet belongs.
|
||||
*
|
||||
* @return Address range of this packet.
|
||||
*/
|
||||
AddrRange getAddrRange() const;
|
||||
|
||||
Addr getOffset(unsigned int blk_size) const
|
||||
{
|
||||
return getAddr() & Addr(blk_size - 1);
|
||||
|
||||
@@ -278,8 +278,7 @@ void
|
||||
PhysicalMemory::access(PacketPtr pkt)
|
||||
{
|
||||
assert(pkt->isRequest());
|
||||
AddrRange addr_range = RangeSize(pkt->getAddr(), pkt->getSize());
|
||||
const auto& m = addrMap.contains(addr_range);
|
||||
const auto& m = addrMap.contains(pkt->getAddrRange());
|
||||
assert(m != addrMap.end());
|
||||
m->second->access(pkt);
|
||||
}
|
||||
@@ -288,8 +287,7 @@ void
|
||||
PhysicalMemory::functionalAccess(PacketPtr pkt)
|
||||
{
|
||||
assert(pkt->isRequest());
|
||||
AddrRange addr_range = RangeSize(pkt->getAddr(), pkt->getSize());
|
||||
const auto& m = addrMap.contains(addr_range);
|
||||
const auto& m = addrMap.contains(pkt->getAddrRange());
|
||||
assert(m != addrMap.end());
|
||||
m->second->functionalAccess(pkt);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user