2 #include <lunaix/mm/valloc.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 ptr_t ics_start = (ptr_t)madt + sizeof(acpi_madt_t);
11 ptr_t ics_end = (ptr_t)madt + madt->header.length;
13 // Cosidering only one IOAPIC present (max 24 pins)
14 toc->madt.irq_exception =
15 (acpi_intso_t**)vcalloc(24, sizeof(acpi_intso_t*));
18 while (ics_start < ics_end) {
19 acpi_ics_hdr_t* entry = __acpi_ics_hdr(ics_start);
20 switch (entry->type) {
22 toc->madt.apic = __acpi_apic(entry);
24 case ACPI_MADT_IOAPIC:
25 toc->madt.ioapic = __acpi_ioapic(entry);
27 case ACPI_MADT_INTSO: {
28 acpi_intso_t* intso_tbl = __acpi_intso(entry);
29 toc->madt.irq_exception[intso_tbl->source] = intso_tbl;
36 ics_start += entry->length;