major refactorings
Signed-off-by: kaguya3311 <kaguya3311@national.shitposting.agency>
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user