X86: The startup IPI delivery mode is not reserved.
This commit is contained in:
parent
08f021aad0
commit
633c96bd85
3 changed files with 16 additions and 3 deletions
|
@ -282,6 +282,9 @@ X86ISA::Interrupts::requestInterrupt(uint8_t vector,
|
||||||
} else if (deliveryMode == DeliveryMode::INIT && !pendingInit) {
|
} else if (deliveryMode == DeliveryMode::INIT && !pendingInit) {
|
||||||
pendingUnmaskableInt = pendingInit = true;
|
pendingUnmaskableInt = pendingInit = true;
|
||||||
initVector = vector;
|
initVector = vector;
|
||||||
|
} else if (deliveryMode == DeliveryMode::SIPI && !pendingStartup) {
|
||||||
|
pendingUnmaskableInt = pendingStartup = true;
|
||||||
|
startupVector = vector;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cpu->wakeup();
|
cpu->wakeup();
|
||||||
|
@ -538,6 +541,7 @@ X86ISA::Interrupts::Interrupts(Params * p) :
|
||||||
pendingNmi(false), nmiVector(0),
|
pendingNmi(false), nmiVector(0),
|
||||||
pendingExtInt(false), extIntVector(0),
|
pendingExtInt(false), extIntVector(0),
|
||||||
pendingInit(false), initVector(0),
|
pendingInit(false), initVector(0),
|
||||||
|
pendingStartup(false), startupVector(0),
|
||||||
pendingUnmaskableInt(false)
|
pendingUnmaskableInt(false)
|
||||||
{
|
{
|
||||||
pioSize = PageBytes;
|
pioSize = PageBytes;
|
||||||
|
@ -587,6 +591,9 @@ X86ISA::Interrupts::getInterrupt(ThreadContext *tc)
|
||||||
} else if (pendingInit) {
|
} else if (pendingInit) {
|
||||||
DPRINTF(LocalApic, "Generated INIT fault object.\n");
|
DPRINTF(LocalApic, "Generated INIT fault object.\n");
|
||||||
return new InitInterrupt(initVector);
|
return new InitInterrupt(initVector);
|
||||||
|
} else if (pendingStartup) {
|
||||||
|
DPRINTF(LocalApic, "Generating SIPI fault object.\n");
|
||||||
|
return new StartupInterrupt(startupVector);
|
||||||
} else {
|
} else {
|
||||||
panic("pendingUnmaskableInt set, but no unmaskable "
|
panic("pendingUnmaskableInt set, but no unmaskable "
|
||||||
"ints were pending.\n");
|
"ints were pending.\n");
|
||||||
|
@ -616,8 +623,11 @@ X86ISA::Interrupts::updateIntrInfo(ThreadContext *tc)
|
||||||
} else if (pendingInit) {
|
} else if (pendingInit) {
|
||||||
DPRINTF(LocalApic, "Init sent to core.\n");
|
DPRINTF(LocalApic, "Init sent to core.\n");
|
||||||
pendingInit = false;
|
pendingInit = false;
|
||||||
|
} else if (pendingStartup) {
|
||||||
|
DPRINTF(LocalApic, "SIPI sent to core.\n");
|
||||||
|
pendingStartup = false;
|
||||||
}
|
}
|
||||||
if (!(pendingSmi || pendingNmi || pendingInit))
|
if (!(pendingSmi || pendingNmi || pendingInit || pendingStartup))
|
||||||
pendingUnmaskableInt = false;
|
pendingUnmaskableInt = false;
|
||||||
} else if (pendingExtInt) {
|
} else if (pendingExtInt) {
|
||||||
pendingExtInt = false;
|
pendingExtInt = false;
|
||||||
|
|
|
@ -129,6 +129,8 @@ class Interrupts : public BasicPioDevice, IntDev
|
||||||
uint8_t extIntVector;
|
uint8_t extIntVector;
|
||||||
bool pendingInit;
|
bool pendingInit;
|
||||||
uint8_t initVector;
|
uint8_t initVector;
|
||||||
|
bool pendingStartup;
|
||||||
|
uint8_t startupVector;
|
||||||
|
|
||||||
// This is a quick check whether any of the above (except ExtInt) are set.
|
// This is a quick check whether any of the above (except ExtInt) are set.
|
||||||
bool pendingUnmaskableInt;
|
bool pendingUnmaskableInt;
|
||||||
|
|
|
@ -57,19 +57,20 @@ namespace X86ISA
|
||||||
SMI = 2,
|
SMI = 2,
|
||||||
NMI = 4,
|
NMI = 4,
|
||||||
INIT = 5,
|
INIT = 5,
|
||||||
|
SIPI = 6,
|
||||||
ExtInt = 7,
|
ExtInt = 7,
|
||||||
NumModes
|
NumModes
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char * const names[NumModes] = {
|
static const char * const names[NumModes] = {
|
||||||
"Fixed", "LowestPriority", "SMI", "Reserved",
|
"Fixed", "LowestPriority", "SMI", "Reserved",
|
||||||
"NMI", "INIT", "Reserved", "ExtInt"
|
"NMI", "INIT", "Startup", "ExtInt"
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline bool
|
static inline bool
|
||||||
isReserved(int mode)
|
isReserved(int mode)
|
||||||
{
|
{
|
||||||
return mode == 3 || mode == 6;
|
return mode == 3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue