base.cc (10024:fc10e1f9f124) | base.cc (10028:fb8c44de891a) |
---|---|
1/* 2 * Copyright (c) 2013 ARM Limited 3 * All rights reserved. 4 * 5 * The license below extends only to copyright in the software and shall 6 * not be construed as granting a license to any other intellectual 7 * property including but not limited to intellectual property relating 8 * to a hardware implementation of the functionality of the software --- 108 unchanged lines hidden (view full) --- 117 pfSquashed 118 .name(name() + ".prefetcher.num_hwpf_squashed_from_miss") 119 .desc("number of hwpf that got squashed due to a miss " 120 "aborting calculation time") 121 ; 122} 123 124inline bool | 1/* 2 * Copyright (c) 2013 ARM Limited 3 * All rights reserved. 4 * 5 * The license below extends only to copyright in the software and shall 6 * not be construed as granting a license to any other intellectual 7 * property including but not limited to intellectual property relating 8 * to a hardware implementation of the functionality of the software --- 108 unchanged lines hidden (view full) --- 117 pfSquashed 118 .name(name() + ".prefetcher.num_hwpf_squashed_from_miss") 119 .desc("number of hwpf that got squashed due to a miss " 120 "aborting calculation time") 121 ; 122} 123 124inline bool |
125BasePrefetcher::inCache(Addr addr) | 125BasePrefetcher::inCache(Addr addr, bool is_secure) |
126{ | 126{ |
127 if (cache->inCache(addr)) { | 127 if (cache->inCache(addr, is_secure)) { |
128 pfCacheHit++; 129 return true; 130 } 131 return false; 132} 133 134inline bool | 128 pfCacheHit++; 129 return true; 130 } 131 return false; 132} 133 134inline bool |
135BasePrefetcher::inMissQueue(Addr addr) | 135BasePrefetcher::inMissQueue(Addr addr, bool is_secure) |
136{ | 136{ |
137 if (cache->inMissQueue(addr)) { | 137 if (cache->inMissQueue(addr, is_secure)) { |
138 pfMSHRHit++; 139 return true; 140 } 141 return false; 142} 143 144PacketPtr 145BasePrefetcher::getPacket() --- 6 unchanged lines hidden (view full) --- 152 } 153 154 PacketPtr pkt = pf.begin()->pkt; 155 while (!pf.empty()) { 156 pkt = pf.begin()->pkt; 157 pf.pop_front(); 158 159 Addr blk_addr = pkt->getAddr() & ~(Addr)(blkSize-1); | 138 pfMSHRHit++; 139 return true; 140 } 141 return false; 142} 143 144PacketPtr 145BasePrefetcher::getPacket() --- 6 unchanged lines hidden (view full) --- 152 } 153 154 PacketPtr pkt = pf.begin()->pkt; 155 while (!pf.empty()) { 156 pkt = pf.begin()->pkt; 157 pf.pop_front(); 158 159 Addr blk_addr = pkt->getAddr() & ~(Addr)(blkSize-1); |
160 bool is_secure = pkt->isSecure(); |
|
160 | 161 |
161 if (!inCache(blk_addr) && !inMissQueue(blk_addr)) | 162 if (!inCache(blk_addr, is_secure) && !inMissQueue(blk_addr, is_secure)) |
162 // we found a prefetch, return it 163 break; 164 | 163 // we found a prefetch, return it 164 break; 165 |
165 DPRINTF(HWPrefetch, "addr 0x%x in cache, skipping\n", pkt->getAddr()); | 166 DPRINTF(HWPrefetch, "addr 0x%x (%s) in cache, skipping\n", 167 pkt->getAddr(), is_secure ? "s" : "ns"); |
166 delete pkt->req; 167 delete pkt; 168 169 if (pf.empty()) { 170 cache->deassertMemSideBusRequest(BaseCache::Request_PF); 171 return NULL; // None left, all were in cache 172 } 173 } 174 175 pfIssued++; 176 assert(pkt != NULL); | 168 delete pkt->req; 169 delete pkt; 170 171 if (pf.empty()) { 172 cache->deassertMemSideBusRequest(BaseCache::Request_PF); 173 return NULL; // None left, all were in cache 174 } 175 } 176 177 pfIssued++; 178 assert(pkt != NULL); |
177 DPRINTF(HWPrefetch, "returning 0x%x\n", pkt->getAddr()); | 179 DPRINTF(HWPrefetch, "returning 0x%x (%s)\n", pkt->getAddr(), 180 pkt->isSecure() ? "s" : "ns"); |
178 return pkt; 179} 180 181 182Tick 183BasePrefetcher::notify(PacketPtr &pkt, Tick tick) 184{ 185 if (!pkt->req->isUncacheable() && !(pkt->req->isInstFetch() && onlyData)) { 186 // Calculate the blk address 187 Addr blk_addr = pkt->getAddr() & ~(Addr)(blkSize-1); | 181 return pkt; 182} 183 184 185Tick 186BasePrefetcher::notify(PacketPtr &pkt, Tick tick) 187{ 188 if (!pkt->req->isUncacheable() && !(pkt->req->isInstFetch() && onlyData)) { 189 // Calculate the blk address 190 Addr blk_addr = pkt->getAddr() & ~(Addr)(blkSize-1); |
191 bool is_secure = pkt->isSecure(); |
|
188 189 // Check if miss is in pfq, if so remove it | 192 193 // Check if miss is in pfq, if so remove it |
190 std::list<DeferredPacket>::iterator iter = inPrefetch(blk_addr); | 194 std::list<DeferredPacket>::iterator iter = inPrefetch(blk_addr, 195 is_secure); |
191 if (iter != pf.end()) { 192 DPRINTF(HWPrefetch, "Saw a miss to a queued prefetch addr: " | 196 if (iter != pf.end()) { 197 DPRINTF(HWPrefetch, "Saw a miss to a queued prefetch addr: " |
193 "0x%x, removing it\n", blk_addr); | 198 "0x%x (%s), removing it\n", blk_addr, 199 is_secure ? "s" : "ns"); |
194 pfRemovedMSHR++; 195 delete iter->pkt->req; 196 delete iter->pkt; 197 iter = pf.erase(iter); 198 if (pf.empty()) 199 cache->deassertMemSideBusRequest(BaseCache::Request_PF); 200 } 201 --- 32 unchanged lines hidden (view full) --- 234 235 pfIdentified++; 236 237 DPRINTF(HWPrefetch, "Found a pf candidate addr: 0x%x, " 238 "inserting into prefetch queue with delay %d time %d\n", 239 addr, *delayIter, time); 240 241 // Check if it is already in the pf buffer | 200 pfRemovedMSHR++; 201 delete iter->pkt->req; 202 delete iter->pkt; 203 iter = pf.erase(iter); 204 if (pf.empty()) 205 cache->deassertMemSideBusRequest(BaseCache::Request_PF); 206 } 207 --- 32 unchanged lines hidden (view full) --- 240 241 pfIdentified++; 242 243 DPRINTF(HWPrefetch, "Found a pf candidate addr: 0x%x, " 244 "inserting into prefetch queue with delay %d time %d\n", 245 addr, *delayIter, time); 246 247 // Check if it is already in the pf buffer |
242 if (inPrefetch(addr) != pf.end()) { | 248 if (inPrefetch(addr, is_secure) != pf.end()) { |
243 pfBufferHit++; 244 DPRINTF(HWPrefetch, "Prefetch addr already in pf buffer\n"); 245 continue; 246 } 247 248 // create a prefetch memreq 249 Request *prefetchReq = new Request(*addrIter, blkSize, 0, masterId); | 249 pfBufferHit++; 250 DPRINTF(HWPrefetch, "Prefetch addr already in pf buffer\n"); 251 continue; 252 } 253 254 // create a prefetch memreq 255 Request *prefetchReq = new Request(*addrIter, blkSize, 0, masterId); |
256 if (is_secure) 257 prefetchReq->setFlags(Request::SECURE); |
|
250 prefetchReq->taskId(ContextSwitchTaskId::Prefetcher); 251 PacketPtr prefetch = 252 new Packet(prefetchReq, MemCmd::HardPFReq); 253 prefetch->allocate(); 254 prefetch->req->setThreadContext(pkt->req->contextId(), 255 pkt->req->threadId()); 256 257 // We just remove the head if we are full --- 11 unchanged lines hidden (view full) --- 269 prefetch)); 270 } 271 } 272 273 return pf.empty() ? 0 : pf.front().tick; 274} 275 276std::list<BasePrefetcher::DeferredPacket>::iterator | 258 prefetchReq->taskId(ContextSwitchTaskId::Prefetcher); 259 PacketPtr prefetch = 260 new Packet(prefetchReq, MemCmd::HardPFReq); 261 prefetch->allocate(); 262 prefetch->req->setThreadContext(pkt->req->contextId(), 263 pkt->req->threadId()); 264 265 // We just remove the head if we are full --- 11 unchanged lines hidden (view full) --- 277 prefetch)); 278 } 279 } 280 281 return pf.empty() ? 0 : pf.front().tick; 282} 283 284std::list<BasePrefetcher::DeferredPacket>::iterator |
277BasePrefetcher::inPrefetch(Addr address) | 285BasePrefetcher::inPrefetch(Addr address, bool is_secure) |
278{ 279 // Guaranteed to only be one match, we always check before inserting 280 std::list<DeferredPacket>::iterator iter; 281 for (iter = pf.begin(); iter != pf.end(); iter++) { | 286{ 287 // Guaranteed to only be one match, we always check before inserting 288 std::list<DeferredPacket>::iterator iter; 289 for (iter = pf.begin(); iter != pf.end(); iter++) { |
282 if ((iter->pkt->getAddr() & ~(Addr)(blkSize-1)) == address) { | 290 if (((*iter).pkt->getAddr() & ~(Addr)(blkSize-1)) == address && 291 (*iter).pkt->isSecure() == is_secure) { |
283 return iter; 284 } 285 } 286 return pf.end(); 287} 288 289bool 290BasePrefetcher::samePage(Addr a, Addr b) 291{ 292 return roundDown(a, TheISA::VMPageSize) == roundDown(b, TheISA::VMPageSize); 293} 294 295 | 292 return iter; 293 } 294 } 295 return pf.end(); 296} 297 298bool 299BasePrefetcher::samePage(Addr a, Addr b) 300{ 301 return roundDown(a, TheISA::VMPageSize) == roundDown(b, TheISA::VMPageSize); 302} 303 304 |