Check the response queue on functional accesses.
The response queue is not tying up an MSHR, should we change that or assume infinite storage for responses? src/mem/cache/base_cache.cc: src/mem/tport.cc: Add in functional check of retry queued packets. --HG-- extra : convert_revision : 0cb40b3a96d37a5e9eec95312d660ec6a9ce526a
This commit is contained in:
parent
6ffdc7b4d7
commit
f89b56b61a
2 changed files with 73 additions and 1 deletions
36
src/mem/cache/base_cache.cc
vendored
36
src/mem/cache/base_cache.cc
vendored
|
@ -107,6 +107,42 @@ BaseCache::CachePort::recvAtomic(Packet *pkt)
|
||||||
void
|
void
|
||||||
BaseCache::CachePort::recvFunctional(Packet *pkt)
|
BaseCache::CachePort::recvFunctional(Packet *pkt)
|
||||||
{
|
{
|
||||||
|
//Check storage here first
|
||||||
|
list<Packet *>::iterator i = drainList.begin();
|
||||||
|
list<Packet *>::iterator end = drainList.end();
|
||||||
|
for (; i != end; ++i) {
|
||||||
|
Packet * target = *i;
|
||||||
|
// If the target contains data, and it overlaps the
|
||||||
|
// probed request, need to update data
|
||||||
|
if (target->intersect(pkt)) {
|
||||||
|
uint8_t* pkt_data;
|
||||||
|
uint8_t* write_data;
|
||||||
|
int data_size;
|
||||||
|
if (target->getAddr() < pkt->getAddr()) {
|
||||||
|
int offset = pkt->getAddr() - target->getAddr();
|
||||||
|
pkt_data = pkt->getPtr<uint8_t>();
|
||||||
|
write_data = target->getPtr<uint8_t>() + offset;
|
||||||
|
data_size = target->getSize() - offset;
|
||||||
|
assert(data_size > 0);
|
||||||
|
if (data_size > pkt->getSize())
|
||||||
|
data_size = pkt->getSize();
|
||||||
|
} else {
|
||||||
|
int offset = target->getAddr() - pkt->getAddr();
|
||||||
|
pkt_data = pkt->getPtr<uint8_t>() + offset;
|
||||||
|
write_data = target->getPtr<uint8_t>();
|
||||||
|
data_size = pkt->getSize() - offset;
|
||||||
|
assert(data_size > pkt->getSize());
|
||||||
|
if (data_size > target->getSize())
|
||||||
|
data_size = target->getSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pkt->isWrite()) {
|
||||||
|
memcpy(pkt_data, write_data, data_size);
|
||||||
|
} else {
|
||||||
|
memcpy(write_data, pkt_data, data_size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
cache->doFunctionalAccess(pkt, isCpuSide);
|
cache->doFunctionalAccess(pkt, isCpuSide);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,43 @@
|
||||||
void
|
void
|
||||||
SimpleTimingPort::recvFunctional(Packet *pkt)
|
SimpleTimingPort::recvFunctional(Packet *pkt)
|
||||||
{
|
{
|
||||||
// just do an atomic access and throw away the returned latency
|
//First check queued events
|
||||||
|
std::list<Packet *>::iterator i = transmitList.begin();
|
||||||
|
std::list<Packet *>::iterator end = transmitList.end();
|
||||||
|
for (; i != end; ++i) {
|
||||||
|
Packet * target = *i;
|
||||||
|
// If the target contains data, and it overlaps the
|
||||||
|
// probed request, need to update data
|
||||||
|
if (target->intersect(pkt)) {
|
||||||
|
uint8_t* pkt_data;
|
||||||
|
uint8_t* write_data;
|
||||||
|
int data_size;
|
||||||
|
if (target->getAddr() < pkt->getAddr()) {
|
||||||
|
int offset = pkt->getAddr() - target->getAddr();
|
||||||
|
pkt_data = pkt->getPtr<uint8_t>();
|
||||||
|
write_data = target->getPtr<uint8_t>() + offset;
|
||||||
|
data_size = target->getSize() - offset;
|
||||||
|
assert(data_size > 0);
|
||||||
|
if (data_size > pkt->getSize())
|
||||||
|
data_size = pkt->getSize();
|
||||||
|
} else {
|
||||||
|
int offset = target->getAddr() - pkt->getAddr();
|
||||||
|
pkt_data = pkt->getPtr<uint8_t>() + offset;
|
||||||
|
write_data = target->getPtr<uint8_t>();
|
||||||
|
data_size = pkt->getSize() - offset;
|
||||||
|
assert(data_size > pkt->getSize());
|
||||||
|
if (data_size > target->getSize())
|
||||||
|
data_size = target->getSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pkt->isWrite()) {
|
||||||
|
memcpy(pkt_data, write_data, data_size);
|
||||||
|
} else {
|
||||||
|
memcpy(write_data, pkt_data, data_size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//Then just do an atomic access and throw away the returned latency
|
||||||
recvAtomic(pkt);
|
recvAtomic(pkt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue