X86: Make the x86 interrupt fault kick off the interrupt microcode.

This commit is contained in:
Gabe Black 2008-10-12 22:42:10 -07:00
parent 4c19c56a77
commit 9e8e2f9ec6
2 changed files with 22 additions and 11 deletions

View file

@ -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)

View file

@ -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)
{} {}
}; };