diff options
author | Igor Mammedov <imammedo@redhat.com> | 2015-02-09 13:59:55 +0000 |
---|---|---|
committer | Michael S. Tsirkin <mst@redhat.com> | 2015-02-26 12:42:19 +0100 |
commit | 358774d780ee8f91429323f44bef1f53afa448bf (patch) | |
tree | 832072aeebea2715d337fad9dd1cef380d901c2b /hw/i386/acpi-build.c | |
parent | 6e00619b1eb2050bf2c75d52edfe7b4566704922 (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.c | 24 |
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); |