b28a6bcf29
Signed-off-by: kaguya3311 <kaguya3311@national.shitposting.agency>
68 lines
1.7 KiB
C
68 lines
1.7 KiB
C
#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;
|
|
}
|
|
}
|
|
|
|
} |