qemu-devel
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]