feat/kernel: idek
This commit is contained in:
parent
c10028d366
commit
d9a5f8e3c0
3 changed files with 31 additions and 17 deletions
|
@ -60,12 +60,16 @@ void idt_init()
|
||||||
|
|
||||||
int idt_register_handler(size_t vector, idt_intr_handler handler)
|
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;
|
real_handlers[vector] = handler;
|
||||||
if (vector <= 14)
|
|
||||||
ioapic_redirect_irq(bootstrap_lapic_id, vector + 32, vector, false);
|
if (vector >= 32 && vector < 48)
|
||||||
|
{
|
||||||
|
size_t irq = vector - 32;
|
||||||
|
ioapic_redirect_irq(bootstrap_lapic_id, vector, irq, false);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return 1;
|
|
||||||
}
|
|
|
@ -72,7 +72,7 @@ void timer_init()
|
||||||
outb(0x43, 0x36);
|
outb(0x43, 0x36);
|
||||||
outb(0x40, divisor & 0xFF);
|
outb(0x40, divisor & 0xFF);
|
||||||
outb(0x40, (divisor >> 8) & 0xFF);
|
outb(0x40, (divisor >> 8) & 0xFF);
|
||||||
idt_register_handler(0x32, tick);
|
idt_register_handler(32, tick);
|
||||||
}
|
}
|
||||||
|
|
||||||
void emk_entry(void)
|
void emk_entry(void)
|
||||||
|
@ -185,6 +185,16 @@ void emk_entry(void)
|
||||||
kfree(c);
|
kfree(c);
|
||||||
log_early("Initialized kernel heap");
|
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 */
|
/* Setup ACPI and APIC */
|
||||||
rsdp_response = rsdp_request.response;
|
rsdp_response = rsdp_request.response;
|
||||||
if (!rsdp_response)
|
if (!rsdp_response)
|
||||||
|
@ -204,15 +214,5 @@ void emk_entry(void)
|
||||||
/* Setup timer */
|
/* Setup timer */
|
||||||
timer_init();
|
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();
|
hlt();
|
||||||
}
|
}
|
|
@ -1,6 +1,7 @@
|
||||||
/* EMK 1.0 Copyright (c) 2025 Piraterna */
|
/* EMK 1.0 Copyright (c) 2025 Piraterna */
|
||||||
#include <sys/ioapic.h>
|
#include <sys/ioapic.h>
|
||||||
#include <boot/emk.h>
|
#include <boot/emk.h>
|
||||||
|
#include <util/log.h>
|
||||||
|
|
||||||
void ioapic_init()
|
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)
|
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++)
|
for (uint32_t idx = 0; idx < madt_iso_len; idx++)
|
||||||
{
|
{
|
||||||
if (!madt_iso_list[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];
|
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)
|
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);
|
ioapic_redirect_gsi(lapic_id, vec, iso->gsi, iso->flags, mask);
|
||||||
return;
|
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);
|
ioapic_redirect_gsi(lapic_id, vec, irq, 0, mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue