qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH] acpi: update RSDP on guest access


From: Michael S. Tsirkin
Subject: [Qemu-devel] [PATCH] acpi: update RSDP on guest access
Date: Wed, 4 Feb 2015 10:32:43 +0100

As Igor pointed out, when RSDT offset changes,
RSDP needs to change as well.
We really should have put it in a ROM region, but
we can't change that for old machine types,
let's just set the callback and update it explicitly.

Signed-off-by: Michael S. Tsirkin <address@hidden>
---
 hw/i386/acpi-build.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
index 74586f3..dfbf690 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -1529,6 +1529,7 @@ struct AcpiBuildState {
     /* Is table patched? */
     uint8_t patched;
     PcGuestInfo *guest_info;
+    void *rsdp;
 } AcpiBuildState;
 
 static bool acpi_get_mcfg(AcpiMcfgInfo *mcfg)
@@ -1737,6 +1738,8 @@ static void acpi_build_update(void *build_opaque, 
uint32_t offset)
     memcpy(qemu_get_ram_ptr(build_state->table_ram), tables.table_data->data,
            build_state->table_size);
 
+    memcpy(build_state->rsdp, tables.rsdp->data, acpi_data_len(tables.rsdp));
+
     cpu_physical_memory_set_dirty_range_nocode(build_state->table_ram,
                                                build_state->table_size);
 
@@ -1811,8 +1814,11 @@ void acpi_setup(PcGuestInfo *guest_info)
      * 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));
+    fw_cfg_add_file_callback(guest_info->fw_cfg, ACPI_BUILD_RSDP_FILE,
+                             acpi_build_update, NULL,
+                             tables.rsdp->data, acpi_data_len(tables.rsdp));
+
+    build_state->rsdp = tables.rsdp->data;
 
     qemu_register_reset(acpi_build_reset, build_state);
     acpi_build_reset(build_state);
-- 
MST



reply via email to

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