From 4dc9675a6c94581bd4c9e78565c3e09a9a7f30e8 Mon Sep 17 00:00:00 2001 From: "Justin C. Miller" Date: Sun, 1 Aug 2021 17:18:23 -0700 Subject: [PATCH] [kernel] Early-out earlier for ignored interrupts I was seeing more ignored interrupts when debugging, trying to shorten their path more. Adding a separate ISR for ignored interrupts was the shortest path, but that caused some strange instability that I'm not in the mood to track down. --- src/kernel/interrupt_isrs.inc | 1 - src/kernel/interrupts.cpp | 30 ++++-------------------------- 2 files changed, 4 insertions(+), 27 deletions(-) diff --git a/src/kernel/interrupt_isrs.inc b/src/kernel/interrupt_isrs.inc index 2cd76b7..6d1e700 100644 --- a/src/kernel/interrupt_isrs.inc +++ b/src/kernel/interrupt_isrs.inc @@ -241,7 +241,6 @@ ISR (0xe0, 0, isrTimer) ISR (0xe1, 0, isrLINT0) ISR (0xe2, 0, isrLINT1) ISR (0xe3, 0, isrAPICError) -ISR (0xe4, 0, isrAssert) ISR (0xef, 0, isrSpurious) diff --git a/src/kernel/interrupts.cpp b/src/kernel/interrupts.cpp index 15ac31e..b6e2bfc 100644 --- a/src/kernel/interrupts.cpp +++ b/src/kernel/interrupts.cpp @@ -83,8 +83,11 @@ disable_legacy_pic() void isr_handler(cpu_state *regs) { - console *cons = console::get(); uint8_t vector = regs->interrupt & 0xff; + if ((vector & 0xf0) == 0xf0) { + *reinterpret_cast(apic_eoi_addr) = 0; + return; + } // Clear out the IST for this vector so we just keep using // this stack @@ -169,31 +172,6 @@ isr_handler(cpu_state *regs) // No EOI for the spurious interrupt return; - case isr::isrIgnore0: - case isr::isrIgnore1: - case isr::isrIgnore2: - case isr::isrIgnore3: - case isr::isrIgnore4: - case isr::isrIgnore5: - case isr::isrIgnore6: - case isr::isrIgnore7: - //cons->printf("\nIGNORED: %02x\n", regs->interrupt); - outb(PIC1, 0x20); - break; - - case isr::isrIgnore8: - case isr::isrIgnore9: - case isr::isrIgnoreA: - case isr::isrIgnoreB: - case isr::isrIgnoreC: - case isr::isrIgnoreD: - case isr::isrIgnoreE: - case isr::isrIgnoreF: - //cons->printf("\nIGNORED: %02x\n", regs->interrupt); - outb(PIC1, 0x20); - outb(PIC2, 0x20); - break; - default: snprintf(message, sizeof(message), "Unknown interrupt 0x%x", regs->interrupt); kassert(false, message);