X86: Implement the STARTUP IPI.
This commit is contained in:
parent
d277feb925
commit
08f021aad0
2 changed files with 30 additions and 0 deletions
|
@ -282,6 +282,26 @@ namespace X86ISA
|
|||
tc->setNextMicroPC(romMicroPC(entry) + 1);
|
||||
}
|
||||
|
||||
void
|
||||
StartupInterrupt::invoke(ThreadContext *tc)
|
||||
{
|
||||
DPRINTF(Faults, "Startup interrupt with vector %#x.\n", vector);
|
||||
HandyM5Reg m5Reg = tc->readMiscReg(MISCREG_M5_REG);
|
||||
if (m5Reg.mode != LegacyMode || m5Reg.submode != RealMode) {
|
||||
panic("Startup IPI recived outside of real mode. "
|
||||
"Don't know what to do.");
|
||||
}
|
||||
|
||||
tc->setMiscReg(MISCREG_CS, vector << 8);
|
||||
tc->setMiscReg(MISCREG_CS_BASE, vector << 12);
|
||||
tc->setMiscReg(MISCREG_CS_EFF_BASE, vector << 12);
|
||||
// This has the base value pre-added.
|
||||
tc->setMiscReg(MISCREG_CS_LIMIT, 0xffff);
|
||||
|
||||
tc->setPC(tc->readMiscReg(MISCREG_CS_BASE));
|
||||
tc->setNextPC(tc->readPC() + sizeof(MachInst));
|
||||
}
|
||||
|
||||
#endif
|
||||
} // namespace X86ISA
|
||||
|
||||
|
|
|
@ -418,6 +418,16 @@ namespace X86ISA
|
|||
void invoke(ThreadContext * tc);
|
||||
};
|
||||
|
||||
class StartupInterrupt : public X86Interrupt
|
||||
{
|
||||
public:
|
||||
StartupInterrupt(uint8_t _vector) :
|
||||
X86Interrupt("Startup Interrupt", "#SIPI", _vector)
|
||||
{}
|
||||
|
||||
void invoke(ThreadContext * tc);
|
||||
};
|
||||
|
||||
class SoftwareInterrupt : public X86Interrupt
|
||||
{
|
||||
public:
|
||||
|
|
Loading…
Reference in a new issue