提交 ae123749 编写于 作者: L Laszlo Ersek 提交者: Michael S. Tsirkin

pc: set the OEM fields in the RSDT and the FADT from the SLIC

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.

This patch wires up the previous three patches.

Cc: "Michael S. Tsirkin" <mst@redhat.com> (supporter:ACPI/SMBIOS)
Cc: Igor Mammedov <imammedo@redhat.com> (supporter:ACPI/SMBIOS)
Cc: Paolo Bonzini <pbonzini@redhat.com> (maintainer:X86)
Cc: Richard W.M. Jones <rjones@redhat.com>
Cc: Aleksei Kovura <alex3kov@zoho.com>
Cc: Michael Tokarev <mjt@tls.msk.ru>
Cc: Steven Newbury <steve@snewbury.org.uk>
RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=1248758
LP: https://bugs.launchpad.net/qemu/+bug/1533848Signed-off-by: NLaszlo Ersek <lersek@redhat.com>
Reviewed-by: NMichael S. Tsirkin <mst@redhat.com>
Signed-off-by: NMichael S. Tsirkin <mst@redhat.com>
Reviewed-by: NSteven Newbury <steve@snewbury.org.uk>
上级 88594e4f
...@@ -336,7 +336,8 @@ static void fadt_setup(AcpiFadtDescriptorRev1 *fadt, AcpiPmInfo *pm) ...@@ -336,7 +336,8 @@ static void fadt_setup(AcpiFadtDescriptorRev1 *fadt, AcpiPmInfo *pm)
/* FADT */ /* FADT */
static void static void
build_fadt(GArray *table_data, GArray *linker, AcpiPmInfo *pm, 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)); AcpiFadtDescriptorRev1 *fadt = acpi_data_push(table_data, sizeof(*fadt));
...@@ -357,7 +358,7 @@ build_fadt(GArray *table_data, GArray *linker, AcpiPmInfo *pm, ...@@ -357,7 +358,7 @@ build_fadt(GArray *table_data, GArray *linker, AcpiPmInfo *pm,
fadt_setup(fadt, pm); fadt_setup(fadt, pm);
build_header(linker, table_data, 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 static void
...@@ -2601,11 +2602,13 @@ void acpi_build(AcpiBuildTables *tables) ...@@ -2601,11 +2602,13 @@ void acpi_build(AcpiBuildTables *tables)
uint8_t *u; uint8_t *u;
size_t aml_len = 0; size_t aml_len = 0;
GArray *tables_blob = tables->table_data; GArray *tables_blob = tables->table_data;
AcpiSlicOem slic_oem = { .id = NULL, .table_id = NULL };
acpi_get_cpu_info(&cpu); acpi_get_cpu_info(&cpu);
acpi_get_pm_info(&pm); acpi_get_pm_info(&pm);
acpi_get_misc_info(&misc); acpi_get_misc_info(&misc);
acpi_get_pci_info(&pci); acpi_get_pci_info(&pci);
acpi_get_slic_oem(&slic_oem);
table_offsets = g_array_new(false, true /* clear */, table_offsets = g_array_new(false, true /* clear */,
sizeof(uint32_t)); sizeof(uint32_t));
...@@ -2635,7 +2638,8 @@ void acpi_build(AcpiBuildTables *tables) ...@@ -2635,7 +2638,8 @@ void acpi_build(AcpiBuildTables *tables)
/* ACPI tables pointed to by RSDT */ /* ACPI tables pointed to by RSDT */
fadt = tables_blob->len; fadt = tables_blob->len;
acpi_add_table(table_offsets, tables_blob); 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);
aml_len += tables_blob->len - fadt; aml_len += tables_blob->len - fadt;
acpi_add_table(table_offsets, tables_blob); acpi_add_table(table_offsets, tables_blob);
...@@ -2681,7 +2685,8 @@ void acpi_build(AcpiBuildTables *tables) ...@@ -2681,7 +2685,8 @@ void acpi_build(AcpiBuildTables *tables)
/* RSDT is pointed to by RSDP */ /* RSDT is pointed to by RSDP */
rsdt = tables_blob->len; 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 */ /* RSDP is in FSEG memory, so allocate it separately */
build_rsdp(tables->rsdp, tables->linker, rsdt); build_rsdp(tables->rsdp, tables->linker, rsdt);
......
...@@ -1472,6 +1472,10 @@ ACPI headers (possible overridden by other options). ...@@ -1472,6 +1472,10 @@ ACPI headers (possible overridden by other options).
For data=, only data For data=, only data
portion of the table is used, all header information is specified in the portion of the table is used, all header information is specified in the
command line. command line.
If a SLIC table is supplied to QEMU, then the SLIC's oem_id and oem_table_id
fields will override the same in the RSDT and the FADT (a.k.a. FACP), in order
to ensure the field matches required by the Microsoft SLIC spec and the ACPI
spec.
ETEXI ETEXI
DEF("smbios", HAS_ARG, QEMU_OPTION_smbios, DEF("smbios", HAS_ARG, QEMU_OPTION_smbios,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册