summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/acpi/acpi.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/src/acpi/acpi.c b/src/acpi/acpi.c
index a57d498398..10b0707b10 100644
--- a/src/acpi/acpi.c
+++ b/src/acpi/acpi.c
@@ -1905,6 +1905,7 @@ unsigned long write_acpi_tables(unsigned long start)
|| dsdt_file->length < sizeof(acpi_header_t)
|| memcmp(dsdt_file->signature, "DSDT", 4) != 0) {
printk(BIOS_ERR, "Invalid DSDT file, skipping ACPI tables\n");
+ cbfs_unmap(dsdt_file);
return current;
}
@@ -1914,6 +1915,7 @@ unsigned long write_acpi_tables(unsigned long start)
|| slic_file->length < sizeof(acpi_header_t)
|| (memcmp(slic_file->signature, "SLIC", 4) != 0
&& memcmp(slic_file->signature, "MSDM", 4) != 0))) {
+ cbfs_unmap(slic_file);
slic_file = 0;
}
@@ -1998,8 +2000,17 @@ unsigned long write_acpi_tables(unsigned long start)
current += slic_file->length;
current = acpi_align_current(current);
acpi_add_table(rsdp, slic);
+ cbfs_unmap(slic_file);
}
+ /*
+ * cbfs_unmap() uses mem_pool_free() which works correctly only
+ * if freeing is done in reverse order than memory allocation.
+ * This is why unmapping of dsdt_file must be done after
+ * unmapping slic file.
+ */
+ cbfs_unmap(dsdt_file);
+
printk(BIOS_DEBUG, "ACPI: * SSDT\n");
ssdt = (acpi_header_t *)current;
acpi_create_ssdt_generator(ssdt, ACPI_TABLE_CREATOR);