From d9a5f8e3c0698aefd80f16cf91ea31b6fbf5435f Mon Sep 17 00:00:00 2001 From: Kevin Alavik Date: Sat, 17 May 2025 12:47:15 +0200 Subject: [PATCH] feat/kernel: idek --- kernel/src/arch/idt.c | 16 ++++++++++------ kernel/src/emk.c | 22 +++++++++++----------- kernel/src/sys/ioapic.c | 10 ++++++++++ 3 files changed, 31 insertions(+), 17 deletions(-) diff --git a/kernel/src/arch/idt.c b/kernel/src/arch/idt.c index cb515b2..6557771 100644 --- a/kernel/src/arch/idt.c +++ b/kernel/src/arch/idt.c @@ -60,12 +60,16 @@ void idt_init() int idt_register_handler(size_t vector, idt_intr_handler handler) { - if (real_handlers[vector] != idt_default_interrupt_handler) + if (vector >= 256 || handler == NULL) + return 1; + + real_handlers[vector] = handler; + + if (vector >= 32 && vector < 48) { - real_handlers[vector] = handler; - if (vector <= 14) - ioapic_redirect_irq(bootstrap_lapic_id, vector + 32, vector, false); - return 0; + size_t irq = vector - 32; + ioapic_redirect_irq(bootstrap_lapic_id, vector, irq, false); } - return 1; + + return 0; } \ No newline at end of file diff --git a/kernel/src/emk.c b/kernel/src/emk.c index cf66cb0..9fdda5d 100644 --- a/kernel/src/emk.c +++ b/kernel/src/emk.c @@ -72,7 +72,7 @@ void timer_init() outb(0x43, 0x36); outb(0x40, divisor & 0xFF); outb(0x40, (divisor >> 8) & 0xFF); - idt_register_handler(0x32, tick); + idt_register_handler(32, tick); } void emk_entry(void) @@ -185,6 +185,16 @@ void emk_entry(void) kfree(c); log_early("Initialized kernel heap"); + /* Setup SMP */ + if (!mp_request.response) + { + kpanic(NULL, "Failed to get MP request"); + } + + mp_response = mp_request.response; + smp_init(); + log_early("Initialized SMP"); + /* Setup ACPI and APIC */ rsdp_response = rsdp_request.response; if (!rsdp_response) @@ -204,15 +214,5 @@ void emk_entry(void) /* Setup timer */ timer_init(); - /* Setup SMP */ - if (!mp_request.response) - { - kpanic(NULL, "Failed to get MP request"); - } - - mp_response = mp_request.response; - smp_init(); - log_early("Initialized SMP"); - hlt(); } \ No newline at end of file diff --git a/kernel/src/sys/ioapic.c b/kernel/src/sys/ioapic.c index 00272d4..6fef089 100644 --- a/kernel/src/sys/ioapic.c +++ b/kernel/src/sys/ioapic.c @@ -1,6 +1,7 @@ /* EMK 1.0 Copyright (c) 2025 Piraterna */ #include #include +#include void ioapic_init() { @@ -134,6 +135,8 @@ void ioapic_redirect_gsi(uint32_t lapic_id, uint8_t vec, uint32_t gsi, uint16_t void ioapic_redirect_irq(uint32_t lapic_id, uint8_t vec, uint8_t irq, bool mask) { + log_early("IOAPIC redirect: IRQ=%u -> Vector=0x%X (mask=%s)", irq, vec, mask ? "true" : "false"); + for (uint32_t idx = 0; idx < madt_iso_len; idx++) { if (!madt_iso_list[idx]) @@ -142,13 +145,20 @@ void ioapic_redirect_irq(uint32_t lapic_id, uint8_t vec, uint8_t irq, bool mask) } acpi_madt_ioapic_src_ovr_t *iso = madt_iso_list[idx]; + + log_early(" ISO override found: irq_source=%u, gsi=%u, flags=0x%X", + iso->irq_source, iso->gsi, iso->flags); + if (iso->irq_source == irq) { + log_early(" Match found. Redirecting IRQ %u (GSI %u) to vector 0x%X", + irq, iso->gsi, vec); ioapic_redirect_gsi(lapic_id, vec, iso->gsi, iso->flags, mask); return; } } + log_early(" No ISO match. Redirecting IRQ %u directly to vector 0x%X", irq, vec); ioapic_redirect_gsi(lapic_id, vec, irq, 0, mask); }