On 01/14/16 11:21, Michael S. Tsirkin wrote: > On Thu, Jan 14, 2016 at 02:36:56AM +0100, Laszlo Ersek wrote: >> 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); > > This seems rather messy. > How about an API to find SLIC and return the IDs > from the installed tables?
If testing confirms this idea is worthwhile, I won't object to your suggestion. I admit I don't readily recall how the externally provided tables are represented in that big concatenated blob, but perhaps I can look at acpi_table_first() / acpi_table_next(). (Or just stare at the code longer.) So: fair enough, thanks. Laszlo > >> 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 >>