#include #include "madt.h" #include #include "libk/debug.h" #include "arch/x86_64/asm/asm.h" struct madt *madt; lapic_vec_t madt_local_apics; ioapic_vec_t madt_io_apics; iso_vec_t madt_isos; nmi_vec_t madt_nmis; uintptr_t lapic_addr = 0; uintptr_t acpi_get_lapic(void) { return lapic_addr; } void madt_init(void) { vec_init(&madt_local_apics); vec_init(&madt_io_apics); vec_init(&madt_isos); vec_init(&madt_nmis); struct uacpi_table madt_table; uacpi_status st = uacpi_table_find_by_signature("APIC", &madt_table); if (uacpi_unlikely_error(st)) { panic("Could not find MADT: %s\n", uacpi_status_to_string(st)); } madt = (struct madt *)madt_table.ptr; lapic_addr = madt->local_controller_addr; kprintf("MADT: MADT at %p\n", madt); for (uint8_t *madt_ptr = (uint8_t *)madt->madt_entries_begin; (uintptr_t)madt_ptr < (uintptr_t)madt + madt->sdt.length; madt_ptr += *(madt_ptr + 1)) { switch (*(madt_ptr)) { case 0: // Processor local APIC kprintf("MADT: Got local APIC 0x%x\n", madt_local_apics.length); vec_push(&madt_local_apics, (void *)madt_ptr); break; case 1: // I/O APIC kprintf("MADT: Got IO APIC 0x%x\n", madt_io_apics.length); vec_push(&madt_io_apics, (void *)madt_ptr); break; case 2: // Interrupt source override kprintf("MADT: Got ISO 0x%x\n", madt_isos.length); vec_push(&madt_isos, (void *)madt_ptr); break; case 4: // NMI kprintf("MADT: Got NMI 0x%x\n", madt_nmis.length); vec_push(&madt_nmis, (void *)madt_ptr); break; case 5: // Local APIC address override lapic_addr = QWORD_PTR(madt_ptr + 4); break; } } }