qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] [PATCH 4/4] pc: set the OEM fields in the RSDT and the FADT


From: Laszlo Ersek
Subject: [Qemu-devel] [PATCH 4/4] pc: set the OEM fields in the RSDT and the FADT from the SLIC
Date: Thu, 14 Jan 2016 02:36:57 +0100

The Microsoft spec about the SLIC and MSDM ACPI tables at
<http://go.microsoft.com/fwlink/p/?LinkId=234834> requires the OEM ID and
OEM Table ID fields to be consistent between the SLIC and the RSDT/XSDT.
That further affects the FADT, because a similar match between the FADT
and the RSDT/XSDT is required by the ACPI spec in general.

The stashed SLIC OEM identifiers can be ignored with the new

  -machine heed-slic-oem=no

option.

Cc: "Michael S. Tsirkin" <address@hidden> (supporter:ACPI/SMBIOS)
Cc: Igor Mammedov <address@hidden> (supporter:ACPI/SMBIOS)
Cc: Paolo Bonzini <address@hidden> (maintainer:X86)
Cc: Richard W.M. Jones <address@hidden>
Cc: Aleksei Kovura <address@hidden>
Cc: Michael Tokarev <address@hidden>
RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=1248758
Signed-off-by: Laszlo Ersek <address@hidden>
---
 include/hw/i386/pc.h |  2 ++
 hw/i386/acpi-build.c | 22 ++++++++++++++++++----
 hw/i386/pc.c         | 19 +++++++++++++++++++
 qemu-options.hx      | 10 +++++++++-
 4 files changed, 48 insertions(+), 5 deletions(-)

diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
index 588a33c..a762c29 100644
--- a/include/hw/i386/pc.h
+++ b/include/hw/i386/pc.h
@@ -56,6 +56,7 @@ struct PCMachineState {
     OnOffAuto vmport;
     OnOffAuto smm;
     bool nvdimm;
+    bool heed_slic_oem;
 
     /* RAM information (sizes, addresses, configuration): */
     ram_addr_t below_4g_mem_size, above_4g_mem_size;
@@ -67,6 +68,7 @@ struct PCMachineState {
 #define PC_MACHINE_VMPORT           "vmport"
 #define PC_MACHINE_SMM              "smm"
 #define PC_MACHINE_NVDIMM           "nvdimm"
+#define PC_MACHINE_HEED_SLIC_OEM    "heed-slic-oem"
 
 /**
  * PCMachineClass:
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
index 6408362..cf2aafc 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -337,7 +337,8 @@ static void fadt_setup(AcpiFadtDescriptorRev1 *fadt, 
AcpiPmInfo *pm)
 /* FADT */
 static void
 build_fadt(GArray *table_data, GArray *linker, AcpiPmInfo *pm,
-           unsigned facs, unsigned dsdt)
+           unsigned facs, unsigned dsdt,
+           const char *oem_id, const char *oem_table_id)
 {
     AcpiFadtDescriptorRev1 *fadt = acpi_data_push(table_data, sizeof(*fadt));
 
@@ -358,7 +359,7 @@ build_fadt(GArray *table_data, GArray *linker, AcpiPmInfo 
*pm,
     fadt_setup(fadt, pm);
 
     build_header(linker, table_data,
-                 (void *)fadt, "FACP", sizeof(*fadt), 1, NULL, NULL);
+                 (void *)fadt, "FACP", sizeof(*fadt), 1, oem_id, oem_table_id);
 }
 
 static void
@@ -2621,6 +2622,17 @@ void acpi_build(PcGuestInfo *guest_info, AcpiBuildTables 
*tables)
     uint8_t *u;
     size_t aml_len = 0;
     GArray *tables_blob = tables->table_data;
+    char *slic_oem_id = NULL;
+    char *slic_oem_table_id = NULL;
+    PCMachineState *pcms = PC_MACHINE(qdev_get_machine());
+    bool heed_slic_oem = object_property_get_bool(OBJECT(pcms),
+                                                  PC_MACHINE_HEED_SLIC_OEM,
+                                                  &error_abort);
+
+    if (heed_slic_oem) {
+        slic_oem_id = acpi_slic_oem_id;
+        slic_oem_table_id = acpi_slic_oem_table_id;
+    }
 
     acpi_get_cpu_info(&cpu);
     acpi_get_pm_info(&pm);
@@ -2654,7 +2666,8 @@ void acpi_build(PcGuestInfo *guest_info, AcpiBuildTables 
*tables)
 
     /* ACPI tables pointed to by RSDT */
     acpi_add_table(table_offsets, tables_blob);
-    build_fadt(tables_blob, tables->linker, &pm, facs, dsdt);
+    build_fadt(tables_blob, tables->linker, &pm, facs, dsdt,
+               slic_oem_id, slic_oem_table_id);
 
     ssdt = tables_blob->len;
     acpi_add_table(table_offsets, tables_blob);
@@ -2705,7 +2718,8 @@ void acpi_build(PcGuestInfo *guest_info, AcpiBuildTables 
*tables)
 
     /* RSDT is pointed to by RSDP */
     rsdt = tables_blob->len;
-    build_rsdt(tables_blob, tables->linker, table_offsets, NULL, NULL);
+    build_rsdt(tables_blob, tables->linker, table_offsets,
+               slic_oem_id, slic_oem_table_id);
 
     /* RSDP is in FSEG memory, so allocate it separately */
     build_rsdp(tables->rsdp, tables->linker, rsdt);
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index c36b8cf..3e7a72a 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -1887,6 +1887,20 @@ static void pc_machine_set_nvdimm(Object *obj, bool 
value, Error **errp)
     pcms->nvdimm = value;
 }
 
+static bool pc_machine_get_heed_slic_oem(Object *obj, Error **errp)
+{
+    PCMachineState *pcms = PC_MACHINE(obj);
+
+    return pcms->heed_slic_oem;
+}
+
+static void pc_machine_set_heed_slic_oem(Object *obj, bool value, Error **errp)
+{
+    PCMachineState *pcms = PC_MACHINE(obj);
+
+    pcms->heed_slic_oem = value;
+}
+
 static void pc_machine_initfn(Object *obj)
 {
     PCMachineState *pcms = PC_MACHINE(obj);
@@ -1926,6 +1940,11 @@ static void pc_machine_initfn(Object *obj)
     pcms->nvdimm = false;
     object_property_add_bool(obj, PC_MACHINE_NVDIMM, pc_machine_get_nvdimm,
                              pc_machine_set_nvdimm, &error_abort);
+
+    pcms->heed_slic_oem = true;
+    object_property_add_bool(obj, PC_MACHINE_HEED_SLIC_OEM,
+                             pc_machine_get_heed_slic_oem,
+                             pc_machine_set_heed_slic_oem, &error_abort);
 }
 
 static void pc_machine_reset(void)
diff --git a/qemu-options.hx b/qemu-options.hx
index 215d00d..e49964c 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -43,7 +43,8 @@ DEF("machine", HAS_ARG, QEMU_OPTION_machine, \
     "                aes-key-wrap=on|off controls support for AES key wrapping 
(default=on)\n"
     "                dea-key-wrap=on|off controls support for DEA key wrapping 
(default=on)\n"
     "                suppress-vmdesc=on|off disables self-describing migration 
(default=off)\n"
-    "                nvdimm=on|off controls NVDIMM support (default=off)\n",
+    "                nvdimm=on|off controls NVDIMM support (default=off)\n"
+    "                heed_slic_oem=on|off adapts RSDT and FADT OEM identifiers 
to external SLIC (default=on)\n",
     QEMU_ARCH_ALL)
 STEXI
 @item -machine address@hidden,address@hidden,...]]
@@ -84,6 +85,13 @@ controls whether DEA wrapping keys will be created to allow
 execution of DEA cryptographic functions.  The default is on.
 @item nvdimm=on|off
 Enables or disables NVDIMM support. The default is off.
address@hidden heed_slic_oem=on|off
+If the user provides an external SLIC ACPI table with the -acpitable option,
+then heed_slic_oem=on will adapt the OEM ID and OEM Table ID fields of the
+auto-generated RSDT and FADT tables to the same fields in the external SLIC.
+When heed_slic_oem is turned off, the RSDT and FADT tables will have general,
+QEMU-branded OEM ID and OEM Table ID values. The default is on. heed_slic_oem
+makes no difference if no SLIC table is provided by the user.
 @end table
 ETEXI
 
-- 
1.8.3.1




reply via email to

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