On Fri, 4 Jun 2021 at 01:13, Peter Maydell <peter.mayd...@linaro.org> wrote: > > Allow code elsewhere in the system to check whether the ACPI GHES > table is present, so it can determine whether it is OK to try to > record an error by calling acpi_ghes_record_errors(). > > (We don't need to migrate the new 'present' field in AcpiGhesState, > because it is set once at system initialization and doesn't change.) > > Signed-off-by: Peter Maydell <peter.mayd...@linaro.org> > --- > include/hw/acpi/ghes.h | 9 +++++++++ > hw/acpi/ghes-stub.c | 5 +++++ > hw/acpi/ghes.c | 17 +++++++++++++++++ > 3 files changed, 31 insertions(+) > > diff --git a/include/hw/acpi/ghes.h b/include/hw/acpi/ghes.h > index 2ae8bc1ded3..674f6958e90 100644 > --- a/include/hw/acpi/ghes.h > +++ b/include/hw/acpi/ghes.h > @@ -64,6 +64,7 @@ enum { > > typedef struct AcpiGhesState { > uint64_t ghes_addr_le; > + bool present; /* True if GHES is present at all on this board */ > } AcpiGhesState; > > void build_ghes_error_table(GArray *hardware_errors, BIOSLinker *linker); > @@ -72,4 +73,12 @@ void acpi_build_hest(GArray *table_data, BIOSLinker > *linker, > void acpi_ghes_add_fw_cfg(AcpiGhesState *vms, FWCfgState *s, > GArray *hardware_errors); > int acpi_ghes_record_errors(uint8_t notify, uint64_t error_physical_addr); > + > +/** > + * acpi_ghes_present: Report whether ACPI GHES table is present > + * > + * Returns: true if the system has an ACPI GHES table and it is > + * safe to call acpi_ghes_record_errors() to record a memory error. > + */ > +bool acpi_ghes_present(void); > #endif > diff --git a/hw/acpi/ghes-stub.c b/hw/acpi/ghes-stub.c > index 9faba043b85..c315de1802d 100644 > --- a/hw/acpi/ghes-stub.c > +++ b/hw/acpi/ghes-stub.c > @@ -15,3 +15,8 @@ int acpi_ghes_record_errors(uint8_t source_id, uint64_t > physical_address) > { > return -1; > } > + > +bool acpi_ghes_present(void) > +{ > + return false; > +} > diff --git a/hw/acpi/ghes.c b/hw/acpi/ghes.c > index a4dac6bf15e..a749b84d624 100644 > --- a/hw/acpi/ghes.c > +++ b/hw/acpi/ghes.c > @@ -386,6 +386,8 @@ void acpi_ghes_add_fw_cfg(AcpiGhesState *ags, FWCfgState > *s, > /* Create a read-write fw_cfg file for Address */ > fw_cfg_add_file_callback(s, ACPI_GHES_DATA_ADDR_FW_CFG_FILE, NULL, NULL, > NULL, &(ags->ghes_addr_le), sizeof(ags->ghes_addr_le), false); > + > + ags->present = true; > } > > int acpi_ghes_record_errors(uint8_t source_id, uint64_t physical_address) > @@ -443,3 +445,18 @@ int acpi_ghes_record_errors(uint8_t source_id, uint64_t > physical_address) > > return ret; > } > + > +bool acpi_ghes_present(void) > +{ > + AcpiGedState *acpi_ged_state; > + AcpiGhesState *ags; > + > + acpi_ged_state = ACPI_GED(object_resolve_path_type("", TYPE_ACPI_GED, > + NULL)); > + > + if (!acpi_ged_state) { > + return false; > + } > + ags = &acpi_ged_state->ghes_state; > + return ags->present; > +} > -- > 2.20.1 >
Reviewed-by: Dongjiu Geng <gengdongj...@gmail.com>