We prefer not changing table sizes depending on parameters, that's why we create a dummy table rather than just drop the MCFG table.
However, a table named "QEMU" could be put to a better use than just a stub, e.g. we could use it to pass some QEMU specific info to guests. Replace with an SSDT and pad with the Nop opcode to preserve the length. Signed-off-by: Michael S. Tsirkin <m...@redhat.com> --- hw/i386/acpi-build.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c index 73519ab..d0afb31e 100644 --- a/hw/i386/acpi-build.c +++ b/hw/i386/acpi-build.c @@ -2419,6 +2419,8 @@ build_mcfg_q35(GArray *table_data, BIOSLinker *linker, AcpiMcfgInfo *info) { AcpiTableMcfg *mcfg; const char *sig; + const char *oem; + const char *oem_id; int len = sizeof(*mcfg) + 1 * sizeof(mcfg->allocation[0]); mcfg = acpi_data_push(table_data, len); @@ -2431,16 +2433,21 @@ build_mcfg_q35(GArray *table_data, BIOSLinker *linker, AcpiMcfgInfo *info) /* MCFG is used for ECAM which can be enabled or disabled by guest. * To avoid table size changes (which create migration issues), * always create the table even if there are no allocations, - * but set the signature to a reserved value in this case. - * ACPI spec requires OSPMs to ignore such tables. + * but fill it with Noop values. + * OSPMs ignore such tables. */ if (info->mcfg_base == PCIE_BASE_ADDR_UNMAPPED) { - /* Reserved signature: ignored by OSPM */ - sig = "QEMU"; + sig = "SSDT"; + oem = "QEMU "; + oem_id = "NOOP"; + /* 0xa3 - NoopOp */ + memset(&mcfg->reserved, 0xa3, len - offsetof(AcpiTableMcfg, reserved)); } else { sig = "MCFG"; + oem = NULL; + oem_id = NULL; } - build_header(linker, table_data, (void *)mcfg, sig, len, 1, NULL, NULL); + build_header(linker, table_data, (void *)mcfg, sig, len, 1, oem, oem_id); } /* -- MST