@@ -393,6 +393,33 @@ build_madt(void)
return madt;
}
+static void*
+find_table(const char *sig, void *(*buildfn)(void))
+{
+ char buf[] = "etc/acpi/QUUX";
+ struct romfile_s *file;
+
+ snprintf(buf + (sizeof buf - 1 - 4), 4 + 1, "%s", sig);
+ file = romfile_find(buf);
+ if (file != NULL && file->size >= sizeof(struct acpi_table_header)) {
+ void *table;
+
+ table = malloc_high(file->size);
+ if (table == NULL)
+ warn_noalloc();
+ else {
+ if ((*file->copy)(file, table, file->size) == file->size) {
+ dprintf(4, "ACPI %s: using fw_cfg %s\n", sig, buf);
+ return table;
+ }
+ free(table);
+ }
+ }
+
+ dprintf(4, "ACPI %s: building default\n", sig);
+ return (*buildfn)();
+}
+
// Encode a hex value
static inline char getHex(u32 val) {
val &= 0x0f;
@@ -792,7 +819,7 @@ 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(find_table("APIC", build_madt));
ACPI_INIT_TABLE(build_hpet());
ACPI_INIT_TABLE(build_srat());
if (pci->device == PCI_DEVICE_ID_INTEL_ICH9_LPC)
Signed-off-by: Laszlo Ersek <lersek@redhat.com> --- src/acpi.c | 29 ++++++++++++++++++++++++++++- 1 files changed, 28 insertions(+), 1 deletions(-)