qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH] acpi: switch to a dummy SSDT


From: Michael S. Tsirkin
Subject: [Qemu-devel] [PATCH] acpi: switch to a dummy SSDT
Date: Tue, 9 Jan 2018 15:58:11 +0200

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 <address@hidden>
---
 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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]