Files
vystem/docs/shelter/devs/acpi.md
2026-05-27 19:34:54 +02:00

1.7 KiB

ACPI Parsing

Shelter only support the ACPI v2 and newer ACPI specifications. That mean the XSDT pointer must exists.

Root structures parsing

The root structures parsing is defined in shelter/lib/include/devs/acpi.h and implemented in shelter/lib/src/devs/acpi.c.

The sh_acpi_parse_rsdp() function takes the RSDP and completes a sh_apci_ACPI_POINTERS_ROOT structure that look like this:

typedef struct {
  sh_uint64 rsdt;
  sh_uint64 xsdt;
} sh_apci_ACPI_POINTERS_ROOT;

Then, the sh_acpi_parse_xsdt() function takes the XSDT pointer and parses the XSDT header. It ensures that the structure isn't corrupted, and map all the entries. At the end, it completes this structure:

typedef struct {
  sh_uint64 *entries;
  sh_uint64 entry_count;
} sh_acpi_ACPI_XSDT_BODY;

Finally, the sh_acpi_parse_tables() takes the sh_acpi_ACPI_XSDT_BODY structure and parses all the entries. It ensures that at least the first pages of each table is mapped. All the tables pointers are sorted in a structure that look like this:

typedef struct {
  sh_uint64 madt_physical_address;
} sh_acpi_ACPI_TABLES;

Tables parsing

The parsing of ACPI tables is delegated to several functions, one for each tables. Here are the tables that are currently supported:

  • MADT

All parsing functions are defined in the files inside shelter/lib/include/devs/acpi_tables and in the files inside shelter/lib/src/devs/acpi_tables.

MADT parsing

The MADT is parsed using the sh_acpi_madt_parse(sh_uint64 madt_ptr), defined in shelter/lib/include/devs/acpi_tables/madt.h and implemented in shelter/lib/src/devs/acpi_tables/madt.c.

This function logs all the entries and register all LAPIC devices, IOAPIC devices and ISOs.