x86: Add support for checking the raw state of an interrupt
authorAndreas Sandberg <andreas@sandberg.pp.se>
Wed, 18 Sep 2013 09:28:27 +0000 (11:28 +0200)
committerAndreas Sandberg <andreas@sandberg.pp.se>
Wed, 18 Sep 2013 09:28:27 +0000 (11:28 +0200)
In order to support hardware virtualization, we need to be able to
check if there are any interrupts pending irregardless of the
rflags.intf value. This changeset adds the checkInterruptsRaw() method
to the x86 interrupt control. It returns true if there are pending
interrupts that can be delivered as soon as the CPU is ready for
interrupt delivery.

src/arch/x86/interrupts.cc
src/arch/x86/interrupts.hh

index afed9c132b5cac441693121334f18b56ed97409c..ca765782e366359225e666cc2e7c5a207898ddfc 100644 (file)
@@ -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)
 {
index da0d767fdc7c0d9f9fa72cca3344ce3a88322ceb..8997d7402be36a3016b7a4616166368522c82aee 100644 (file)
@@ -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);