Merge zizzer.eecs.umich.edu:/z/m5/Bitkeeper/m5

into zizzer.eecs.umich.edu:/z/ehallnor/work/m5

--HG--
extra : convert_revision : fa4e85d5f5c783985357eb5205fcf8957f214d1e
This commit is contained in:
Erik Hallnor
2004-10-17 00:07:28 -04:00
5 changed files with 50 additions and 10 deletions

View File

@@ -400,6 +400,15 @@ SimpleCPU::copy(Addr dest)
xc->mem->read(memReq, data);
memReq->paddr = dest_addr;
xc->mem->write(memReq, data);
if (dcacheInterface) {
memReq->cmd = Copy;
memReq->completionEvent = NULL;
memReq->paddr = xc->copySrcPhysAddr;
memReq->dest = dest_addr;
memReq->size = 64;
memReq->time = curTick;
dcacheInterface->access(memReq);
}
}
return fault;
}

View File

@@ -52,7 +52,13 @@ OptCPU::OptCPU(const string &name,
numBlks(cache_size/block_size), assoc(_assoc), numSets(numBlks/assoc),
setMask(numSets - 1)
{
int log_block_size = (int)(log((double) block_size)/log(2.0));
int log_block_size = 0;
int tmp_block_size = block_size;
while (tmp_block_size > 1) {
++log_block_size;
tmp_block_size = tmp_block_size >> 1;
}
assert(1<<log_block_size == block_size);
MemReqPtr req;
trace->getNextReq(req);
refInfo.resize(numSets);
@@ -124,7 +130,7 @@ OptCPU::processSet(int set)
for (int start = assoc/2; start >= 0; --start) {
heapify(set,start);
}
verifyHeap(set,0);
//verifyHeap(set,0);
for (; i < refInfo[set].size(); ++i) {
RefIndex cache_index = lookupValue(refInfo[set][i].addr);
@@ -134,8 +140,11 @@ OptCPU::processSet(int set)
// replace from cacheHeap[0]
// mark replaced block as absent
setValue(refInfo[set][cacheHeap[0]].addr, -1);
setValue(refInfo[set][i].addr, 0);
cacheHeap[0] = i;
heapify(set, 0);
// Make sure its in the cache
assert(lookupValue(refInfo[set][i].addr) != -1);
} else {
// hit
hits++;
@@ -143,9 +152,11 @@ OptCPU::processSet(int set)
refInfo[set][i].addr);
assert(refInfo[set][cacheHeap[cache_index]].nextRefTime == i);
assert(heapLeft(cache_index) >= assoc);
cacheHeap[cache_index] = i;
processRankIncrease(set, cache_index);
assert(lookupValue(refInfo[set][i].addr) != -1);
}
cacheHeap[cache_index] = i;
processRankIncrease(set, cache_index);
}
}
void

View File

@@ -75,9 +75,14 @@ TraceCPU::tick()
icacheInterface->squash(nextReq->asid);
} else {
++instReqs;
nextReq->completionEvent =
new TraceCompleteEvent(nextReq, this);
icacheInterface->access(nextReq);
if (icacheInterface->doEvents()) {
nextReq->completionEvent =
new TraceCompleteEvent(nextReq, this);
icacheInterface->access(nextReq);
} else {
icacheInterface->access(nextReq);
completeRequest(nextReq);
}
}
} else {
if (dcacheInterface->isBlocked())
@@ -85,9 +90,15 @@ TraceCPU::tick()
++dataReqs;
nextReq->time = curTick;
nextReq->completionEvent =
new TraceCompleteEvent(nextReq, this);
dcacheInterface->access(nextReq);
if (dcacheInterface->doEvents()) {
nextReq->completionEvent =
new TraceCompleteEvent(nextReq, this);
dcacheInterface->access(nextReq);
} else {
dcacheInterface->access(nextReq);
completeRequest(nextReq);
}
}
nextCycle = dataTrace->getNextReq(nextReq);
}

View File

@@ -294,6 +294,10 @@ Statistics::serialize(ostream &os)
{
int exemode = themode;
SERIALIZE_SCALAR(exemode);
SERIALIZE_SCALAR(idleProcess);
SERIALIZE_SCALAR(iplLast);
SERIALIZE_SCALAR(iplLastTick);
SERIALIZE_SCALAR(lastModeTick);
}
void
@@ -301,6 +305,10 @@ Statistics::unserialize(Checkpoint *cp, const string &section)
{
int exemode;
UNSERIALIZE_SCALAR(exemode);
UNSERIALIZE_SCALAR(idleProcess);
UNSERIALIZE_SCALAR(iplLast);
UNSERIALIZE_SCALAR(iplLastTick);
UNSERIALIZE_SCALAR(lastModeTick);
themode = (cpu_mode)exemode;
}

View File

@@ -70,6 +70,7 @@ void
IdleStartEvent::process(ExecContext *xc)
{
xc->kernelStats->setIdleProcess(xc->regs.ipr[AlphaISA::IPR_PALtemp23]);
remove();
}
void