The SLIC table is not generated by QEMU. If the user specifies an external one however, then board-specific code might want to adapt other, auto-generated tables to it. This patch saves the OEM ID and OEM Table ID fields from the SLIC, and leaves the actual utilization to board code (the next patch).
Cc: "Michael S. Tsirkin" <m...@redhat.com> (supporter:ACPI/SMBIOS) Cc: Igor Mammedov <imamm...@redhat.com> (supporter:ACPI/SMBIOS) Cc: Richard W.M. Jones <rjo...@redhat.com> Cc: Aleksei Kovura <alex3...@zoho.com> Cc: Michael Tokarev <m...@tls.msk.ru> RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=1248758 Signed-off-by: Laszlo Ersek <ler...@redhat.com> --- include/hw/acpi/acpi.h | 2 ++ hw/acpi/core.c | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/include/hw/acpi/acpi.h b/include/hw/acpi/acpi.h index b20bd55..407197a 100644 --- a/include/hw/acpi/acpi.h +++ b/include/hw/acpi/acpi.h @@ -189,6 +189,8 @@ void acpi_update_sci(ACPIREGS *acpi_regs, qemu_irq irq); extern int acpi_enabled; extern char unsigned *acpi_tables; extern size_t acpi_tables_len; +extern char *acpi_slic_oem_id; +extern char *acpi_slic_oem_table_id; uint8_t *acpi_table_first(void); uint8_t *acpi_table_next(uint8_t *current); diff --git a/hw/acpi/core.c b/hw/acpi/core.c index 21e113d..7046035 100644 --- a/hw/acpi/core.c +++ b/hw/acpi/core.c @@ -54,6 +54,8 @@ static const char unsigned dfl_hdr[ACPI_TABLE_HDR_SIZE - ACPI_TABLE_PFX_SIZE] = char unsigned *acpi_tables; size_t acpi_tables_len; +char *acpi_slic_oem_id; +char *acpi_slic_oem_table_id; static QemuOptsList qemu_acpi_opts = { .name = "acpi", @@ -227,6 +229,22 @@ static void acpi_table_install(const char unsigned *blob, size_t bloblen, /* recalculate checksum */ ext_hdr->checksum = acpi_checksum((const char unsigned *)ext_hdr + ACPI_TABLE_PFX_SIZE, acpi_payload_size); + + /* If the table signature is SLIC, stash the OEM ID and OEM Table ID + * fields, so we can later adapt the RSDT and the FADT. + */ + if (memcmp(ext_hdr->sig, "SLIC", 4) == 0) { + g_free(acpi_slic_oem_id); + acpi_slic_oem_id = g_malloc(sizeof ext_hdr->oem_id + 1); + memcpy(acpi_slic_oem_id, ext_hdr->oem_id, sizeof ext_hdr->oem_id); + acpi_slic_oem_id[sizeof ext_hdr->oem_id] = '\0'; + + g_free(acpi_slic_oem_table_id); + acpi_slic_oem_table_id = g_malloc(sizeof ext_hdr->oem_table_id + 1); + memcpy(acpi_slic_oem_table_id, ext_hdr->oem_table_id, + sizeof ext_hdr->oem_table_id); + acpi_slic_oem_table_id[sizeof ext_hdr->oem_table_id] = '\0'; + } } void acpi_table_add(const QemuOpts *opts, Error **errp) -- 1.8.3.1