aboutsummaryrefslogtreecommitdiff
path: root/hw/i386/acpi-build.c
diff options
context:
space:
mode:
authorIgor Mammedov <imammedo@redhat.com>2015-02-09 13:59:55 +0000
committerMichael S. Tsirkin <mst@redhat.com>2015-02-26 12:42:19 +0100
commit358774d780ee8f91429323f44bef1f53afa448bf (patch)
tree832072aeebea2715d337fad9dd1cef380d901c2b /hw/i386/acpi-build.c
parent6e00619b1eb2050bf2c75d52edfe7b4566704922 (diff)
pc: acpi-build: migrate RSDP table
Makes sure that RSDP stays the same /i.e. matches ACPI tables blob in source/ if guest is migrated during RSDP reading or has been already shadowed by firmware. Fix applies only to new machine types starting from 2.3, so it won't break migration for old machine types. Signed-off-by: Igor Mammedov <imammedo@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Reviewed-by: Marcel Apfelbaum <marcel@redhat.com>
Diffstat (limited to 'hw/i386/acpi-build.c')
-rw-r--r--hw/i386/acpi-build.c24
1 files changed, 15 insertions, 9 deletions
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
index 47368c92f2..693f44730a 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -1651,15 +1651,21 @@ void acpi_setup(PcGuestInfo *guest_info)
fw_cfg_add_file(guest_info->fw_cfg, ACPI_BUILD_TPMLOG_FILE,
tables.tcpalog->data, acpi_data_len(tables.tcpalog));
- /*
- * Though RSDP is small, its contents isn't immutable, so
- * update it along with the rest of tables on guest access.
- */
- fw_cfg_add_file_callback(guest_info->fw_cfg, ACPI_BUILD_RSDP_FILE,
- acpi_build_update, build_state,
- tables.rsdp->data, acpi_data_len(tables.rsdp));
-
- build_state->rsdp = tables.rsdp->data;
+ if (guest_info->has_immutable_rsdp) {
+ /*
+ * Keep for compatibility with old machine types.
+ * Though RSDP is small, its contents isn't immutable, so
+ * update it along with the rest of tables on guest access.
+ */
+ fw_cfg_add_file_callback(guest_info->fw_cfg, ACPI_BUILD_RSDP_FILE,
+ acpi_build_update, build_state,
+ tables.rsdp->data, acpi_data_len(tables.rsdp));
+ build_state->rsdp = tables.rsdp->data;
+ } else {
+ build_state->rsdp = qemu_get_ram_ptr(
+ acpi_add_rom_blob(build_state, tables.rsdp, ACPI_BUILD_RSDP_FILE, 0)
+ );
+ }
qemu_register_reset(acpi_build_reset, build_state);
acpi_build_reset(build_state);