X86: Make the x86 interrupt fault kick off the interrupt microcode.
This commit is contained in:
parent
4c19c56a77
commit
9e8e2f9ec6
2 changed files with 22 additions and 11 deletions
|
@ -85,6 +85,7 @@
|
||||||
* Authors: Gabe Black
|
* Authors: Gabe Black
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "arch/x86/decoder.hh"
|
||||||
#include "arch/x86/faults.hh"
|
#include "arch/x86/faults.hh"
|
||||||
#include "base/trace.hh"
|
#include "base/trace.hh"
|
||||||
#include "config/full_system.hh"
|
#include "config/full_system.hh"
|
||||||
|
@ -112,7 +113,18 @@ namespace X86ISA
|
||||||
|
|
||||||
void X86Interrupt::invoke(ThreadContext * tc)
|
void X86Interrupt::invoke(ThreadContext * tc)
|
||||||
{
|
{
|
||||||
panic("X86 faults are not implemented!");
|
using namespace X86ISAInst::RomLabels;
|
||||||
|
HandyM5Reg m5reg = tc->readMiscRegNoEffect(MISCREG_M5_REG);
|
||||||
|
MicroPC entry;
|
||||||
|
if (m5reg.mode == LongMode) {
|
||||||
|
entry = extern_label_longModeInterrupt;
|
||||||
|
} else {
|
||||||
|
entry = extern_label_legacyModeInterrupt;
|
||||||
|
}
|
||||||
|
tc->setIntReg(INTREG_MICRO(1), vector);
|
||||||
|
tc->setIntReg(INTREG_MICRO(7), tc->readPC());
|
||||||
|
tc->setMicroPC(romMicroPC(entry));
|
||||||
|
tc->setNextMicroPC(romMicroPC(entry) + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FakeITLBFault::invoke(ThreadContext * tc)
|
void FakeITLBFault::invoke(ThreadContext * tc)
|
||||||
|
|
|
@ -137,9 +137,10 @@ namespace X86ISA
|
||||||
class X86Interrupt : public X86FaultBase
|
class X86Interrupt : public X86FaultBase
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
X86Interrupt(const char * name, const char * mnem,
|
uint8_t vector;
|
||||||
|
X86Interrupt(const char * name, const char * mnem, uint8_t _vector,
|
||||||
uint64_t _errorCode = 0) :
|
uint64_t _errorCode = 0) :
|
||||||
X86FaultBase(name, mnem, _errorCode)
|
X86FaultBase(name, mnem, _errorCode), vector(_vector)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
#if FULL_SYSTEM
|
#if FULL_SYSTEM
|
||||||
|
@ -215,10 +216,9 @@ namespace X86ISA
|
||||||
|
|
||||||
class NonMaskableInterrupt : public X86Interrupt
|
class NonMaskableInterrupt : public X86Interrupt
|
||||||
{
|
{
|
||||||
uint8_t vector;
|
|
||||||
public:
|
public:
|
||||||
NonMaskableInterrupt(uint8_t _vector) :
|
NonMaskableInterrupt(uint8_t _vector) :
|
||||||
X86Interrupt("Non Maskable Interrupt", "#NMI"), vector(_vector)
|
X86Interrupt("Non Maskable Interrupt", "#NMI", _vector)
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -352,10 +352,9 @@ namespace X86ISA
|
||||||
|
|
||||||
class ExternalInterrupt : public X86Interrupt
|
class ExternalInterrupt : public X86Interrupt
|
||||||
{
|
{
|
||||||
uint8_t vector;
|
|
||||||
public:
|
public:
|
||||||
ExternalInterrupt(uint8_t _vector) :
|
ExternalInterrupt(uint8_t _vector) :
|
||||||
X86Interrupt("External Interrupt", "#INTR"), vector(_vector)
|
X86Interrupt("External Interrupt", "#INTR", _vector)
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -363,7 +362,7 @@ namespace X86ISA
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
SystemManagementInterrupt() :
|
SystemManagementInterrupt() :
|
||||||
X86Interrupt("System Management Interrupt", "#SMI")
|
X86Interrupt("System Management Interrupt", "#SMI", 0)
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -372,15 +371,15 @@ namespace X86ISA
|
||||||
uint8_t vector;
|
uint8_t vector;
|
||||||
public:
|
public:
|
||||||
InitInterrupt(uint8_t _vector) :
|
InitInterrupt(uint8_t _vector) :
|
||||||
X86Interrupt("INIT Interrupt", "#INIT"), vector(_vector)
|
X86Interrupt("INIT Interrupt", "#INIT", _vector)
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
class SoftwareInterrupt : public X86Interrupt
|
class SoftwareInterrupt : public X86Interrupt
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
SoftwareInterrupt() :
|
SoftwareInterrupt(uint8_t _vector) :
|
||||||
X86Interrupt("Software Interrupt", "INTn")
|
X86Interrupt("Software Interrupt", "INTn", _vector)
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue