SPARC: Keep a copy of the current ASI in the decoder.

Committed by: Nilay Vaish <nilay@cs.wisc.edu>
This commit is contained in:
Gabe Black 2013-01-04 18:09:45 -06:00
parent a83e74b37a
commit 63b10907ef
5 changed files with 15 additions and 6 deletions

View file

@ -49,9 +49,10 @@ class Decoder
// The extended machine instruction being generated
ExtMachInst emi;
bool instDone;
MiscReg asi;
public:
Decoder(ThreadContext * _tc) : tc(_tc), instDone(false)
Decoder(ThreadContext * _tc) : tc(_tc), instDone(false), asi(0)
{}
ThreadContext *
@ -86,8 +87,7 @@ class Decoder
// into all the execute functions
if (inst & (1 << 13)) {
emi |= (static_cast<ExtMachInst>(
tc->readMiscRegNoEffect(MISCREG_ASI))
<< (sizeof(MachInst) * 8));
asi << (sizeof(MachInst) * 8)));
} else {
emi |= (static_cast<ExtMachInst>(bits(inst, 12, 5))
<< (sizeof(MachInst) * 8));
@ -107,6 +107,12 @@ class Decoder
return instDone;
}
void
setContext(MiscReg _asi)
{
asi = _asi;
}
protected:
/// A cache of decoded instruction objects.
static GenericISA::BasicDecodeCache defaultCache;

View file

@ -549,6 +549,9 @@ ISA::setMiscReg(int miscReg, MiscReg val, ThreadContext * tc)
MiscReg new_val = val;
switch (miscReg) {
case MISCREG_ASI:
tc->getDecodePtr()->setContext(val);
break;
case MISCREG_STICK:
case MISCREG_TICK:
// stick and tick are same thing on niagra

View file

@ -145,7 +145,7 @@ SparcLiveProcess::initState()
// Set the trap level to 0
tc->setMiscRegNoEffect(MISCREG_TL, 0);
// Set the ASI register to something fixed
tc->setMiscRegNoEffect(MISCREG_ASI, ASI_PRIMARY);
tc->setMiscReg(MISCREG_ASI, ASI_PRIMARY);
/*
* T1 specific registers

View file

@ -94,7 +94,7 @@ copyMiscRegs(ThreadContext *src, ThreadContext *dest)
// src->readMiscRegNoEffect(MISCREG_Y));
// dest->setMiscRegNoEffect(MISCREG_CCR,
// src->readMiscRegNoEffect(MISCREG_CCR));
dest->setMiscRegNoEffect(MISCREG_ASI,
dest->setMiscReg(MISCREG_ASI,
src->readMiscRegNoEffect(MISCREG_ASI));
dest->setMiscRegNoEffect(MISCREG_TICK,
src->readMiscRegNoEffect(MISCREG_TICK));

View file

@ -810,7 +810,7 @@ cloneFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
ctc->setMiscReg(MISCREG_CWP, 0);
ctc->setIntReg(NumIntArchRegs + 7, 0);
ctc->setMiscRegNoEffect(MISCREG_TL, 0);
ctc->setMiscRegNoEffect(MISCREG_ASI, ASI_PRIMARY);
ctc->setMiscReg(MISCREG_ASI, ASI_PRIMARY);
for (int y = 8; y < 32; y++)
ctc->setIntReg(y, tc->readIntReg(y));