From 38f87dab68c809edf4cd95650c833fe82e4b800b Mon Sep 17 00:00:00 2001 From: Javier Bueno Date: Sun, 18 Nov 2018 00:50:08 +0100 Subject: mem-cache: virtual address support for prefetchers Prefetchers can be configured to operate with virtual or physical addreses. The option can be configured through the "use_virtual_addresses" parameter of the Prefetcher object. Change-Id: I4f8c3687988afecc8a91c3c5b2d44cc0580f72aa Reviewed-on: https://gem5-review.googlesource.com/c/14416 Maintainer: Nikos Nikoleris Reviewed-by: Daniel Carvalho Reviewed-by: Nikos Nikoleris --- src/mem/cache/prefetch/stride.cc | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) (limited to 'src/mem/cache/prefetch/stride.cc') diff --git a/src/mem/cache/prefetch/stride.cc b/src/mem/cache/prefetch/stride.cc index 44849cd57..5d009014e 100644 --- a/src/mem/cache/prefetch/stride.cc +++ b/src/mem/cache/prefetch/stride.cc @@ -138,19 +138,19 @@ StridePrefetcher::PCTable::~PCTable() } void -StridePrefetcher::calculatePrefetch(const PacketPtr &pkt, +StridePrefetcher::calculatePrefetch(const PrefetchInfo &pfi, std::vector &addresses) { - if (!pkt->req->hasPC()) { + if (!pfi.hasPC()) { DPRINTF(HWPrefetch, "Ignoring request with no PC.\n"); return; } // Get required packet info - Addr pkt_addr = pkt->getAddr(); - Addr pc = pkt->req->getPC(); - bool is_secure = pkt->isSecure(); - MasterID master_id = useMasterId ? pkt->req->masterId() : 0; + Addr pf_addr = pfi.getAddr(); + Addr pc = pfi.getPC(); + bool is_secure = pfi.isSecure(); + MasterID master_id = useMasterId ? pfi.getMasterId() : 0; // Get corresponding pc table PCTable* pcTable = findTable(master_id); @@ -160,7 +160,7 @@ StridePrefetcher::calculatePrefetch(const PacketPtr &pkt, if (entry != nullptr) { // Hit in table - int new_stride = pkt_addr - entry->lastAddr; + int new_stride = pf_addr - entry->lastAddr; bool stride_match = (new_stride == entry->stride); // Adjust confidence for stride entry @@ -176,11 +176,11 @@ StridePrefetcher::calculatePrefetch(const PacketPtr &pkt, } DPRINTF(HWPrefetch, "Hit: PC %x pkt_addr %x (%s) stride %d (%s), " - "conf %d\n", pc, pkt_addr, is_secure ? "s" : "ns", new_stride, - stride_match ? "match" : "change", + "conf %d\n", pc, pf_addr, is_secure ? "s" : "ns", + new_stride, stride_match ? "match" : "change", entry->confidence); - entry->lastAddr = pkt_addr; + entry->lastAddr = pf_addr; // Abort prefetch generation if below confidence threshold if (entry->confidence < threshConf) @@ -194,8 +194,8 @@ StridePrefetcher::calculatePrefetch(const PacketPtr &pkt, prefetch_stride = (new_stride < 0) ? -blkSize : blkSize; } - Addr new_addr = pkt_addr + d * prefetch_stride; - if (samePage(pkt_addr, new_addr)) { + Addr new_addr = pf_addr + d * prefetch_stride; + if (samePage(pf_addr, new_addr)) { DPRINTF(HWPrefetch, "Queuing prefetch to %#x.\n", new_addr); addresses.push_back(AddrPriority(new_addr, 0)); } else { @@ -207,7 +207,7 @@ StridePrefetcher::calculatePrefetch(const PacketPtr &pkt, } } else { // Miss in table - DPRINTF(HWPrefetch, "Miss: PC %x pkt_addr %x (%s)\n", pc, pkt_addr, + DPRINTF(HWPrefetch, "Miss: PC %x pkt_addr %x (%s)\n", pc, pf_addr, is_secure ? "s" : "ns"); StrideEntry* entry = pcTable->findVictim(pc); @@ -218,7 +218,7 @@ StridePrefetcher::calculatePrefetch(const PacketPtr &pkt, // Insert new entry's data entry->instAddr = pc; - entry->lastAddr = pkt_addr; + entry->lastAddr = pf_addr; entry->isSecure = is_secure; entry->confidence = startConf; replacementPolicy->reset(entry->replacementData); -- cgit v1.2.3