Message ID | 1638472142-14396-8-git-send-email-eric.devolder@oracle.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | acpi: Error Record Serialization Table, ERST, support for QEMU | expand |
On Fri, Dec 3, 2021 at 12:40 AM Eric DeVolder <eric.devolder@oracle.com> wrote: > > This change exposes ACPI ERST support for x86 guests. > > Signed-off-by: Eric DeVolder <eric.devolder@oracle.com> Reviewed-by: Ani Sinha <ani@anisinha.ca> > --- > hw/i386/acpi-build.c | 15 +++++++++++++++ > hw/i386/acpi-microvm.c | 15 +++++++++++++++ > include/hw/acpi/erst.h | 5 +++++ > 3 files changed, 35 insertions(+) > > diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c > index a99c6e4..55bca28 100644 > --- a/hw/i386/acpi-build.c > +++ b/hw/i386/acpi-build.c > @@ -43,6 +43,7 @@ > #include "sysemu/tpm.h" > #include "hw/acpi/tpm.h" > #include "hw/acpi/vmgenid.h" > +#include "hw/acpi/erst.h" > #include "sysemu/tpm_backend.h" > #include "hw/rtc/mc146818rtc_regs.h" > #include "migration/vmstate.h" > @@ -74,6 +75,8 @@ > #include "hw/acpi/hmat.h" > #include "hw/acpi/viot.h" > > +#include CONFIG_DEVICES > + > /* These are used to size the ACPI tables for -M pc-i440fx-1.7 and > * -M pc-i440fx-2.0. Even if the actual amount of AML generated grows > * a little bit, there should be plenty of free space since the DSDT > @@ -2566,6 +2569,18 @@ void acpi_build(AcpiBuildTables *tables, MachineState *machine) > ACPI_DEVICE_IF(x86ms->acpi_dev), x86ms->oem_id, > x86ms->oem_table_id); > > +#ifdef CONFIG_ACPI_ERST > + { > + Object *erst_dev; > + erst_dev = find_erst_dev(); > + if (erst_dev) { > + acpi_add_table(table_offsets, tables_blob); > + build_erst(tables_blob, tables->linker, erst_dev, > + x86ms->oem_id, x86ms->oem_table_id); > + } > + } > +#endif > + > vmgenid_dev = find_vmgenid_dev(); > if (vmgenid_dev) { > acpi_add_table(table_offsets, tables_blob); > diff --git a/hw/i386/acpi-microvm.c b/hw/i386/acpi-microvm.c > index 196d318..68ca7e7 100644 > --- a/hw/i386/acpi-microvm.c > +++ b/hw/i386/acpi-microvm.c > @@ -30,6 +30,7 @@ > #include "hw/acpi/bios-linker-loader.h" > #include "hw/acpi/generic_event_device.h" > #include "hw/acpi/utils.h" > +#include "hw/acpi/erst.h" > #include "hw/i386/fw_cfg.h" > #include "hw/i386/microvm.h" > #include "hw/pci/pci.h" > @@ -40,6 +41,8 @@ > #include "acpi-common.h" > #include "acpi-microvm.h" > > +#include CONFIG_DEVICES > + > static void acpi_dsdt_add_virtio(Aml *scope, > MicrovmMachineState *mms) > { > @@ -207,6 +210,18 @@ static void acpi_build_microvm(AcpiBuildTables *tables, > ACPI_DEVICE_IF(x86ms->acpi_dev), x86ms->oem_id, > x86ms->oem_table_id); > > +#ifdef CONFIG_ACPI_ERST > + { > + Object *erst_dev; > + erst_dev = find_erst_dev(); > + if (erst_dev) { > + acpi_add_table(table_offsets, tables_blob); > + build_erst(tables_blob, tables->linker, erst_dev, > + x86ms->oem_id, x86ms->oem_table_id); > + } > + } > +#endif > + > xsdt = tables_blob->len; > build_xsdt(tables_blob, tables->linker, table_offsets, x86ms->oem_id, > x86ms->oem_table_id); > diff --git a/include/hw/acpi/erst.h b/include/hw/acpi/erst.h > index 9d63717..b747fe7 100644 > --- a/include/hw/acpi/erst.h > +++ b/include/hw/acpi/erst.h > @@ -16,4 +16,9 @@ void build_erst(GArray *table_data, BIOSLinker *linker, Object *erst_dev, > > #define TYPE_ACPI_ERST "acpi-erst" > > +/* returns NULL unless there is exactly one device */ > +static inline Object *find_erst_dev(void) > +{ > + return object_resolve_path_type("", TYPE_ACPI_ERST, NULL); > +} > #endif > -- > 1.8.3.1 >
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c index a99c6e4..55bca28 100644 --- a/hw/i386/acpi-build.c +++ b/hw/i386/acpi-build.c @@ -43,6 +43,7 @@ #include "sysemu/tpm.h" #include "hw/acpi/tpm.h" #include "hw/acpi/vmgenid.h" +#include "hw/acpi/erst.h" #include "sysemu/tpm_backend.h" #include "hw/rtc/mc146818rtc_regs.h" #include "migration/vmstate.h" @@ -74,6 +75,8 @@ #include "hw/acpi/hmat.h" #include "hw/acpi/viot.h" +#include CONFIG_DEVICES + /* These are used to size the ACPI tables for -M pc-i440fx-1.7 and * -M pc-i440fx-2.0. Even if the actual amount of AML generated grows * a little bit, there should be plenty of free space since the DSDT @@ -2566,6 +2569,18 @@ void acpi_build(AcpiBuildTables *tables, MachineState *machine) ACPI_DEVICE_IF(x86ms->acpi_dev), x86ms->oem_id, x86ms->oem_table_id); +#ifdef CONFIG_ACPI_ERST + { + Object *erst_dev; + erst_dev = find_erst_dev(); + if (erst_dev) { + acpi_add_table(table_offsets, tables_blob); + build_erst(tables_blob, tables->linker, erst_dev, + x86ms->oem_id, x86ms->oem_table_id); + } + } +#endif + vmgenid_dev = find_vmgenid_dev(); if (vmgenid_dev) { acpi_add_table(table_offsets, tables_blob); diff --git a/hw/i386/acpi-microvm.c b/hw/i386/acpi-microvm.c index 196d318..68ca7e7 100644 --- a/hw/i386/acpi-microvm.c +++ b/hw/i386/acpi-microvm.c @@ -30,6 +30,7 @@ #include "hw/acpi/bios-linker-loader.h" #include "hw/acpi/generic_event_device.h" #include "hw/acpi/utils.h" +#include "hw/acpi/erst.h" #include "hw/i386/fw_cfg.h" #include "hw/i386/microvm.h" #include "hw/pci/pci.h" @@ -40,6 +41,8 @@ #include "acpi-common.h" #include "acpi-microvm.h" +#include CONFIG_DEVICES + static void acpi_dsdt_add_virtio(Aml *scope, MicrovmMachineState *mms) { @@ -207,6 +210,18 @@ static void acpi_build_microvm(AcpiBuildTables *tables, ACPI_DEVICE_IF(x86ms->acpi_dev), x86ms->oem_id, x86ms->oem_table_id); +#ifdef CONFIG_ACPI_ERST + { + Object *erst_dev; + erst_dev = find_erst_dev(); + if (erst_dev) { + acpi_add_table(table_offsets, tables_blob); + build_erst(tables_blob, tables->linker, erst_dev, + x86ms->oem_id, x86ms->oem_table_id); + } + } +#endif + xsdt = tables_blob->len; build_xsdt(tables_blob, tables->linker, table_offsets, x86ms->oem_id, x86ms->oem_table_id); diff --git a/include/hw/acpi/erst.h b/include/hw/acpi/erst.h index 9d63717..b747fe7 100644 --- a/include/hw/acpi/erst.h +++ b/include/hw/acpi/erst.h @@ -16,4 +16,9 @@ void build_erst(GArray *table_data, BIOSLinker *linker, Object *erst_dev, #define TYPE_ACPI_ERST "acpi-erst" +/* returns NULL unless there is exactly one device */ +static inline Object *find_erst_dev(void) +{ + return object_resolve_path_type("", TYPE_ACPI_ERST, NULL); +} #endif
This change exposes ACPI ERST support for x86 guests. Signed-off-by: Eric DeVolder <eric.devolder@oracle.com> --- hw/i386/acpi-build.c | 15 +++++++++++++++ hw/i386/acpi-microvm.c | 15 +++++++++++++++ include/hw/acpi/erst.h | 5 +++++ 3 files changed, 35 insertions(+)