major refactorings

Signed-off-by: kaguya3311 <kaguya3311@national.shitposting.agency>
This commit is contained in:
kaguya
2026-05-18 04:02:59 -04:00
parent f7aa6f913a
commit b28a6bcf29
211 changed files with 17699 additions and 8107 deletions
+68
View File
@@ -0,0 +1,68 @@
#include <uacpi/tables.h>
#include "madt.h"
#include <stddef.h>
#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;
}
}
}