diff --git a/kernel/src/emk.c b/kernel/src/emk.c index 9589e9a..3be9c61 100644 --- a/kernel/src/emk.c +++ b/kernel/src/emk.c @@ -175,14 +175,11 @@ void emk_entry(void) acpi_init(); log_early("Initialized ACPI"); - acpi_madt_t *madt = (acpi_madt_t *)acpi_find_table("APIC"); - if (!madt) - { - kpanic(NULL, "Failed to find MADT table"); - } - - log_early("Found MADT at %p", madt); + /* Setup MADT */ + madt_init(); + log_early("Initialized APIC"); + /* Setup SMP */ if (!mp_request.response) { kpanic(NULL, "Failed to get MP request"); diff --git a/kernel/src/sys/acpi/madt.c b/kernel/src/sys/acpi/madt.c new file mode 100644 index 0000000..aed97a4 --- /dev/null +++ b/kernel/src/sys/acpi/madt.c @@ -0,0 +1,41 @@ +/* EMK 1.0 Copyright (c) 2025 Piraterna */ +#include +#include +#include + +acpi_madt_ioapic_t *madt_ioapic_list[256] = {0}; +acpi_madt_ioapic_src_ovr_t *madt_iso_list[256] = {0}; + +uint32_t madt_ioapic_len = 0; +uint32_t madt_iso_len = 0; + +uint64_t *lapic_addr = 0; + +void madt_init() +{ + acpi_madt_t *madt = (acpi_madt_t *)acpi_find_table("APIC"); + if (!madt) + { + kpanic(NULL, "Failed to find MADT table"); + } + + uint64_t offset = 0; + int i = 0; + while (1) + { + if (offset > madt->sdt.length - sizeof(acpi_madt_t)) + break; + + acpi_madt_entry_t *entry = (acpi_madt_entry_t *)(madt->table + offset); + + if (entry->type == 0) + i++; + else if (entry->type == MADT_ENTRY_IOAPIC) + madt_ioapic_list[madt_ioapic_len++] = (acpi_madt_ioapic_t *)entry; + else if (entry->type == MADT_ENTRY_IOAPIC_SRC_OVR) + madt_iso_list[madt_iso_len++] = (acpi_madt_ioapic_src_ovr_t *)entry; + else if (entry->type == MADT_ENTRY_LAPIC_ADDR_OVR) + lapic_addr = (uint64_t *)((acpi_madt_lapic_addr_ovr_t *)entry)->lapic_addr; + offset += entry->length; + } +} \ No newline at end of file diff --git a/kernel/src/sys/acpi/madt.h b/kernel/src/sys/acpi/madt.h index fb36505..64faecd 100644 --- a/kernel/src/sys/acpi/madt.h +++ b/kernel/src/sys/acpi/madt.h @@ -93,4 +93,6 @@ typedef struct acpi_madt_lx2apic uint32_t acpi_id; /* ACPI ID */ } __attribute__((packed)) acpi_madt_lx2apic_t; +void madt_init(); + #endif // MADT_H \ No newline at end of file