summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/arch/x86/interrupts.cc8
-rw-r--r--src/arch/x86/interrupts.hh7
2 files changed, 15 insertions, 0 deletions
diff --git a/src/arch/x86/interrupts.cc b/src/arch/x86/interrupts.cc
index afed9c132..ca765782e 100644
--- a/src/arch/x86/interrupts.cc
+++ b/src/arch/x86/interrupts.cc
@@ -649,6 +649,14 @@ X86ISA::Interrupts::checkInterrupts(ThreadContext *tc) const
return false;
}
+bool
+X86ISA::Interrupts::checkInterruptsRaw() const
+{
+ return pendingUnmaskableInt || pendingExtInt ||
+ (IRRV > ISRV && bits(IRRV, 7, 4) >
+ bits(regs[APIC_TASK_PRIORITY], 7, 4));
+}
+
Fault
X86ISA::Interrupts::getInterrupt(ThreadContext *tc)
{
diff --git a/src/arch/x86/interrupts.hh b/src/arch/x86/interrupts.hh
index da0d767fd..8997d7402 100644
--- a/src/arch/x86/interrupts.hh
+++ b/src/arch/x86/interrupts.hh
@@ -274,6 +274,13 @@ class Interrupts : public BasicPioDevice, IntDevice
*/
bool checkInterrupts(ThreadContext *tc) const;
+ /**
+ * Check if there are pending interrupts without ignoring the
+ * interrupts disabled flag.
+ *
+ * @return true if there are interrupts pending.
+ */
+ bool checkInterruptsRaw() const;
Fault getInterrupt(ThreadContext *tc);
void updateIntrInfo(ThreadContext *tc);