diff options
author | Nikos Nikoleris <nikos.nikoleris@arm.com> | 2016-08-12 14:11:45 +0100 |
---|---|---|
committer | Nikos Nikoleris <nikos.nikoleris@arm.com> | 2016-08-12 14:11:45 +0100 |
commit | ee7d8fdcb2226139fd1d6a6f0cde987721ea3699 (patch) | |
tree | 961223d93cd98093c18b7df8ae67d5399c38061c /src/mem/snoop_filter.cc | |
parent | 080d4e08d627b5b726afec71d38370373b7376c5 (diff) | |
download | gem5-ee7d8fdcb2226139fd1d6a6f0cde987721ea3699.tar.xz |
mem: Add support for secure packets in the snoop filter
Secure and non-secure data can coexist in the cache and therefore the
snoop filter should treat differently packets with secure and non
secure accesses. This patch uses the lower bits of the line address to
keep track of whether the packet is addressing secure memory or not.
Change-Id: I54a5e614dad566a5083582bede86c86896f2c2c1
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
Reviewed-by: Stephan Diestelhorst <stephan.diestelhorst@arm.com>
Reviewed-by: Tony Gutierrez <anthony.gutierrez@amd.com>
Diffstat (limited to 'src/mem/snoop_filter.cc')
-rwxr-xr-x | src/mem/snoop_filter.cc | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/src/mem/snoop_filter.cc b/src/mem/snoop_filter.cc index 14cdc7e07..ec96f6e8c 100755 --- a/src/mem/snoop_filter.cc +++ b/src/mem/snoop_filter.cc @@ -69,6 +69,9 @@ SnoopFilter::lookupRequest(const Packet* cpkt, const SlavePort& slave_port) bool allocate = !cpkt->req->isUncacheable() && slave_port.isSnooping() && cpkt->fromCache(); Addr line_addr = cpkt->getBlockAddr(linesize); + if (cpkt->isSecure()) { + line_addr |= LineSecure; + } SnoopMask req_port = portToMask(slave_port); reqLookupResult = cachedLocations.find(line_addr); bool is_hit = (reqLookupResult != cachedLocations.end()); @@ -146,12 +149,16 @@ SnoopFilter::lookupRequest(const Packet* cpkt, const SlavePort& slave_port) } void -SnoopFilter::finishRequest(bool will_retry, const Addr addr) +SnoopFilter::finishRequest(bool will_retry, Addr addr, bool is_secure) { if (reqLookupResult != cachedLocations.end()) { // since we rely on the caller, do a basic check to ensure // that finishRequest is being called following lookupRequest - assert(reqLookupResult->first == (addr & ~(Addr(linesize - 1)))); + Addr line_addr = (addr & ~(Addr(linesize - 1))); + if (is_secure) { + line_addr |= LineSecure; + } + assert(reqLookupResult->first == line_addr); if (will_retry) { // Undo any changes made in lookupRequest to the snoop filter // entry if the request will come again. retryItem holds @@ -175,6 +182,9 @@ SnoopFilter::lookupSnoop(const Packet* cpkt) assert(cpkt->isRequest()); Addr line_addr = cpkt->getBlockAddr(linesize); + if (cpkt->isSecure()) { + line_addr |= LineSecure; + } auto sf_it = cachedLocations.find(line_addr); bool is_hit = (sf_it != cachedLocations.end()); @@ -243,6 +253,9 @@ SnoopFilter::updateSnoopResponse(const Packet* cpkt, } Addr line_addr = cpkt->getBlockAddr(linesize); + if (cpkt->isSecure()) { + line_addr |= LineSecure; + } SnoopMask rsp_mask = portToMask(rsp_port); SnoopMask req_mask = portToMask(req_port); SnoopItem& sf_item = cachedLocations[line_addr]; @@ -289,6 +302,9 @@ SnoopFilter::updateSnoopForward(const Packet* cpkt, assert(cpkt->cacheResponding()); Addr line_addr = cpkt->getBlockAddr(linesize); + if (cpkt->isSecure()) { + line_addr |= LineSecure; + } auto sf_it = cachedLocations.find(line_addr); bool is_hit = sf_it != cachedLocations.end(); @@ -328,6 +344,9 @@ SnoopFilter::updateResponse(const Packet* cpkt, const SlavePort& slave_port) // next check if we actually allocated an entry Addr line_addr = cpkt->getBlockAddr(linesize); + if (cpkt->isSecure()) { + line_addr |= LineSecure; + } auto sf_it = cachedLocations.find(line_addr); if (sf_it == cachedLocations.end()) return; |