From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36939) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Wwzlr-0006bp-By for qemu-devel@nongnu.org; Tue, 17 Jun 2014 16:14:25 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Wwzlj-0001dA-D4 for qemu-devel@nongnu.org; Tue, 17 Jun 2014 16:14:19 -0400 Received: from mx1.redhat.com ([209.132.183.28]:5614) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Wwzlj-0001cv-5c for qemu-devel@nongnu.org; Tue, 17 Jun 2014 16:14:11 -0400 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s5HKE84Q014520 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Tue, 17 Jun 2014 16:14:09 -0400 From: Igor Mammedov Date: Tue, 17 Jun 2014 22:14:01 +0200 Message-Id: <1403036041-13188-1-git-send-email-imammedo@redhat.com> Subject: [Qemu-devel] [PATCH] pc: acpi-build: make linker & RSDP tables dynamic List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: marcel.a@redhat.com, mst@redhat.com 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 --- 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