From 91a88ae8cee76afb2cd1dcf6e64bd84a9223703c Mon Sep 17 00:00:00 2001 From: Korey Sewell Date: Sun, 19 Jun 2011 21:43:41 -0400 Subject: inorder: clear fetchbuffer on traps implement clearfetchbufferfunction extend predecoder to use multiple threads and clear those on trap --- src/cpu/inorder/resources/fetch_unit.cc | 44 +++++++++++++++++++++++++++------ src/cpu/inorder/resources/fetch_unit.hh | 4 ++- 2 files changed, 39 insertions(+), 9 deletions(-) (limited to 'src/cpu/inorder/resources') diff --git a/src/cpu/inorder/resources/fetch_unit.cc b/src/cpu/inorder/resources/fetch_unit.cc index 85411ae28..8ba6bdc9a 100644 --- a/src/cpu/inorder/resources/fetch_unit.cc +++ b/src/cpu/inorder/resources/fetch_unit.cc @@ -57,9 +57,11 @@ FetchUnit::FetchUnit(string res_name, int res_id, int res_width, int res_latency, InOrderCPU *_cpu, ThePipeline::Params *params) : CacheUnit(res_name, res_id, res_width, res_latency, _cpu, params), - instSize(sizeof(TheISA::MachInst)), fetchBuffSize(params->fetchBuffSize), - predecoder(NULL) -{ } + instSize(sizeof(TheISA::MachInst)), fetchBuffSize(params->fetchBuffSize) +{ + for (int tid = 0; tid < MaxThreads; tid++) + predecoder[tid] = new Predecoder(NULL); +} FetchUnit::~FetchUnit() { @@ -109,10 +111,10 @@ FetchUnit::createMachInst(std::list::iterator fetch_it, MachInst mach_inst = TheISA::gtoh(fetchInsts[fetch_offset]); - predecoder.setTC(cpu->thread[tid]->getTC()); - predecoder.moreBytes(instPC, inst->instAddr(), mach_inst); - assert(predecoder.extMachInstReady()); - ext_inst = predecoder.getExtMachInst(instPC); + predecoder[tid]->setTC(cpu->thread[tid]->getTC()); + predecoder[tid]->moreBytes(instPC, inst->instAddr(), mach_inst); + assert(predecoder[tid]->extMachInstReady()); + ext_inst = predecoder[tid]->getExtMachInst(instPC); inst->pcState(instPC); inst->setMachInst(ext_inst); @@ -230,6 +232,22 @@ FetchUnit::blocksInUse() return cnt; } +void +FetchUnit::clearFetchBuffer() +{ + std::list::iterator fetch_it = fetchBuffer.begin(); + std::list::iterator end_it = fetchBuffer.end(); + + while (fetch_it != end_it) { + if ((*fetch_it)->block) { + delete [] (*fetch_it)->block; + } + delete *fetch_it; + fetch_it++; + } + fetchBuffer.clear(); +} + void FetchUnit::execute(int slot_num) { @@ -563,5 +581,15 @@ void FetchUnit::trap(Fault fault, ThreadID tid, DynInstPtr inst) { //@todo: per thread? - predecoder.reset(); + predecoder[tid]->reset(); + + //@todo: squash using dummy inst seq num + squash(NULL, NumStages - 1, 0, tid); + + //@todo: make sure no blocks are in use + assert(blocksInUse() == 0); + assert(pendingFetch.size() == 0); + + //@todo: clear pendingFetch and fetchBuffer + clearFetchBuffer(); } diff --git a/src/cpu/inorder/resources/fetch_unit.hh b/src/cpu/inorder/resources/fetch_unit.hh index 6c0b4871b..250e53e6c 100644 --- a/src/cpu/inorder/resources/fetch_unit.hh +++ b/src/cpu/inorder/resources/fetch_unit.hh @@ -120,11 +120,13 @@ class FetchUnit : public CacheUnit int blocksInUse(); + void clearFetchBuffer(); + int instSize; int fetchBuffSize; - TheISA::Predecoder predecoder; + TheISA::Predecoder *predecoder[ThePipeline::MaxThreads]; /** Valid Cache Blocks*/ std::list fetchBuffer; -- cgit v1.2.3