Initial changes to allowed DetailedCPU to work with other architectures (i.e. Sparc & MIPS)
Still need to add some code to fetch & commit stages src/cpu/o3/commit.hh: src/cpu/o3/cpu.cc: src/cpu/o3/cpu.hh: Add nextNPC read & set functions src/cpu/o3/fetch.hh: src/cpu/o3/fetch_impl.hh: Add nextNPC --HG-- extra : convert_revision : 120677547d54091411399156bd066ce5baf785f7
This commit is contained in:
parent
f06d508af0
commit
51a5b82637
5 changed files with 67 additions and 5 deletions
|
@ -26,6 +26,7 @@
|
|||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* Authors: Kevin Lim
|
||||
* Korey Sewell
|
||||
*/
|
||||
|
||||
#ifndef __CPU_O3_COMMIT_HH__
|
||||
|
@ -280,12 +281,20 @@ class DefaultCommit
|
|||
/** Sets the PC of a specific thread. */
|
||||
void setPC(uint64_t val, unsigned tid) { PC[tid] = val; }
|
||||
|
||||
/** Reads the PC of a specific thread. */
|
||||
/** Reads the next PC of a specific thread. */
|
||||
uint64_t readNextPC(unsigned tid) { return nextPC[tid]; }
|
||||
|
||||
/** Sets the next PC of a specific thread. */
|
||||
void setNextPC(uint64_t val, unsigned tid) { nextPC[tid] = val; }
|
||||
|
||||
#if THE_ISA != ALPHA_ISA
|
||||
/** Reads the next NPC of a specific thread. */
|
||||
uint64_t readNextPC(unsigned tid) { return nextNPC[tid]; }
|
||||
|
||||
/** Sets the next NPC of a specific thread. */
|
||||
void setNextPC(uint64_t val, unsigned tid) { nextNPC[tid] = val; }
|
||||
#endif
|
||||
|
||||
private:
|
||||
/** Time buffer interface. */
|
||||
TimeBuffer<TimeStruct> *timeBuffer;
|
||||
|
@ -397,6 +406,9 @@ class DefaultCommit
|
|||
/** The next PC of each thread. */
|
||||
Addr nextPC[Impl::MaxThreads];
|
||||
|
||||
/** The next NPC of each thread. */
|
||||
Addr nextNPC[Impl::MaxThreads];
|
||||
|
||||
/** The sequence number of the youngest valid instruction in the ROB. */
|
||||
InstSeqNum youngestSeqNum[Impl::MaxThreads];
|
||||
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* Authors: Kevin Lim
|
||||
* Korey Sewell
|
||||
*/
|
||||
|
||||
#include "config/full_system.hh"
|
||||
|
@ -922,6 +923,22 @@ FullO3CPU<Impl>::setNextPC(uint64_t val,unsigned tid)
|
|||
commit.setNextPC(val, tid);
|
||||
}
|
||||
|
||||
#if THE_ISA != ALPHA_ISA
|
||||
template <class Impl>
|
||||
uint64_t
|
||||
FullO3CPU<Impl>::readNextNPC(unsigned tid)
|
||||
{
|
||||
return commit.readNextNPC(tid);
|
||||
}
|
||||
|
||||
template <class Impl>
|
||||
void
|
||||
FullO3CPU<Impl>::setNextNNPC(uint64_t val,unsigned tid)
|
||||
{
|
||||
commit.setNextNPC(val, tid);
|
||||
}
|
||||
#endif
|
||||
|
||||
template <class Impl>
|
||||
typename FullO3CPU<Impl>::ListIt
|
||||
FullO3CPU<Impl>::addInst(DynInstPtr &inst)
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* Authors: Kevin Lim
|
||||
* Korey Sewell
|
||||
*/
|
||||
|
||||
#ifndef __CPU_O3_CPU_HH__
|
||||
|
@ -299,6 +300,12 @@ class FullO3CPU : public BaseFullCPU
|
|||
/** Sets the next PC of a specific thread. */
|
||||
void setNextPC(uint64_t val, unsigned tid);
|
||||
|
||||
/** Reads the next NPC of a specific thread. */
|
||||
uint64_t readNextNPC(unsigned tid);
|
||||
|
||||
/** Sets the next NPC of a specific thread. */
|
||||
void setNextNPC(uint64_t val, unsigned tid);
|
||||
|
||||
/** Function to add instruction onto the head of the list of the
|
||||
* instructions. Used when new instructions are fetched.
|
||||
*/
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* Authors: Kevin Lim
|
||||
* Korey Sewell
|
||||
*/
|
||||
|
||||
#ifndef __CPU_O3_FETCH_HH__
|
||||
|
@ -335,6 +336,15 @@ class DefaultFetch
|
|||
/** Per-thread next PC. */
|
||||
Addr nextPC[Impl::MaxThreads];
|
||||
|
||||
#if THE_ISA != ALPHA_ISA
|
||||
/** Per-thread next Next PC.
|
||||
* This is not a real register but is used for
|
||||
* architectures that use a branch-delay slot.
|
||||
* (such as MIPS or Sparc)
|
||||
*/
|
||||
Addr nextNPC[Impl::MaxThreads];
|
||||
#endif
|
||||
|
||||
/** Memory request used to access cache. */
|
||||
RequestPtr memReq[Impl::MaxThreads];
|
||||
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* Authors: Kevin Lim
|
||||
* Korey Sewell
|
||||
*/
|
||||
|
||||
#include "arch/isa_traits.hh"
|
||||
|
@ -330,6 +331,9 @@ DefaultFetch<Impl>::initStage()
|
|||
for (int tid = 0; tid < numThreads; tid++) {
|
||||
PC[tid] = cpu->readPC(tid);
|
||||
nextPC[tid] = cpu->readNextPC(tid);
|
||||
#if THE_ISA != ALPHA_ISA
|
||||
nextNPC[tid] = cpu->readNextNPC(tid);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -404,6 +408,9 @@ DefaultFetch<Impl>::takeOverFrom()
|
|||
stalls[i].commit = 0;
|
||||
PC[i] = cpu->readPC(i);
|
||||
nextPC[i] = cpu->readNextPC(i);
|
||||
#if THE_ISA != ALPHA_ISA
|
||||
nextNPC[i] = cpu->readNextNPC(i);
|
||||
#endif
|
||||
fetchStatus[i] = Running;
|
||||
}
|
||||
numInst = 0;
|
||||
|
@ -1024,7 +1031,7 @@ DefaultFetch<Impl>::fetch(bool &status_change)
|
|||
fetch_PC = next_PC;
|
||||
|
||||
if (instruction->isQuiesce()) {
|
||||
warn("%lli: Quiesce instruction encountered, halting fetch!",
|
||||
warn("cycle %lli: Quiesce instruction encountered, halting fetch!",
|
||||
curTick);
|
||||
fetchStatus[tid] = QuiescePending;
|
||||
++numInst;
|
||||
|
@ -1045,8 +1052,17 @@ DefaultFetch<Impl>::fetch(bool &status_change)
|
|||
if (fault == NoFault) {
|
||||
DPRINTF(Fetch, "[tid:%i]: Setting PC to %08p.\n",tid, next_PC);
|
||||
|
||||
#if THE_ISA == ALPHA_ISA
|
||||
PC[tid] = next_PC;
|
||||
nextPC[tid] = next_PC + instSize;
|
||||
#else
|
||||
PC[tid] = next_PC;
|
||||
nextPC[tid] = next_PC + instSize;
|
||||
nextPC[tid] = next_PC + instSize;
|
||||
|
||||
thread->setNextPC(thread->readNextNPC());
|
||||
thread->setNextNPC(thread->readNextNPC() + sizeof(MachInst));
|
||||
#endif
|
||||
} else {
|
||||
// We shouldn't be in an icache miss and also have a fault (an ITB
|
||||
// miss)
|
||||
|
@ -1089,9 +1105,9 @@ DefaultFetch<Impl>::fetch(bool &status_change)
|
|||
fetchStatus[tid] = TrapPending;
|
||||
status_change = true;
|
||||
|
||||
warn("%lli fault (%d) detected @ PC %08p", curTick, fault, PC[tid]);
|
||||
warn("cycle %lli: fault (%d) detected @ PC %08p", curTick, fault, PC[tid]);
|
||||
#else // !FULL_SYSTEM
|
||||
warn("%lli fault (%d) detected @ PC %08p", curTick, fault, PC[tid]);
|
||||
warn("cycle %lli: fault (%d) detected @ PC %08p", curTick, fault, PC[tid]);
|
||||
#endif // FULL_SYSTEM
|
||||
}
|
||||
}
|
||||
|
@ -1260,6 +1276,6 @@ int
|
|||
DefaultFetch<Impl>::branchCount()
|
||||
{
|
||||
list<unsigned>::iterator threads = (*activeThreads).begin();
|
||||
|
||||
warn("Branch Count Fetch policy unimplemented\n");
|
||||
return *threads;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue