On Thu, 27 Nov 2025 10:44:35 +1000 Gavin Shan <[email protected]> wrote:
> Use error_fatal in acpi_ghes_memory_errors() so that the caller needn't > explicitly call exit(). The return value of acpi_ghes_memory_errors() > and ghes_record_cper_errors() is changed to 'bool' indicating an error > has been raised, to be compatible with what's documented in error.h. > > Suggested-by: Igor Mammedov <[email protected]> > Suggested-by: Markus Armbruster <[email protected]> > Signed-off-by: Gavin Shan <[email protected]> > Reviewed-by: Jonathan Cameron <[email protected]> Reviewed-by: Igor Mammedov <[email protected]> > --- > hw/acpi/ghes-stub.c | 4 ++-- > hw/acpi/ghes.c | 26 ++++++++++---------------- > include/hw/acpi/ghes.h | 6 +++--- > target/arm/kvm.c | 9 +++------ > 4 files changed, 18 insertions(+), 27 deletions(-) > > diff --git a/hw/acpi/ghes-stub.c b/hw/acpi/ghes-stub.c > index b54f1b093c..5f9313cce9 100644 > --- a/hw/acpi/ghes-stub.c > +++ b/hw/acpi/ghes-stub.c > @@ -11,8 +11,8 @@ > #include "qemu/osdep.h" > #include "hw/acpi/ghes.h" > > -int acpi_ghes_memory_errors(AcpiGhesState *ags, uint16_t source_id, > - uint64_t physical_address) > +bool acpi_ghes_memory_errors(AcpiGhesState *ags, uint16_t source_id, > + uint64_t physical_address, Error **errp) > { > g_assert_not_reached(); > } > diff --git a/hw/acpi/ghes.c b/hw/acpi/ghes.c > index c35883dfa9..3033e93d65 100644 > --- a/hw/acpi/ghes.c > +++ b/hw/acpi/ghes.c > @@ -515,14 +515,14 @@ static bool get_ghes_source_offsets(uint16_t source_id, > NotifierList acpi_generic_error_notifiers = > NOTIFIER_LIST_INITIALIZER(acpi_generic_error_notifiers); > > -void ghes_record_cper_errors(AcpiGhesState *ags, const void *cper, size_t > len, > +bool ghes_record_cper_errors(AcpiGhesState *ags, const void *cper, size_t > len, > uint16_t source_id, Error **errp) > { > uint64_t cper_addr = 0, read_ack_register_addr = 0, read_ack_register; > > if (len > ACPI_GHES_MAX_RAW_DATA_LENGTH) { > error_setg(errp, "GHES CPER record is too big: %zd", len); > - return; > + return false; > } > > if (!ags->use_hest_addr) { > @@ -531,7 +531,7 @@ void ghes_record_cper_errors(AcpiGhesState *ags, const > void *cper, size_t len, > } else if (!get_ghes_source_offsets(source_id, > le64_to_cpu(ags->hest_addr_le), > &cper_addr, &read_ack_register_addr, errp)) { > - return; > + return false; > } > > cpu_physical_memory_read(read_ack_register_addr, > @@ -542,7 +542,7 @@ void ghes_record_cper_errors(AcpiGhesState *ags, const > void *cper, size_t len, > error_setg(errp, > "OSPM does not acknowledge previous error," > " so can not record CPER for current error anymore"); > - return; > + return false; > } > > read_ack_register = cpu_to_le64(0); > @@ -557,16 +557,17 @@ void ghes_record_cper_errors(AcpiGhesState *ags, const > void *cper, size_t len, > cpu_physical_memory_write(cper_addr, cper, len); > > notifier_list_notify(&acpi_generic_error_notifiers, &source_id); > + > + return true; > } > > -int acpi_ghes_memory_errors(AcpiGhesState *ags, uint16_t source_id, > - uint64_t physical_address) > +bool acpi_ghes_memory_errors(AcpiGhesState *ags, uint16_t source_id, > + uint64_t physical_address, Error **errp) > { > /* Memory Error Section Type */ > const uint8_t guid[] = > UUID_LE(0xA5BC1114, 0x6F64, 0x4EDE, 0xB8, 0x63, 0x3E, 0x83, \ > 0xED, 0x7C, 0x83, 0xB1); > - Error *errp = NULL; > int data_length; > g_autoptr(GArray) block = g_array_new(false, true /* clear */, 1); > > @@ -583,15 +584,8 @@ int acpi_ghes_memory_errors(AcpiGhesState *ags, uint16_t > source_id, > /* Build the memory section CPER for above new generic error data entry > */ > acpi_ghes_build_append_mem_cper(block, physical_address); > > - /* Report the error */ > - ghes_record_cper_errors(ags, block->data, block->len, source_id, &errp); > - > - if (errp) { > - error_report_err(errp); > - return -1; > - } > - > - return 0; > + return ghes_record_cper_errors(ags, block->data, block->len, > + source_id, errp); > } > > AcpiGhesState *acpi_ghes_get_state(void) > diff --git a/include/hw/acpi/ghes.h b/include/hw/acpi/ghes.h > index df2ecbf6e4..5b29aae4dd 100644 > --- a/include/hw/acpi/ghes.h > +++ b/include/hw/acpi/ghes.h > @@ -98,9 +98,9 @@ void acpi_build_hest(AcpiGhesState *ags, GArray *table_data, > const char *oem_id, const char *oem_table_id); > void acpi_ghes_add_fw_cfg(AcpiGhesState *vms, FWCfgState *s, > GArray *hardware_errors); > -int acpi_ghes_memory_errors(AcpiGhesState *ags, uint16_t source_id, > - uint64_t error_physical_addr); > -void ghes_record_cper_errors(AcpiGhesState *ags, const void *cper, size_t > len, > +bool acpi_ghes_memory_errors(AcpiGhesState *ags, uint16_t source_id, > + uint64_t error_physical_addr, Error **errp); > +bool ghes_record_cper_errors(AcpiGhesState *ags, const void *cper, size_t > len, > uint16_t source_id, Error **errp); > > /** > diff --git a/target/arm/kvm.c b/target/arm/kvm.c > index acda0b3fb4..76aa09810f 100644 > --- a/target/arm/kvm.c > +++ b/target/arm/kvm.c > @@ -2456,12 +2456,9 @@ void kvm_arch_on_sigbus_vcpu(CPUState *c, int code, > void *addr) > */ > if (code == BUS_MCEERR_AR) { > kvm_cpu_synchronize_state(c); > - if (!acpi_ghes_memory_errors(ags, ACPI_HEST_SRC_ID_SYNC, > - paddr)) { > - kvm_inject_arm_sea(c); > - } else { > - exit(1); > - } > + acpi_ghes_memory_errors(ags, ACPI_HEST_SRC_ID_SYNC, > + paddr, &error_fatal); > + kvm_inject_arm_sea(c); > } > return; > }
