SPARC: Keep a copy of the current ASI in the decoder.
Committed by: Nilay Vaish <nilay@cs.wisc.edu>
This commit is contained in:
parent
a83e74b37a
commit
63b10907ef
5 changed files with 15 additions and 6 deletions
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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));
|
||||
|
|
Loading…
Reference in a new issue