regression: test serial port r/w.
[lunaix-os.git] / lunaix-os / hal / acpi / parser / madt_parser.c
1 #include "parser.h"
2 #include <lunaix/mm/valloc.h>
3
4 void
5 madt_parse(acpi_madt_t* madt, acpi_context* toc)
6 {
7     toc->madt.apic_addr = madt->apic_addr;
8
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;
12
13     // Cosidering only one IOAPIC present (max 24 pins)
14     toc->madt.irq_exception =
15       (acpi_intso_t**)vcalloc(24, sizeof(acpi_intso_t*));
16
17     size_t so_idx = 0;
18     while (ics_start < ics_end) {
19         acpi_ics_hdr_t* entry = (acpi_ics_hdr_t*)ics_start;
20         switch (entry->type) {
21             case ACPI_MADT_LAPIC:
22                 toc->madt.apic = (acpi_apic_t*)entry;
23                 break;
24             case ACPI_MADT_IOAPIC:
25                 toc->madt.ioapic = (acpi_ioapic_t*)entry;
26                 break;
27             case ACPI_MADT_INTSO: {
28                 acpi_intso_t* intso_tbl = (acpi_intso_t*)entry;
29                 toc->madt.irq_exception[intso_tbl->source] = intso_tbl;
30                 break;
31             }
32             default:
33                 break;
34         }
35
36         ics_start += entry->length;
37     }
38 }