From e2f4dad288456faf1b49ab82265b161709802b10 Mon Sep 17 00:00:00 2001 From: "Justin C. Miller" Date: Sun, 13 Mar 2022 20:00:49 -0700 Subject: [PATCH] [kernel] Interrupt vector priority rearrangement Rearranging of the ISR vectors for eventual TPR priority. Also removed excess IRQs - if we need to support more than 64 IRQ vectors, we can add some more back in. Also clean up the legacy PIC init/masking code. --- src/kernel/interrupt_isrs.inc | 299 +++++++++------------------------- src/kernel/interrupts.cpp | 36 ++-- src/kernel/pci.cpp | 4 +- 3 files changed, 100 insertions(+), 239 deletions(-) diff --git a/src/kernel/interrupt_isrs.inc b/src/kernel/interrupt_isrs.inc index dbaf484..785f0af 100644 --- a/src/kernel/interrupt_isrs.inc +++ b/src/kernel/interrupt_isrs.inc @@ -16,11 +16,11 @@ EISR(0x0e, 3, isrPageFault) ISR (0x0f, 0, isr15) ISR (0x10, 0, isrX87FPE) -ISR (0x11, 0, isrAlignmentChk) +EISR(0x11, 0, isrAlignmentChk) ISR (0x12, 0, isrMachineChk) ISR (0x13, 0, isrSIMDFPE) ISR (0x14, 0, isrVirt) -ISR (0x15, 0, isr21) +EISR(0x15, 0, isr21) ISR (0x16, 0, isr22) ISR (0x17, 0, isr23) ISR (0x18, 0, isr24) @@ -28,238 +28,93 @@ ISR (0x19, 0, isr25) ISR (0x1a, 0, isr26) ISR (0x1b, 0, isr27) ISR (0x1c, 0, isr28) -ISR (0x1d, 0, isr29) -ISR (0x1e, 0, isrSecurity) +EISR(0x1d, 0, isr29) +EISR(0x1e, 0, isrSecurity) ISR (0x1f, 0, isr31) -IRQ (0x20, 0x00, irq00) -IRQ (0x21, 0x01, irq01) -IRQ (0x22, 0x02, irq02) -IRQ (0x23, 0x03, irq03) -IRQ (0x24, 0x04, irq04) -IRQ (0x25, 0x05, irq05) -IRQ (0x26, 0x06, irq06) -IRQ (0x27, 0x07, irq07) -IRQ (0x28, 0x08, irq08) -IRQ (0x29, 0x09, irq09) -IRQ (0x2a, 0x0a, irq0A) -IRQ (0x2b, 0x0b, irq0B) -IRQ (0x2c, 0x0c, irq0C) -IRQ (0x2d, 0x0d, irq0D) -IRQ (0x2e, 0x0e, irq0E) -IRQ (0x2f, 0x0f, irq0F) +ISR (0x20, 0, isrIgnore0) +ISR (0x21, 0, isrIgnore1) +ISR (0x22, 0, isrIgnore2) +ISR (0x23, 0, isrIgnore3) +ISR (0x24, 0, isrIgnore4) +ISR (0x25, 0, isrIgnore5) +ISR (0x26, 0, isrIgnore6) +ISR (0x27, 0, isrIgnore7) -IRQ (0x30, 0x10, irq10) -IRQ (0x31, 0x11, irq11) -IRQ (0x32, 0x12, irq12) -IRQ (0x33, 0x13, irq13) -IRQ (0x34, 0x14, irq14) -IRQ (0x35, 0x15, irq15) -IRQ (0x36, 0x16, irq16) -IRQ (0x37, 0x17, irq17) -IRQ (0x38, 0x18, irq18) -IRQ (0x39, 0x19, irq19) -IRQ (0x3a, 0x1a, irq1A) -IRQ (0x3b, 0x1b, irq1B) -IRQ (0x3c, 0x1c, irq1C) -IRQ (0x3d, 0x1d, irq1D) -IRQ (0x3e, 0x1e, irq1E) -IRQ (0x3f, 0x1f, irq1F) +ISR (0x28, 0, isrSpurious) -IRQ (0x40, 0x20, irq20) -IRQ (0x41, 0x21, irq21) -IRQ (0x42, 0x22, irq22) -IRQ (0x43, 0x23, irq23) -IRQ (0x44, 0x24, irq24) -IRQ (0x45, 0x25, irq25) -IRQ (0x46, 0x26, irq26) -IRQ (0x47, 0x27, irq27) -IRQ (0x48, 0x28, irq28) -IRQ (0x49, 0x29, irq29) -IRQ (0x4a, 0x2a, irq2A) -IRQ (0x4b, 0x2b, irq2B) -IRQ (0x4c, 0x2c, irq2C) -IRQ (0x4d, 0x2d, irq2D) -IRQ (0x4e, 0x2e, irq2E) -IRQ (0x4f, 0x2f, irq2F) +IRQ (0x30, 0x00, irq00) +IRQ (0x31, 0x01, irq01) +IRQ (0x32, 0x02, irq02) +IRQ (0x33, 0x03, irq03) +IRQ (0x34, 0x04, irq04) +IRQ (0x35, 0x05, irq05) +IRQ (0x36, 0x06, irq06) +IRQ (0x37, 0x07, irq07) +IRQ (0x38, 0x08, irq08) +IRQ (0x39, 0x09, irq09) +IRQ (0x3a, 0x0a, irq0A) +IRQ (0x3b, 0x0b, irq0B) +IRQ (0x3c, 0x0c, irq0C) +IRQ (0x3d, 0x0d, irq0D) +IRQ (0x3e, 0x0e, irq0E) +IRQ (0x3f, 0x0f, irq0F) -IRQ (0x50, 0x30, irq30) -IRQ (0x51, 0x31, irq31) -IRQ (0x52, 0x32, irq32) -IRQ (0x53, 0x33, irq33) -IRQ (0x54, 0x34, irq34) -IRQ (0x55, 0x35, irq35) -IRQ (0x56, 0x36, irq36) -IRQ (0x57, 0x37, irq37) -IRQ (0x58, 0x38, irq38) -IRQ (0x59, 0x39, irq39) -IRQ (0x5a, 0x3a, irq3A) -IRQ (0x5b, 0x3b, irq3B) -IRQ (0x5c, 0x3c, irq3C) -IRQ (0x5d, 0x3d, irq3D) -IRQ (0x5e, 0x3e, irq3E) -IRQ (0x5f, 0x3f, irq3F) +IRQ (0x40, 0x10, irq10) +IRQ (0x41, 0x11, irq11) +IRQ (0x42, 0x12, irq12) +IRQ (0x43, 0x13, irq13) +IRQ (0x44, 0x14, irq14) +IRQ (0x45, 0x15, irq15) +IRQ (0x46, 0x16, irq16) +IRQ (0x47, 0x17, irq17) +IRQ (0x48, 0x18, irq18) +IRQ (0x49, 0x19, irq19) +IRQ (0x4a, 0x1a, irq1A) +IRQ (0x4b, 0x1b, irq1B) +IRQ (0x4c, 0x1c, irq1C) +IRQ (0x4d, 0x1d, irq1D) +IRQ (0x4e, 0x1e, irq1E) +IRQ (0x4f, 0x1f, irq1F) -IRQ (0x60, 0x40, irq40) -IRQ (0x61, 0x41, irq41) -IRQ (0x62, 0x42, irq42) -IRQ (0x63, 0x43, irq43) -IRQ (0x64, 0x44, irq44) -IRQ (0x65, 0x45, irq45) -IRQ (0x66, 0x46, irq46) -IRQ (0x67, 0x47, irq47) -IRQ (0x68, 0x48, irq48) -IRQ (0x69, 0x49, irq49) -IRQ (0x6a, 0x4a, irq4A) -IRQ (0x6b, 0x4b, irq4B) -IRQ (0x6c, 0x4c, irq4C) -IRQ (0x6d, 0x4d, irq4D) -IRQ (0x6e, 0x4e, irq4E) -IRQ (0x6f, 0x4f, irq4F) +IRQ (0x50, 0x20, irq20) +IRQ (0x51, 0x21, irq21) +IRQ (0x52, 0x22, irq22) +IRQ (0x53, 0x23, irq23) +IRQ (0x54, 0x24, irq24) +IRQ (0x55, 0x25, irq25) +IRQ (0x56, 0x26, irq26) +IRQ (0x57, 0x27, irq27) +IRQ (0x58, 0x28, irq28) +IRQ (0x59, 0x29, irq29) +IRQ (0x5a, 0x2a, irq2A) +IRQ (0x5b, 0x2b, irq2B) +IRQ (0x5c, 0x2c, irq2C) +IRQ (0x5d, 0x2d, irq2D) +IRQ (0x5e, 0x2e, irq2E) +IRQ (0x5f, 0x2f, irq2F) -IRQ (0x70, 0x50, irq50) -IRQ (0x71, 0x51, irq51) -IRQ (0x72, 0x52, irq52) -IRQ (0x73, 0x53, irq53) -IRQ (0x74, 0x54, irq54) -IRQ (0x75, 0x55, irq55) -IRQ (0x76, 0x56, irq56) -IRQ (0x77, 0x57, irq57) -IRQ (0x78, 0x58, irq58) -IRQ (0x79, 0x59, irq59) -IRQ (0x7a, 0x5a, irq5A) -IRQ (0x7b, 0x5b, irq5B) -IRQ (0x7c, 0x5c, irq5C) -IRQ (0x7d, 0x5d, irq5D) -IRQ (0x7e, 0x5e, irq5E) -IRQ (0x7f, 0x5f, irq5F) - -IRQ (0x80, 0x60, irq60) -IRQ (0x81, 0x61, irq61) -IRQ (0x82, 0x62, irq62) -IRQ (0x83, 0x63, irq63) -IRQ (0x84, 0x64, irq64) -IRQ (0x85, 0x65, irq65) -IRQ (0x86, 0x66, irq66) -IRQ (0x87, 0x67, irq67) -IRQ (0x88, 0x68, irq68) -IRQ (0x89, 0x69, irq69) -IRQ (0x8a, 0x6a, irq6A) -IRQ (0x8b, 0x6b, irq6B) -IRQ (0x8c, 0x6c, irq6C) -IRQ (0x8d, 0x6d, irq6D) -IRQ (0x8e, 0x6e, irq6E) -IRQ (0x8f, 0x6f, irq6F) - -IRQ (0x90, 0x70, irq70) -IRQ (0x91, 0x71, irq71) -IRQ (0x92, 0x72, irq72) -IRQ (0x93, 0x73, irq73) -IRQ (0x94, 0x74, irq74) -IRQ (0x95, 0x75, irq75) -IRQ (0x96, 0x76, irq76) -IRQ (0x97, 0x77, irq77) -IRQ (0x98, 0x78, irq78) -IRQ (0x99, 0x79, irq79) -IRQ (0x9a, 0x7a, irq7A) -IRQ (0x9b, 0x7b, irq7B) -IRQ (0x9c, 0x7c, irq7C) -IRQ (0x9d, 0x7d, irq7D) -IRQ (0x9e, 0x7e, irq7E) -IRQ (0x9f, 0x7f, irq7F) - -IRQ (0xa0, 0x80, irq80) -IRQ (0xa1, 0x81, irq81) -IRQ (0xa2, 0x82, irq82) -IRQ (0xa3, 0x83, irq83) -IRQ (0xa4, 0x84, irq84) -IRQ (0xa5, 0x85, irq85) -IRQ (0xa6, 0x86, irq86) -IRQ (0xa7, 0x87, irq87) -IRQ (0xa8, 0x88, irq88) -IRQ (0xa9, 0x89, irq89) -IRQ (0xaa, 0x8a, irq8A) -IRQ (0xab, 0x8b, irq8B) -IRQ (0xac, 0x8c, irq8C) -IRQ (0xad, 0x8d, irq8D) -IRQ (0xae, 0x8e, irq8E) -IRQ (0xaf, 0x8f, irq8F) - -IRQ (0xb0, 0x90, irq90) -IRQ (0xb1, 0x91, irq91) -IRQ (0xb2, 0x92, irq92) -IRQ (0xb3, 0x93, irq93) -IRQ (0xb4, 0x94, irq94) -IRQ (0xb5, 0x95, irq95) -IRQ (0xb6, 0x96, irq96) -IRQ (0xb7, 0x97, irq97) -IRQ (0xb8, 0x98, irq98) -IRQ (0xb9, 0x99, irq99) -IRQ (0xba, 0x9a, irq9A) -IRQ (0xbb, 0x9b, irq9B) -IRQ (0xbc, 0x9c, irq9C) -IRQ (0xbd, 0x9d, irq9D) -IRQ (0xbe, 0x9e, irq9E) -IRQ (0xbf, 0x9f, irq9F) - -IRQ (0xc0, 0xa0, irqA0) -IRQ (0xc1, 0xa1, irqA1) -IRQ (0xc2, 0xa2, irqA2) -IRQ (0xc3, 0xa3, irqA3) -IRQ (0xc4, 0xa4, irqA4) -IRQ (0xc5, 0xa5, irqA5) -IRQ (0xc6, 0xa6, irqA6) -IRQ (0xc7, 0xa7, irqA7) -IRQ (0xc8, 0xa8, irqA8) -IRQ (0xc9, 0xa9, irqA9) -IRQ (0xca, 0xaa, irqAA) -IRQ (0xcb, 0xab, irqAB) -IRQ (0xcc, 0xac, irqAC) -IRQ (0xcd, 0xad, irqAD) -IRQ (0xce, 0xae, irqAE) -IRQ (0xcf, 0xaf, irqAF) - -IRQ (0xd0, 0xb0, irqB0) -IRQ (0xd1, 0xb1, irqB1) -IRQ (0xd2, 0xb2, irqB2) -IRQ (0xd3, 0xb3, irqB3) -IRQ (0xd4, 0xb4, irqB4) -IRQ (0xd5, 0xb5, irqB5) -IRQ (0xd6, 0xb6, irqB6) -IRQ (0xd7, 0xb7, irqB7) -IRQ (0xd8, 0xb8, irqB8) -IRQ (0xd9, 0xb9, irqB9) -IRQ (0xda, 0xba, irqBA) -IRQ (0xdb, 0xbb, irqBB) -IRQ (0xdc, 0xbc, irqBC) -IRQ (0xdd, 0xbd, irqBD) -IRQ (0xde, 0xbe, irqBE) -IRQ (0xdf, 0xbf, irqBF) +IRQ (0x60, 0x30, irq30) +IRQ (0x61, 0x31, irq31) +IRQ (0x62, 0x32, irq32) +IRQ (0x63, 0x33, irq33) +IRQ (0x64, 0x34, irq34) +IRQ (0x65, 0x35, irq35) +IRQ (0x66, 0x36, irq36) +IRQ (0x67, 0x37, irq37) +IRQ (0x68, 0x38, irq38) +IRQ (0x69, 0x39, irq39) +IRQ (0x6a, 0x3a, irq3A) +IRQ (0x6b, 0x3b, irq3B) +IRQ (0x6c, 0x3c, irq3C) +IRQ (0x6d, 0x3d, irq3D) +IRQ (0x6e, 0x3e, irq3E) +IRQ (0x6f, 0x3f, irq3F) ISR (0xe0, 0, isrTimer) ISR (0xe1, 0, isrLINT0) ISR (0xe2, 0, isrLINT1) ISR (0xe3, 0, isrAPICError) - ISR (0xe4, 0, ipiSchedule) -ISR (0xef, 0, isrSpurious) - -ISR (0xf0, 0, isrIgnore0) -ISR (0xf1, 0, isrIgnore1) -ISR (0xf2, 0, isrIgnore2) -ISR (0xf3, 0, isrIgnore3) -ISR (0xf4, 0, isrIgnore4) -ISR (0xf5, 0, isrIgnore5) -ISR (0xf6, 0, isrIgnore6) -ISR (0xf7, 0, isrIgnore7) - -ISR (0xf8, 0, isrIgnore8) -ISR (0xf9, 0, isrIgnore9) -ISR (0xfa, 0, isrIgnoreA) -ISR (0xfb, 0, isrIgnoreB) -ISR (0xfc, 0, isrIgnoreC) -ISR (0xfd, 0, isrIgnoreD) -ISR (0xfe, 0, isrIgnoreE) -ISR (0xff, 0, isrIgnoreF) diff --git a/src/kernel/interrupts.cpp b/src/kernel/interrupts.cpp index f05cd56..2752dbb 100644 --- a/src/kernel/interrupts.cpp +++ b/src/kernel/interrupts.cpp @@ -45,27 +45,33 @@ void disable_legacy_pic() { // Mask all interrupts - outb(PIC2+1, 0xfc); + outb(PIC2+1, 0xff); outb(PIC1+1, 0xff); - // Start initialization sequence - outb(PIC1, 0x11); io_wait(); - outb(PIC2, 0x11); io_wait(); + // ICW1: Start initialization sequence + outb(PIC1, 0x11); + outb(PIC2, 0x11); - // Remap into ignore ISRs - outb(PIC1+1, static_cast(isr::isrIgnore0)); io_wait(); - outb(PIC2+1, static_cast(isr::isrIgnore8)); io_wait(); + // ICW2: Remap into ignore ISRs + outb(PIC1+1, static_cast(isr::isrIgnore0)); + outb(PIC2+1, static_cast(isr::isrIgnore0)); - // Tell PICs about each other - outb(PIC1+1, 0x04); io_wait(); - outb(PIC2+1, 0x02); io_wait(); + // ICW3: Tell PICs about each other + outb(PIC1+1, 0x04); + outb(PIC2+1, 0x02); + + // ICW4: Set x86 mode + outb(PIC1+1, 0x01); + outb(PIC2+1, 0x01); } void isr_handler(cpu_state *regs) { uint8_t vector = regs->interrupt & 0xff; - if ((vector & 0xf0) == 0xf0) { + + if ((vector & 0xf8) == 0x20) { + // Vectors 0x20-0x27 are the ignore vectors *reinterpret_cast(apic_eoi_addr) = 0; return; } @@ -139,6 +145,10 @@ isr_handler(cpu_state *regs) } break; + case isr::isrSpurious: + // No EOI for the spurious interrupt + return; + case isr::isrTimer: scheduler::get().schedule(); break; @@ -151,10 +161,6 @@ isr_handler(cpu_state *regs) scheduler::get().schedule(); break; - case isr::isrSpurious: - // No EOI for the spurious interrupt - return; - default: util::format({message, sizeof(message)}, "Unknown interrupt 0x%lx", regs->interrupt); kassert(false, message, regs); diff --git a/src/kernel/pci.cpp b/src/kernel/pci.cpp index 7856bad..7e6d051 100644 --- a/src/kernel/pci.cpp +++ b/src/kernel/pci.cpp @@ -73,7 +73,7 @@ pci_device::pci_device() : m_subclass(0), m_progif(0), m_revision(0), - m_irq(isr::isrIgnoreF), + m_irq(isr::isrIgnore0), m_header_type(0) { } @@ -82,7 +82,7 @@ pci_device::pci_device(pci_group &group, uint8_t bus, uint8_t device, uint8_t fu m_base(group.base_for(bus, device, func)), m_msi(nullptr), m_bus_addr(bus_addr(bus, device, func)), - m_irq(isr::isrIgnoreF) + m_irq(isr::isrIgnore0) { m_vendor = m_base[0] & 0xffff; m_device = (m_base[0] >> 16) & 0xffff;