Skip to content

Commit

Permalink
acpi: Align the size to 128k
Browse files Browse the repository at this point in the history
If table size is changed between virt_acpi_build and
virt_acpi_build_update, the table size would not be updated to
UEFI, therefore, just align the size to 128kb, which is enough
and same with x86. It would warn if 64k is not enough and the
align size should be updated.

Signed-off-by: Yubo Miao <miaoyubo@huawei.com>
Signed-off-by: Jiahui Cen <cenjiahui@huawei.com>
Message-Id: <20201119014841.7298-7-cenjiahui@huawei.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
  • Loading branch information
smalloasis authored and mstsirkin committed Dec 8, 2020
1 parent 6f9765f commit 451b157
Showing 1 changed file with 25 additions and 0 deletions.
25 changes: 25 additions & 0 deletions hw/arm/virt-acpi-build.c
Expand Up @@ -57,6 +57,8 @@

#define ARM_SPI_BASE 32

#define ACPI_BUILD_TABLE_SIZE 0x20000

static void acpi_dsdt_add_cpus(Aml *scope, int smp_cpus)
{
uint16_t i;
Expand Down Expand Up @@ -656,6 +658,15 @@ struct AcpiBuildState {
bool patched;
} AcpiBuildState;

static void acpi_align_size(GArray *blob, unsigned align)
{
/*
* Align size to multiple of given size. This reduces the chance
* we need to change size in the future (breaking cross version migration).
*/
g_array_set_size(blob, ROUND_UP(acpi_data_len(blob), align));
}

static
void virt_acpi_build(VirtMachineState *vms, AcpiBuildTables *tables)
{
Expand Down Expand Up @@ -743,6 +754,20 @@ void virt_acpi_build(VirtMachineState *vms, AcpiBuildTables *tables)
build_rsdp(tables->rsdp, tables->linker, &rsdp_data);
}

/*
* The align size is 128, warn if 64k is not enough therefore
* the align size could be resized.
*/
if (tables_blob->len > ACPI_BUILD_TABLE_SIZE / 2) {
warn_report("ACPI table size %u exceeds %d bytes,"
" migration may not work",
tables_blob->len, ACPI_BUILD_TABLE_SIZE / 2);
error_printf("Try removing CPUs, NUMA nodes, memory slots"
" or PCI bridges.");
}
acpi_align_size(tables_blob, ACPI_BUILD_TABLE_SIZE);


/* Cleanup memory that's no longer used. */
g_array_free(table_offsets, true);
}
Expand Down

0 comments on commit 451b157

Please sign in to comment.