1 #include "madt_parser.h"
2 #include <lunaix/mm/kalloc.h>
5 madt_parse(acpi_madt_t* madt, acpi_context* toc)
7 toc->madt.apic_addr = madt->apic_addr;
9 // FUTURE: make madt.{apic,ioapic} as array or linked list.
10 uint8_t* ics_start = (uint8_t*)((uintptr_t)madt + sizeof(acpi_madt_t));
11 uintptr_t ics_end = (uintptr_t)madt + madt->header.length;
13 // Cosidering only one IOAPIC present (max 24 pins)
14 // FIXME: use hash table instead
15 toc->madt.irq_exception =
16 (acpi_intso_t*)lxcalloc(24, sizeof(acpi_intso_t*));
19 while (ics_start < ics_end) {
20 acpi_ics_hdr_t* entry = (acpi_ics_hdr_t*)ics_start;
21 switch (entry->type) {
23 toc->madt.apic = (acpi_apic_t*)entry;
25 case ACPI_MADT_IOAPIC:
26 toc->madt.ioapic = (acpi_ioapic_t*)entry;
30 acpi_intso_t* intso_tbl = (acpi_intso_t*)entry;
31 toc->madt.irq_exception[intso_tbl->source] = intso_tbl;
38 ics_start += entry->length;