[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 1/5] hw/arm: Align ACPI blob len to PAGE size
From: |
Shameer Kolothum |
Subject: |
[PATCH 1/5] hw/arm: Align ACPI blob len to PAGE size |
Date: |
Fri, 4 Oct 2019 16:52:58 +0100 |
If ACPI blob length modifications happens after the initial
virt_acpi_build() call, and the changed blob length is within
the PAGE size boundary, then the revised size is not seen by
the firmware on Guest reboot. The is because in the
virt_acpi_build_update() -> acpi_ram_update() -> qemu_ram_resize()
path, qemu_ram_resize() uses ram_block size which is aligned
to PAGE size and the "resize callback" to update the size seen
by firmware is not getting invoked. Hence align ACPI blob sizes
to PAGE boundary.
Signed-off-by: Shameer Kolothum <address@hidden>
---
More details on this issue can be found here,
https://patchwork.kernel.org/patch/11154757/
---
hw/arm/virt-acpi-build.c | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
index 4cd50175e0..074e0c858e 100644
--- a/hw/arm/virt-acpi-build.c
+++ b/hw/arm/virt-acpi-build.c
@@ -790,6 +790,7 @@ void virt_acpi_build(VirtMachineState *vms, AcpiBuildTables
*tables)
GArray *table_offsets;
unsigned dsdt, xsdt;
GArray *tables_blob = tables->table_data;
+ GArray *cmd_blob = tables->linker->cmd_blob;
MachineState *ms = MACHINE(vms);
table_offsets = g_array_new(false, true /* clear */,
@@ -854,6 +855,19 @@ void virt_acpi_build(VirtMachineState *vms,
AcpiBuildTables *tables)
build_rsdp(tables->rsdp, tables->linker, &rsdp_data);
}
+ /*
+ * Align the ACPI blob lengths to PAGE size so that on ACPI table
+ * regeneration, the length that firmware sees really gets updated
+ * through 'resize' callback in qemu_ram_resize() in the
+ * virt_acpi_build_update() -> acpi_ram_update() -> qemu_ram_resize()
+ * path.
+ */
+ g_array_set_size(tables_blob,
+ TARGET_PAGE_ALIGN(acpi_data_len(tables_blob)));
+ g_array_set_size(tables->rsdp,
+ TARGET_PAGE_ALIGN(acpi_data_len(tables->rsdp)));
+ g_array_set_size(cmd_blob,
+ TARGET_PAGE_ALIGN(acpi_data_len(cmd_blob)));
/* Cleanup memory that's no longer used. */
g_array_free(table_offsets, true);
}
--
2.17.1
- [PATCH 0/5] ARM virt: Add NVDIMM support, Shameer Kolothum, 2019/10/04
- [PATCH 4/5] hw/arm/boot: Expose the pmem nodes in the DT, Shameer Kolothum, 2019/10/04
- [PATCH 1/5] hw/arm: Align ACPI blob len to PAGE size,
Shameer Kolothum <=
- [PATCH 3/5] hw/arm/virt: Add nvdimm hot-plug infrastructure, Shameer Kolothum, 2019/10/04
- [PATCH 2/5] nvdimm: Use configurable ACPI IO base and size, Shameer Kolothum, 2019/10/04
- [PATCH 5/5] hw/arm/virt: Add nvdimm hotplug support, Shameer Kolothum, 2019/10/04
- Re: [PATCH 0/5] ARM virt: Add NVDIMM support, Auger Eric, 2019/10/18