base.hh revision 8834
112396SRiken.Gohil@arm.com/* 212811Sandreas.sandberg@arm.com * Copyright (c) 2003-2005 The Regents of The University of Michigan 312396SRiken.Gohil@arm.com * All rights reserved. 412396SRiken.Gohil@arm.com * 512396SRiken.Gohil@arm.com * Redistribution and use in source and binary forms, with or without 612396SRiken.Gohil@arm.com * modification, are permitted provided that the following conditions are 712396SRiken.Gohil@arm.com * met: redistributions of source code must retain the above copyright 812396SRiken.Gohil@arm.com * notice, this list of conditions and the following disclaimer; 912396SRiken.Gohil@arm.com * redistributions in binary form must reproduce the above copyright 1012396SRiken.Gohil@arm.com * notice, this list of conditions and the following disclaimer in the 1112396SRiken.Gohil@arm.com * documentation and/or other materials provided with the distribution; 1212396SRiken.Gohil@arm.com * neither the name of the copyright holders nor the names of its 1312396SRiken.Gohil@arm.com * contributors may be used to endorse or promote products derived from 1412396SRiken.Gohil@arm.com * this software without specific prior written permission. 1512396SRiken.Gohil@arm.com * 1612396SRiken.Gohil@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1712396SRiken.Gohil@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1812396SRiken.Gohil@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1912396SRiken.Gohil@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2012396SRiken.Gohil@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2112396SRiken.Gohil@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2212396SRiken.Gohil@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2312396SRiken.Gohil@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2412396SRiken.Gohil@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2512396SRiken.Gohil@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2612396SRiken.Gohil@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2712396SRiken.Gohil@arm.com * 2812396SRiken.Gohil@arm.com * Authors: Erik Hallnor 2912396SRiken.Gohil@arm.com * Steve Reinhardt 3012396SRiken.Gohil@arm.com * Ron Dreslinski 3112396SRiken.Gohil@arm.com */ 3212396SRiken.Gohil@arm.com 3312396SRiken.Gohil@arm.com/** 3412396SRiken.Gohil@arm.com * @file 3512396SRiken.Gohil@arm.com * Declares a basic cache interface BaseCache. 3612396SRiken.Gohil@arm.com */ 3712396SRiken.Gohil@arm.com 3812396SRiken.Gohil@arm.com#ifndef __BASE_CACHE_HH__ 3912396SRiken.Gohil@arm.com#define __BASE_CACHE_HH__ 4012396SRiken.Gohil@arm.com 4112396SRiken.Gohil@arm.com#include <algorithm> 4212396SRiken.Gohil@arm.com#include <list> 4312396SRiken.Gohil@arm.com#include <string> 4412396SRiken.Gohil@arm.com#include <vector> 4512396SRiken.Gohil@arm.com 4612396SRiken.Gohil@arm.com#include "base/misc.hh" 4712396SRiken.Gohil@arm.com#include "base/statistics.hh" 4812396SRiken.Gohil@arm.com#include "base/trace.hh" 4912396SRiken.Gohil@arm.com#include "base/types.hh" 5012396SRiken.Gohil@arm.com#include "debug/Cache.hh" 5112396SRiken.Gohil@arm.com#include "debug/CachePort.hh" 5212396SRiken.Gohil@arm.com#include "mem/cache/mshr_queue.hh" 5312396SRiken.Gohil@arm.com#include "mem/mem_object.hh" 5412396SRiken.Gohil@arm.com#include "mem/packet.hh" 5512396SRiken.Gohil@arm.com#include "mem/request.hh" 5612396SRiken.Gohil@arm.com#include "mem/tport.hh" 5712396SRiken.Gohil@arm.com#include "params/BaseCache.hh" 5812396SRiken.Gohil@arm.com#include "sim/eventq.hh" 5912396SRiken.Gohil@arm.com#include "sim/full_system.hh" 6012396SRiken.Gohil@arm.com#include "sim/sim_exit.hh" 6112396SRiken.Gohil@arm.com#include "sim/system.hh" 6212396SRiken.Gohil@arm.com 6312396SRiken.Gohil@arm.comclass MSHR; 6412396SRiken.Gohil@arm.com/** 6512396SRiken.Gohil@arm.com * A basic cache interface. Implements some common functions for speed. 6612396SRiken.Gohil@arm.com */ 6712396SRiken.Gohil@arm.comclass BaseCache : public MemObject 6812396SRiken.Gohil@arm.com{ 6912396SRiken.Gohil@arm.com /** 7012396SRiken.Gohil@arm.com * Indexes to enumerate the MSHR queues. 7112396SRiken.Gohil@arm.com */ 7212396SRiken.Gohil@arm.com enum MSHRQueueIndex { 7312396SRiken.Gohil@arm.com MSHRQueue_MSHRs, 7412396SRiken.Gohil@arm.com MSHRQueue_WriteBuffer 7512396SRiken.Gohil@arm.com }; 7612396SRiken.Gohil@arm.com 7712396SRiken.Gohil@arm.com public: 7812396SRiken.Gohil@arm.com /** 7912396SRiken.Gohil@arm.com * Reasons for caches to be blocked. 8012396SRiken.Gohil@arm.com */ 8112396SRiken.Gohil@arm.com enum BlockedCause { 8212396SRiken.Gohil@arm.com Blocked_NoMSHRs = MSHRQueue_MSHRs, 8312396SRiken.Gohil@arm.com Blocked_NoWBBuffers = MSHRQueue_WriteBuffer, 8412396SRiken.Gohil@arm.com Blocked_NoTargets, 8512396SRiken.Gohil@arm.com NUM_BLOCKED_CAUSES 8612396SRiken.Gohil@arm.com }; 8712396SRiken.Gohil@arm.com 8812396SRiken.Gohil@arm.com /** 8912396SRiken.Gohil@arm.com * Reasons for cache to request a bus. 9012396SRiken.Gohil@arm.com */ 9112396SRiken.Gohil@arm.com enum RequestCause { 9212396SRiken.Gohil@arm.com Request_MSHR = MSHRQueue_MSHRs, 9312396SRiken.Gohil@arm.com Request_WB = MSHRQueue_WriteBuffer, 9412396SRiken.Gohil@arm.com Request_PF, 9512396SRiken.Gohil@arm.com NUM_REQUEST_CAUSES 9612396SRiken.Gohil@arm.com }; 9712396SRiken.Gohil@arm.com 9812396SRiken.Gohil@arm.com protected: 9912396SRiken.Gohil@arm.com 10012396SRiken.Gohil@arm.com class CachePort : public SimpleTimingPort 10112396SRiken.Gohil@arm.com { 10212396SRiken.Gohil@arm.com public: 10312396SRiken.Gohil@arm.com BaseCache *cache; 10412396SRiken.Gohil@arm.com 10512396SRiken.Gohil@arm.com protected: 10612396SRiken.Gohil@arm.com CachePort(const std::string &_name, BaseCache *_cache, 10712396SRiken.Gohil@arm.com const std::string &_label); 10812396SRiken.Gohil@arm.com 10912396SRiken.Gohil@arm.com virtual unsigned deviceBlockSize() const; 11012396SRiken.Gohil@arm.com 11112396SRiken.Gohil@arm.com bool recvRetryCommon(); 11212396SRiken.Gohil@arm.com 11312396SRiken.Gohil@arm.com typedef EventWrapper<Port, &Port::sendRetry> 11412396SRiken.Gohil@arm.com SendRetryEvent; 11512396SRiken.Gohil@arm.com 11612396SRiken.Gohil@arm.com const std::string label; 11712396SRiken.Gohil@arm.com 11812396SRiken.Gohil@arm.com public: 11912396SRiken.Gohil@arm.com void setBlocked(); 12012396SRiken.Gohil@arm.com 12112396SRiken.Gohil@arm.com void clearBlocked(); 12212396SRiken.Gohil@arm.com 12312396SRiken.Gohil@arm.com bool checkFunctional(PacketPtr pkt); 12412396SRiken.Gohil@arm.com 12512396SRiken.Gohil@arm.com bool blocked; 12612396SRiken.Gohil@arm.com 12712396SRiken.Gohil@arm.com bool mustSendRetry; 12812396SRiken.Gohil@arm.com 12912396SRiken.Gohil@arm.com void requestBus(RequestCause cause, Tick time) 13012396SRiken.Gohil@arm.com { 13112396SRiken.Gohil@arm.com DPRINTF(CachePort, "Asserting bus request for cause %d\n", cause); 13212396SRiken.Gohil@arm.com if (!waitingOnRetry) { 13312396SRiken.Gohil@arm.com schedSendEvent(time); 13412396SRiken.Gohil@arm.com } 13512396SRiken.Gohil@arm.com } 13612396SRiken.Gohil@arm.com 13712396SRiken.Gohil@arm.com void respond(PacketPtr pkt, Tick time) { 13812396SRiken.Gohil@arm.com schedSendTiming(pkt, time); 13912396SRiken.Gohil@arm.com } 14012396SRiken.Gohil@arm.com }; 14112396SRiken.Gohil@arm.com 14212396SRiken.Gohil@arm.com CachePort *cpuSidePort; 14312396SRiken.Gohil@arm.com CachePort *memSidePort; 14412396SRiken.Gohil@arm.com 14512396SRiken.Gohil@arm.com protected: 14612396SRiken.Gohil@arm.com 14712396SRiken.Gohil@arm.com /** Miss status registers */ 14812396SRiken.Gohil@arm.com MSHRQueue mshrQueue; 14912396SRiken.Gohil@arm.com 15012396SRiken.Gohil@arm.com /** Write/writeback buffer */ 15112396SRiken.Gohil@arm.com MSHRQueue writeBuffer; 15212396SRiken.Gohil@arm.com 15312396SRiken.Gohil@arm.com MSHR *allocateBufferInternal(MSHRQueue *mq, Addr addr, int size, 15412396SRiken.Gohil@arm.com PacketPtr pkt, Tick time, bool requestBus) 15512811Sandreas.sandberg@arm.com { 15612396SRiken.Gohil@arm.com MSHR *mshr = mq->allocate(addr, size, pkt, time, order++); 15712396SRiken.Gohil@arm.com 15812396SRiken.Gohil@arm.com if (mq->isFull()) { 15912396SRiken.Gohil@arm.com setBlocked((BlockedCause)mq->index); 16012811Sandreas.sandberg@arm.com } 16112396SRiken.Gohil@arm.com 16212811Sandreas.sandberg@arm.com if (requestBus) { 16312396SRiken.Gohil@arm.com requestMemSideBus((RequestCause)mq->index, time); 16412396SRiken.Gohil@arm.com } 16512396SRiken.Gohil@arm.com 16612396SRiken.Gohil@arm.com return mshr; 16712396SRiken.Gohil@arm.com } 16812396SRiken.Gohil@arm.com 16912396SRiken.Gohil@arm.com void markInServiceInternal(MSHR *mshr, PacketPtr pkt) 17012396SRiken.Gohil@arm.com { 17112396SRiken.Gohil@arm.com MSHRQueue *mq = mshr->queue; 17212396SRiken.Gohil@arm.com bool wasFull = mq->isFull(); 17312396SRiken.Gohil@arm.com mq->markInService(mshr, pkt); 17412396SRiken.Gohil@arm.com if (wasFull && !mq->isFull()) { 17512396SRiken.Gohil@arm.com clearBlocked((BlockedCause)mq->index); 17612396SRiken.Gohil@arm.com } 17712396SRiken.Gohil@arm.com } 17812396SRiken.Gohil@arm.com 17912396SRiken.Gohil@arm.com /** Block size of this cache */ 18012396SRiken.Gohil@arm.com const unsigned blkSize; 18112396SRiken.Gohil@arm.com 18212396SRiken.Gohil@arm.com /** 18312396SRiken.Gohil@arm.com * The latency of a hit in this device. 18412396SRiken.Gohil@arm.com */ 18512396SRiken.Gohil@arm.com int hitLatency; 18612396SRiken.Gohil@arm.com 18712396SRiken.Gohil@arm.com /** The number of targets for each MSHR. */ 18812396SRiken.Gohil@arm.com const int numTarget; 18912396SRiken.Gohil@arm.com 19012396SRiken.Gohil@arm.com /** Do we forward snoops from mem side port through to cpu side port? */ 19112396SRiken.Gohil@arm.com bool forwardSnoops; 19212396SRiken.Gohil@arm.com 19312396SRiken.Gohil@arm.com /** Is this cache a toplevel cache (e.g. L1, I/O cache). If so we should 19412396SRiken.Gohil@arm.com * never try to forward ownership and similar optimizations to the cpu 19512396SRiken.Gohil@arm.com * side */ 19612396SRiken.Gohil@arm.com bool isTopLevel; 19712396SRiken.Gohil@arm.com 19812396SRiken.Gohil@arm.com /** 19912396SRiken.Gohil@arm.com * Bit vector of the blocking reasons for the access path. 20012396SRiken.Gohil@arm.com * @sa #BlockedCause 20112396SRiken.Gohil@arm.com */ 20212396SRiken.Gohil@arm.com uint8_t blocked; 20312396SRiken.Gohil@arm.com 20412396SRiken.Gohil@arm.com /** Increasing order number assigned to each incoming request. */ 20512396SRiken.Gohil@arm.com uint64_t order; 20612396SRiken.Gohil@arm.com 20712396SRiken.Gohil@arm.com /** Stores time the cache blocked for statistics. */ 20812396SRiken.Gohil@arm.com Tick blockedCycle; 20912396SRiken.Gohil@arm.com 21012396SRiken.Gohil@arm.com /** Pointer to the MSHR that has no targets. */ 21112396SRiken.Gohil@arm.com MSHR *noTargetMSHR; 21212396SRiken.Gohil@arm.com 213 /** The number of misses to trigger an exit event. */ 214 Counter missCount; 215 216 /** The drain event. */ 217 Event *drainEvent; 218 219 /** 220 * The address range to which the cache responds on the CPU side. 221 * Normally this is all possible memory addresses. */ 222 Range<Addr> addrRange; 223 224 public: 225 /** System we are currently operating in. */ 226 System *system; 227 228 // Statistics 229 /** 230 * @addtogroup CacheStatistics 231 * @{ 232 */ 233 234 /** Number of hits per thread for each type of command. @sa Packet::Command */ 235 Stats::Vector hits[MemCmd::NUM_MEM_CMDS]; 236 /** Number of hits for demand accesses. */ 237 Stats::Formula demandHits; 238 /** Number of hit for all accesses. */ 239 Stats::Formula overallHits; 240 241 /** Number of misses per thread for each type of command. @sa Packet::Command */ 242 Stats::Vector misses[MemCmd::NUM_MEM_CMDS]; 243 /** Number of misses for demand accesses. */ 244 Stats::Formula demandMisses; 245 /** Number of misses for all accesses. */ 246 Stats::Formula overallMisses; 247 248 /** 249 * Total number of cycles per thread/command spent waiting for a miss. 250 * Used to calculate the average miss latency. 251 */ 252 Stats::Vector missLatency[MemCmd::NUM_MEM_CMDS]; 253 /** Total number of cycles spent waiting for demand misses. */ 254 Stats::Formula demandMissLatency; 255 /** Total number of cycles spent waiting for all misses. */ 256 Stats::Formula overallMissLatency; 257 258 /** The number of accesses per command and thread. */ 259 Stats::Formula accesses[MemCmd::NUM_MEM_CMDS]; 260 /** The number of demand accesses. */ 261 Stats::Formula demandAccesses; 262 /** The number of overall accesses. */ 263 Stats::Formula overallAccesses; 264 265 /** The miss rate per command and thread. */ 266 Stats::Formula missRate[MemCmd::NUM_MEM_CMDS]; 267 /** The miss rate of all demand accesses. */ 268 Stats::Formula demandMissRate; 269 /** The miss rate for all accesses. */ 270 Stats::Formula overallMissRate; 271 272 /** The average miss latency per command and thread. */ 273 Stats::Formula avgMissLatency[MemCmd::NUM_MEM_CMDS]; 274 /** The average miss latency for demand misses. */ 275 Stats::Formula demandAvgMissLatency; 276 /** The average miss latency for all misses. */ 277 Stats::Formula overallAvgMissLatency; 278 279 /** The total number of cycles blocked for each blocked cause. */ 280 Stats::Vector blocked_cycles; 281 /** The number of times this cache blocked for each blocked cause. */ 282 Stats::Vector blocked_causes; 283 284 /** The average number of cycles blocked for each blocked cause. */ 285 Stats::Formula avg_blocked; 286 287 /** The number of fast writes (WH64) performed. */ 288 Stats::Scalar fastWrites; 289 290 /** The number of cache copies performed. */ 291 Stats::Scalar cacheCopies; 292 293 /** Number of blocks written back per thread. */ 294 Stats::Vector writebacks; 295 296 /** Number of misses that hit in the MSHRs per command and thread. */ 297 Stats::Vector mshr_hits[MemCmd::NUM_MEM_CMDS]; 298 /** Demand misses that hit in the MSHRs. */ 299 Stats::Formula demandMshrHits; 300 /** Total number of misses that hit in the MSHRs. */ 301 Stats::Formula overallMshrHits; 302 303 /** Number of misses that miss in the MSHRs, per command and thread. */ 304 Stats::Vector mshr_misses[MemCmd::NUM_MEM_CMDS]; 305 /** Demand misses that miss in the MSHRs. */ 306 Stats::Formula demandMshrMisses; 307 /** Total number of misses that miss in the MSHRs. */ 308 Stats::Formula overallMshrMisses; 309 310 /** Number of misses that miss in the MSHRs, per command and thread. */ 311 Stats::Vector mshr_uncacheable[MemCmd::NUM_MEM_CMDS]; 312 /** Total number of misses that miss in the MSHRs. */ 313 Stats::Formula overallMshrUncacheable; 314 315 /** Total cycle latency of each MSHR miss, per command and thread. */ 316 Stats::Vector mshr_miss_latency[MemCmd::NUM_MEM_CMDS]; 317 /** Total cycle latency of demand MSHR misses. */ 318 Stats::Formula demandMshrMissLatency; 319 /** Total cycle latency of overall MSHR misses. */ 320 Stats::Formula overallMshrMissLatency; 321 322 /** Total cycle latency of each MSHR miss, per command and thread. */ 323 Stats::Vector mshr_uncacheable_lat[MemCmd::NUM_MEM_CMDS]; 324 /** Total cycle latency of overall MSHR misses. */ 325 Stats::Formula overallMshrUncacheableLatency; 326 327#if 0 328 /** The total number of MSHR accesses per command and thread. */ 329 Stats::Formula mshrAccesses[MemCmd::NUM_MEM_CMDS]; 330 /** The total number of demand MSHR accesses. */ 331 Stats::Formula demandMshrAccesses; 332 /** The total number of MSHR accesses. */ 333 Stats::Formula overallMshrAccesses; 334#endif 335 336 /** The miss rate in the MSHRs pre command and thread. */ 337 Stats::Formula mshrMissRate[MemCmd::NUM_MEM_CMDS]; 338 /** The demand miss rate in the MSHRs. */ 339 Stats::Formula demandMshrMissRate; 340 /** The overall miss rate in the MSHRs. */ 341 Stats::Formula overallMshrMissRate; 342 343 /** The average latency of an MSHR miss, per command and thread. */ 344 Stats::Formula avgMshrMissLatency[MemCmd::NUM_MEM_CMDS]; 345 /** The average latency of a demand MSHR miss. */ 346 Stats::Formula demandAvgMshrMissLatency; 347 /** The average overall latency of an MSHR miss. */ 348 Stats::Formula overallAvgMshrMissLatency; 349 350 /** The average latency of an MSHR miss, per command and thread. */ 351 Stats::Formula avgMshrUncacheableLatency[MemCmd::NUM_MEM_CMDS]; 352 /** The average overall latency of an MSHR miss. */ 353 Stats::Formula overallAvgMshrUncacheableLatency; 354 355 /** The number of times a thread hit its MSHR cap. */ 356 Stats::Vector mshr_cap_events; 357 /** The number of times software prefetches caused the MSHR to block. */ 358 Stats::Vector soft_prefetch_mshr_full; 359 360 Stats::Scalar mshr_no_allocate_misses; 361 362 /** 363 * @} 364 */ 365 366 /** 367 * Register stats for this object. 368 */ 369 virtual void regStats(); 370 371 public: 372 typedef BaseCacheParams Params; 373 BaseCache(const Params *p); 374 ~BaseCache() {} 375 376 virtual void init(); 377 378 /** 379 * Query block size of a cache. 380 * @return The block size 381 */ 382 unsigned 383 getBlockSize() const 384 { 385 return blkSize; 386 } 387 388 389 Addr blockAlign(Addr addr) const { return (addr & ~(Addr(blkSize - 1))); } 390 391 392 const Range<Addr> &getAddrRange() const { return addrRange; } 393 394 MSHR *allocateMissBuffer(PacketPtr pkt, Tick time, bool requestBus) 395 { 396 assert(!pkt->req->isUncacheable()); 397 return allocateBufferInternal(&mshrQueue, 398 blockAlign(pkt->getAddr()), blkSize, 399 pkt, time, requestBus); 400 } 401 402 MSHR *allocateWriteBuffer(PacketPtr pkt, Tick time, bool requestBus) 403 { 404 assert(pkt->isWrite() && !pkt->isRead()); 405 return allocateBufferInternal(&writeBuffer, 406 pkt->getAddr(), pkt->getSize(), 407 pkt, time, requestBus); 408 } 409 410 MSHR *allocateUncachedReadBuffer(PacketPtr pkt, Tick time, bool requestBus) 411 { 412 assert(pkt->req->isUncacheable()); 413 assert(pkt->isRead()); 414 return allocateBufferInternal(&mshrQueue, 415 pkt->getAddr(), pkt->getSize(), 416 pkt, time, requestBus); 417 } 418 419 /** 420 * Returns true if the cache is blocked for accesses. 421 */ 422 bool isBlocked() 423 { 424 return blocked != 0; 425 } 426 427 /** 428 * Marks the access path of the cache as blocked for the given cause. This 429 * also sets the blocked flag in the slave interface. 430 * @param cause The reason for the cache blocking. 431 */ 432 void setBlocked(BlockedCause cause) 433 { 434 uint8_t flag = 1 << cause; 435 if (blocked == 0) { 436 blocked_causes[cause]++; 437 blockedCycle = curTick(); 438 cpuSidePort->setBlocked(); 439 } 440 blocked |= flag; 441 DPRINTF(Cache,"Blocking for cause %d, mask=%d\n", cause, blocked); 442 } 443 444 /** 445 * Marks the cache as unblocked for the given cause. This also clears the 446 * blocked flags in the appropriate interfaces. 447 * @param cause The newly unblocked cause. 448 * @warning Calling this function can cause a blocked request on the bus to 449 * access the cache. The cache must be in a state to handle that request. 450 */ 451 void clearBlocked(BlockedCause cause) 452 { 453 uint8_t flag = 1 << cause; 454 blocked &= ~flag; 455 DPRINTF(Cache,"Unblocking for cause %d, mask=%d\n", cause, blocked); 456 if (blocked == 0) { 457 blocked_cycles[cause] += curTick() - blockedCycle; 458 cpuSidePort->clearBlocked(); 459 } 460 } 461 462 /** 463 * Request the master bus for the given cause and time. 464 * @param cause The reason for the request. 465 * @param time The time to make the request. 466 */ 467 void requestMemSideBus(RequestCause cause, Tick time) 468 { 469 memSidePort->requestBus(cause, time); 470 } 471 472 /** 473 * Clear the master bus request for the given cause. 474 * @param cause The request reason to clear. 475 */ 476 void deassertMemSideBusRequest(RequestCause cause) 477 { 478 // Obsolete... we no longer signal bus requests explicitly so 479 // we can't deassert them. Leaving this in as a no-op since 480 // the prefetcher calls it to indicate that it no longer wants 481 // to request a prefetch, and someday that might be 482 // interesting again. 483 } 484 485 virtual unsigned int drain(Event *de); 486 487 virtual bool inCache(Addr addr) = 0; 488 489 virtual bool inMissQueue(Addr addr) = 0; 490 491 void incMissCount(PacketPtr pkt) 492 { 493 assert(pkt->req->masterId() < system->maxMasters()); 494 misses[pkt->cmdToIndex()][pkt->req->masterId()]++; 495 496 if (missCount) { 497 --missCount; 498 if (missCount == 0) 499 exitSimLoop("A cache reached the maximum miss count"); 500 } 501 } 502 void incHitCount(PacketPtr pkt) 503 { 504 assert(pkt->req->masterId() < system->maxMasters()); 505 hits[pkt->cmdToIndex()][pkt->req->masterId()]++; 506 507 } 508 509}; 510 511#endif //__BASE_CACHE_HH__ 512