[SeaBIOS] [PATCH 2/2] accept MADT over fw_cfg

Laszlo Ersek lersek at redhat.com
Wed Mar 20 22:53:05 CET 2013


Signed-off-by: Laszlo Ersek <lersek at redhat.com>
---
 src/acpi.c |   19 ++++++++++++++++---
 1 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/src/acpi.c b/src/acpi.c
index 8bbc92b..611553e 100644
--- a/src/acpi.c
+++ b/src/acpi.c
@@ -797,13 +797,13 @@ acpi_setup(void)
     struct fadt_descriptor_rev1 *fadt = build_fadt(pci);
     ACPI_INIT_TABLE(fadt);
     ACPI_INIT_TABLE(build_ssdt());
-    ACPI_INIT_TABLE(build_madt());
     ACPI_INIT_TABLE(build_hpet());
     ACPI_INIT_TABLE(build_srat());
     if (pci->device == PCI_DEVICE_ID_INTEL_ICH9_LPC)
         ACPI_INIT_TABLE(build_mcfg_q35());
 
     struct romfile_s *file = NULL;
+    int madt_found = 0;
     for (;;) {
         file = romfile_findprefix("acpi/", file);
         if (!file)
@@ -816,13 +816,19 @@ acpi_setup(void)
         int ret = file->copy(file, table, file->size);
         if (ret <= sizeof(*table))
             continue;
-        if (table->signature == DSDT_SIGNATURE) {
+        switch (table->signature) {
+        case DSDT_SIGNATURE:
             if (fadt) {
                 fill_dsdt(fadt, table);
             }
-        } else {
+            break;
+        case APIC_SIGNATURE:
+            madt_found = 1;
+            /* fall through */
+        default:
             ACPI_INIT_TABLE(table);
         }
+
         if (tbl_idx == MAX_ACPI_TABLES) {
             warn_noalloc();
             break;
@@ -838,6 +844,13 @@ acpi_setup(void)
         memcpy(dsdt, AmlCode, sizeof(AmlCode));
         fill_dsdt(fadt, dsdt);
     }
+    if (!madt_found) {
+        if (tbl_idx == MAX_ACPI_TABLES) {
+            warn_noalloc();
+            return;
+        }
+        ACPI_INIT_TABLE(build_madt());
+    }
 
     // Build final rsdt table
     struct rsdt_descriptor_rev1 *rsdt;
-- 
1.7.1




More information about the SeaBIOS mailing list