summaryrefslogtreecommitdiff
path: root/src/mem/physical.cc
diff options
context:
space:
mode:
authorAndreas Hansson <andreas.hansson@arm.com>2015-02-16 03:33:37 -0500
committerAndreas Hansson <andreas.hansson@arm.com>2015-02-16 03:33:37 -0500
commit57758ca685fe1a736cfdc214785b04441e83e53a (patch)
tree1a067796f7d86d824814a342464936d49cd82dea /src/mem/physical.cc
parentd0e1b8a19c6d58a49e5288938e9b12f3f10b9f51 (diff)
downloadgem5-57758ca685fe1a736cfdc214785b04441e83e53a.tar.xz
mem: Use the range cache for lookup as well as access
This patch changes the range cache used in the global physical memory to be an iterator so that we can use it not only as part of isMemAddr, but also access and functionalAccess. This matches use-cases where a core is using the atomic non-caching memory mode, and repeatedly calls isMemAddr and access. Linux boot on aarch32, with a single atomic CPU, is now more than 30% faster when using "--fastmem" compared to not using the direct memory access.
Diffstat (limited to 'src/mem/physical.cc')
-rw-r--r--src/mem/physical.cc38
1 files changed, 24 insertions, 14 deletions
diff --git a/src/mem/physical.cc b/src/mem/physical.cc
index 8eacfccb1..b5627cfa2 100644
--- a/src/mem/physical.cc
+++ b/src/mem/physical.cc
@@ -60,7 +60,7 @@ using namespace std;
PhysicalMemory::PhysicalMemory(const string& _name,
const vector<AbstractMemory*>& _memories) :
- _name(_name), size(0)
+ _name(_name), rangeCache(addrMap.end()), size(0)
{
// add the memories from the system to the address map as
// appropriate
@@ -181,7 +181,9 @@ bool
PhysicalMemory::isMemAddr(Addr addr) const
{
// see if the address is within the last matched range
- if (!rangeCache.contains(addr)) {
+ if (rangeCache != addrMap.end() && rangeCache->first.contains(addr)) {
+ return true;
+ } else {
// lookup in the interval tree
const auto& r = addrMap.find(addr);
if (r == addrMap.end()) {
@@ -189,13 +191,9 @@ PhysicalMemory::isMemAddr(Addr addr) const
return false;
}
// the range is in the tree, update the cache
- rangeCache = r->first;
+ rangeCache = r;
+ return true;
}
-
- assert(addrMap.find(addr) != addrMap.end());
-
- // either matched the cache or found in the tree
- return true;
}
AddrRangeList
@@ -239,9 +237,15 @@ PhysicalMemory::access(PacketPtr pkt)
{
assert(pkt->isRequest());
Addr addr = pkt->getAddr();
- const auto& m = addrMap.find(addr);
- assert(m != addrMap.end());
- m->second->access(pkt);
+ if (rangeCache != addrMap.end() && rangeCache->first.contains(addr)) {
+ rangeCache->second->access(pkt);
+ } else {
+ // do not update the cache here, as we typically call
+ // isMemAddr before calling access
+ const auto& m = addrMap.find(addr);
+ assert(m != addrMap.end());
+ m->second->access(pkt);
+ }
}
void
@@ -249,9 +253,15 @@ PhysicalMemory::functionalAccess(PacketPtr pkt)
{
assert(pkt->isRequest());
Addr addr = pkt->getAddr();
- const auto& m = addrMap.find(addr);
- assert(m != addrMap.end());
- m->second->functionalAccess(pkt);
+ if (rangeCache != addrMap.end() && rangeCache->first.contains(addr)) {
+ rangeCache->second->functionalAccess(pkt);
+ } else {
+ // do not update the cache here, as we typically call
+ // isMemAddr before calling functionalAccess
+ const auto& m = addrMap.find(addr);
+ assert(m != addrMap.end());
+ m->second->functionalAccess(pkt);
+ }
}
void