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? > 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 >