[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v4 2/3] pc: acpi-build: update linker on guest a
From: |
Michael S. Tsirkin |
Subject: |
Re: [Qemu-devel] [PATCH v4 2/3] pc: acpi-build: update linker on guest access |
Date: |
Sun, 15 Feb 2015 20:45:07 +0100 |
On Mon, Feb 09, 2015 at 01:59:54PM +0000, Igor Mammedov wrote:
> Linker table is build only once, so if later during
> tables rebuild sizes of other ACPI tables change
> pointers will be patched incorrectly due to wrong
> offsets in linker. Resulting in guest not being able
> to find ACPI tables.
> Fix it by updating 'linker' table with the rest of
> tables when firmware reads it.
>
> Signed-off-by: Igor Mammedov <address@hidden>
> ---
> hw/i386/acpi-build.c | 8 +++++++-
> 1 file changed, 7 insertions(+), 1 deletion(-)
>
> diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
> index 5b2b017..21ea3db 100644
> --- a/hw/i386/acpi-build.c
> +++ b/hw/i386/acpi-build.c
> @@ -1527,6 +1527,8 @@ struct AcpiBuildState {
> uint8_t patched;
> PcGuestInfo *guest_info;
> void *rsdp;
> + ram_addr_t linker_ram;
> + uint32_t linker_size;
> } AcpiBuildState;
>
> static bool acpi_get_mcfg(AcpiMcfgInfo *mcfg)
> @@ -1733,6 +1735,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));
> + memcpy(qemu_get_ram_ptr(build_state->linker_ram), tables.linker->data,
> + build_state->linker_size);
>
> cpu_physical_memory_set_dirty_range_nocode(build_state->table_ram,
> build_state->table_size);
OK, but it looks like linker data needs to be marked dirty
as well. I'll send a patch to do this.
> @@ -1799,7 +1803,9 @@ void acpi_setup(PcGuestInfo *guest_info)
> assert(build_state->table_ram != RAM_ADDR_MAX);
> build_state->table_size = acpi_data_len(tables.table_data);
>
> - acpi_add_rom_blob(NULL, tables.linker, "etc/table-loader", 0);
> + build_state->linker_ram =
> + acpi_add_rom_blob(build_state, tables.linker, "etc/table-loader", 0);
> + build_state->linker_size = acpi_data_len(tables.linker);
>
> fw_cfg_add_file(guest_info->fw_cfg, ACPI_BUILD_TPMLOG_FILE,
> tables.tcpalog->data, acpi_data_len(tables.tcpalog));
> --
> 1.8.3.1