[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH] pc: acpi-build: make linker & RSDP tables dynamic
From: |
Igor Mammedov |
Subject: |
[Qemu-devel] [PATCH] pc: acpi-build: make linker & RSDP tables dynamic |
Date: |
Tue, 17 Jun 2014 22:14:01 +0200 |
linker and RSDP tables are build only once, so if later
during rebuild sizes of ACPI tables change pointers will
be patched incorrectly due to wrong offsets.
To fix it rebuild linker and RSDP tables along with
the rest of ACPI tables so that they would have correct
offsets.
Signed-off-by: Igor Mammedov <address@hidden>
---
hw/i386/acpi-build.c | 21 ++++++++++++++-------
1 file changed, 14 insertions(+), 7 deletions(-)
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
index fab25ad..8301bb4 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -1862,6 +1862,10 @@ struct AcpiBuildState {
/* Copy of table in RAM (for patching). */
uint8_t *table_ram;
uint32_t table_size;
+ uint8_t *linker_ram;
+ uint32_t linker_size;
+ uint8_t *rsdp_ram;
+ uint32_t rsdp_size;
/* Is table patched? */
uint8_t patched;
PcGuestInfo *guest_info;
@@ -1998,6 +2002,10 @@ static void acpi_build_update(void *build_opaque,
uint32_t offset)
assert(acpi_data_len(tables.table_data) == build_state->table_size);
memcpy(build_state->table_ram, tables.table_data->data,
build_state->table_size);
+ memcpy(build_state->linker_ram, tables.linker->data,
+ build_state->linker_size);
+ memcpy(build_state->rsdp_ram, tables.rsdp->data,
+ build_state->rsdp_size);
acpi_build_tables_cleanup(&tables, true);
}
@@ -2060,14 +2068,13 @@ void acpi_setup(PcGuestInfo *guest_info)
ACPI_BUILD_TABLE_FILE);
build_state->table_size = acpi_data_len(tables.table_data);
- acpi_add_rom_blob(NULL, tables.linker, "etc/table-loader");
+ build_state->linker_ram = acpi_add_rom_blob(build_state, tables.linker,
+ "etc/table-loader");
+ build_state->linker_size = acpi_data_len(tables.linker);
- /*
- * RSDP is small so it's easy to keep it immutable, no need to
- * bother with ROM blobs.
- */
- fw_cfg_add_file(guest_info->fw_cfg, ACPI_BUILD_RSDP_FILE,
- tables.rsdp->data, acpi_data_len(tables.rsdp));
+ build_state->rsdp_ram = acpi_add_rom_blob(build_state, tables.rsdp,
+ ACPI_BUILD_RSDP_FILE);
+ build_state->rsdp_size = acpi_data_len(tables.rsdp);
qemu_register_reset(acpi_build_reset, build_state);
acpi_build_reset(build_state);
--
1.9.3
- [Qemu-devel] [PATCH] pc: acpi-build: make linker & RSDP tables dynamic,
Igor Mammedov <=