diff --git a/src/arch/x86_64/kernel.ld b/src/arch/x86_64/kernel.ld index 049c9b0..4224b6c 100755 --- a/src/arch/x86_64/kernel.ld +++ b/src/arch/x86_64/kernel.ld @@ -19,6 +19,10 @@ SECTIONS *(.rodata) } + .isrs : { + *(.isrs) + } + .bss ALIGN(0x1000) : { __bss_start = .; *(.bss) diff --git a/src/kernel/apic.cpp b/src/kernel/apic.cpp index 52646cf..c30acb0 100644 --- a/src/kernel/apic.cpp +++ b/src/kernel/apic.cpp @@ -127,7 +127,7 @@ ioapic::ioapic(uint32_t *base, uint32_t base_gsi) : for (uint8_t i = 0; i < m_num_gsi; ++i) { uint16_t flags = (i < 0x10) ? 0 : 0xf; - isr vector = isr::irq0 + i; + isr vector = isr::irq00 + i; redirect(i, vector, flags, true); } } diff --git a/src/kernel/device_manager.cpp b/src/kernel/device_manager.cpp index c344892..5fa4ca4 100644 --- a/src/kernel/device_manager.cpp +++ b/src/kernel/device_manager.cpp @@ -175,7 +175,7 @@ device_manager::load_apic(const acpi_apic *apic) case 2: { // Interrupt source override uint8_t source = kutil::read_from(p+3); - isr gsi = isr::irq0 + kutil::read_from(p+4); + isr gsi = isr::irq00 + kutil::read_from(p+4); uint16_t flags = kutil::read_from(p+8); log::debug(logs::devices, " Intr source override IRQ %d -> %d Pol %d Tri %d", diff --git a/src/kernel/interrupt_isrs.inc b/src/kernel/interrupt_isrs.inc index b9c3dd5..5a8fb8b 100644 --- a/src/kernel/interrupt_isrs.inc +++ b/src/kernel/interrupt_isrs.inc @@ -1,64 +1,109 @@ -ISR ( 0, isr0) -ISR ( 1, isr1) -ISR ( 2, isr2) -ISR ( 3, isr3) -ISR ( 4, isr4) -ISR ( 5, isr5) -ISR ( 6, isr6) -ISR ( 7, isr7) -EISR( 8, isr8) -ISR ( 9, isr9) -EISR(10, isr10) -EISR(11, isr11) -EISR(12, isr12) -EISR(13, isr13) -EISR(14, isr14) -ISR (15, isr15) -ISR (16, isr16) -ISR (17, isr17) -ISR (18, isr18) -ISR (19, isr19) -ISR (20, isr20) -ISR (21, isr21) -ISR (22, isr22) -ISR (23, isr23) -ISR (24, isr24) -ISR (25, isr25) -ISR (26, isr26) -ISR (27, isr27) -ISR (28, isr28) -ISR (29, isr29) -ISR (30, isr30) -ISR (31, isr31) +ISR (0x00, isrDivideByZero) +ISR (0x01, isrDebug) +ISR (0x02, isrNMI) +ISR (0x03, isrBreakpoint) +ISR (0x04, isrOverflow) +ISR (0x05, isrBRE) +ISR (0x06, isrInvalidOp) +ISR (0x07, isrDNA) +EISR(0x08, isrDoubleFault) +ISR (0x09, isrCoprocessor) +EISR(0x0a, isrInvalidTSS) +EISR(0x0b, isrSegmentNP) +EISR(0x0c, isrSSFault) +EISR(0x0d, isrGPFault) +EISR(0x0e, isrPageFault) +ISR (0x0f, isr15) -IRQ (64, 0, irq0) -IRQ (65, 1, irq1) -IRQ (66, 2, irq2) -IRQ (67, 3, irq3) -IRQ (68, 4, irq4) -IRQ (69, 5, irq5) -IRQ (70, 6, irq6) -IRQ (71, 7, irq7) -IRQ (72, 8, irq8) -IRQ (73, 9, irq9) -IRQ (74, 10, irq10) -IRQ (75, 11, irq11) -IRQ (76, 12, irq12) -IRQ (77, 13, irq13) -IRQ (78, 14, irq14) -IRQ (79, 15, irq15) -IRQ (80, 16, irq16) -IRQ (81, 17, irq17) -IRQ (82, 18, irq18) -IRQ (83, 19, irq19) -IRQ (84, 20, irq20) -IRQ (85, 21, irq21) -IRQ (86, 22, irq22) +ISR (0x10, isrX87FPE) +ISR (0x11, isrAlignmentChk) +ISR (0x12, isrMachineChk) +ISR (0x13, isrSIMDFPE) +ISR (0x14, isrVirt) +ISR (0x15, isr21) +ISR (0x16, isr22) +ISR (0x17, isr23) +ISR (0x18, isr24) +ISR (0x19, isr25) +ISR (0x1a, isr26) +ISR (0x1b, isr27) +ISR (0x1c, isr28) +ISR (0x1d, isr29) +ISR (0x1e, isrSecurity) +ISR (0x1f, isr31) -ISR (0x7c, isrTimer) -ISR (0x7d, isrLINT0) -ISR (0x7e, isrLINT1) -ISR (0x7f, isrSpurious) +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) + +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) + +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 (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) + +ISR (0xec, isrTimer) +ISR (0xed, isrLINT0) +ISR (0xee, isrLINT1) +ISR (0xef, isrSpurious) ISR (0xf0, isrIgnore0) ISR (0xf1, isrIgnore1) diff --git a/src/kernel/interrupts.cpp b/src/kernel/interrupts.cpp index 726e99c..9788be3 100644 --- a/src/kernel/interrupts.cpp +++ b/src/kernel/interrupts.cpp @@ -147,7 +147,7 @@ disable_legacy_pic() // Remap into ignore ISRs outb(PIC1+1, static_cast(isr::isrIgnore0)); io_wait(); - outb(PIC2+1, static_cast(isr::isrIgnore8)); io_wait(); + outb(PIC2+1, static_cast(isr::isrIgnore0)); io_wait(); // Tell PICs about each other outb(PIC1+1, 0x04); io_wait(); @@ -236,14 +236,7 @@ isr_handler(registers regs) case isr::isrIgnore5: case isr::isrIgnore6: case isr::isrIgnore7: - 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 PIC INTERRUPT %d\n", (regs.interrupt % 0xff) - 0xf0); diff --git a/src/kernel/interrupts.s b/src/kernel/interrupts.s index f9cf9b1..98cc951 100644 --- a/src/kernel/interrupts.s +++ b/src/kernel/interrupts.s @@ -118,4 +118,5 @@ irq_handler_prelude: %define ISR(i, name) EMIT_ISR name, i %define IRQ(i, q, name) EMIT_IRQ name, i +section .isrs %include "interrupt_isrs.inc"