From b1a8f8d348a15470f19b5cba0ac414422b963527 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Wed, 7 Dec 2022 23:24:01 -0500 Subject: [PATCH] Handle local APIC exceptions --- src/hulk/apic.d | 9 +++++---- src/hulk/idt.d | 24 ++++++++++++++++++------ 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/src/hulk/apic.d b/src/hulk/apic.d index 3050f77..59d552e 100644 --- a/src/hulk/apic.d +++ b/src/hulk/apic.d @@ -6,6 +6,7 @@ module hulk.apic; import hulk.klog; import hulk.hurl; import hulk.acpi; +import hulk.idt; struct apic { @@ -63,9 +64,9 @@ struct apic /* Enable local APIC to receive interrupts and set spurious interrupt * vector to 0xFF. */ apic_registers.spurious_interrupt_vector.value = 0x1FFu; - apic_registers.lvt_timer.value = 0x70u | PERIODIC_MODE; - apic_registers.lvt_lint[0].value = 0x71u; - apic_registers.lvt_lint[1].value = 0x72u; + apic_registers.lvt_timer.value = idt.EXCEPTION_LAPIC_TIMER | PERIODIC_MODE; + apic_registers.lvt_lint[0].value = idt.EXCEPTION_LAPIC_LINT0; + apic_registers.lvt_lint[1].value = idt.EXCEPTION_LAPIC_LINT1; apic_registers.divide_configuration.value = 3u; } @@ -74,7 +75,7 @@ struct apic apic_registers.eoi.value = 0u; } - public static void isr() + public static void isr(ulong vector) { eoi(); } diff --git a/src/hulk/idt.d b/src/hulk/idt.d index 97095ea..192f860 100644 --- a/src/hulk/idt.d +++ b/src/hulk/idt.d @@ -8,9 +8,14 @@ import ldc.llvmasm; import hulk.fb; import hulk.console; import hulk.klog; +import hulk.apic; struct idt { + public static enum ulong EXCEPTION_LAPIC_TIMER = 0x70u; + public static enum ulong EXCEPTION_LAPIC_LINT0 = 0x71u; + public static enum ulong EXCEPTION_LAPIC_LINT1 = 0x72u; + struct idtr_t { ushort limit; @@ -94,12 +99,19 @@ struct idt public extern(C) void isr(ulong vector, ulong arg) { - console.clear(); - fb.clear(0xFF8000u); - klog.writefln("ISR %u, 0x%x", vector, arg); - __asm("cli", ""); - for (;;) + if ((idt.EXCEPTION_LAPIC_TIMER <= vector) && (vector <= idt.EXCEPTION_LAPIC_LINT1)) { - __asm("hlt", ""); + apic.isr(vector); + } + else + { + console.clear(); + fb.clear(0xFF8000u); + klog.writefln("ISR %u, 0x%x", vector, arg); + __asm("cli", ""); + for (;;) + { + __asm("hlt", ""); + } } }