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
|
||||
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);
|
||||
}
|
||||
|
||||
|
|
|
@ -33,7 +33,43 @@
|
|||
void
|
||||
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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue