This code may be needed in the future, so add it in now
but keep it disabled.  The special EOI handling for
interrupts may only need to be done for one kind of trigger mode.
---
 i386/i386at/ioapic.c | 19 ++++++++++++++++---
 1 file changed, 16 insertions(+), 3 deletions(-)

diff --git a/i386/i386at/ioapic.c b/i386/i386at/ioapic.c
index d0724f76..85359664 100644
--- a/i386/i386at/ioapic.c
+++ b/i386/i386at/ioapic.c
@@ -290,6 +290,17 @@ ioapic_toggle(int pin, int mask)
     ioapic_toggle_entry(apic, pin, mask);
 }
 
+#if 0
+static int
+lapic_tmr_bit(uint8_t vec)
+{
+    int i;
+
+    i = (vec & ~0x1f) >> 5;
+    return lapic->tmr[i].r & (1 << (vec & 0x1f));
+}
+#endif
+
 void
 ioapic_irq_eoi(int pin)
 {
@@ -301,11 +312,14 @@ ioapic_irq_eoi(int pin)
 
     spl_t s = simple_lock_irq(&ioapic_lock);
 
+    /* Read entry to find vector */
+    ioapic_read_entry(apic, pin, &entry.both);
+
     if (!has_irq_specific_eoi) {
+      // XXX Linux conditions on TMR bit: if 
(!lapic_tmr_bit(entry.both.vector)) {
         /* Workaround for old IOAPICs with no specific EOI */
 
         /* Mask the pin and change to edge triggered */
-        ioapic_read_entry(apic, pin, &entry.both);
         oldentry = entry;
         entry.both.mask = IOAPIC_MASK_DISABLED;
         entry.both.trigger = IOAPIC_EDGE_TRIGGERED;
@@ -313,10 +327,9 @@ ioapic_irq_eoi(int pin)
 
         /* Restore level entry */
         ioapic_write_entry(apic, pin, oldentry.both);
+      //}
     } else {
         volatile ApicIoUnit *ioapic = apic_get_ioapic(apic)->ioapic;
-
-        ioapic_read_entry(apic, pin, &entry.both);
         ioapic->eoi.r = entry.both.vector;
     }
 
-- 
2.45.2



Reply via email to