For one particular error (Error), we can't call error_setg() for twice. Otherwise, the assert(*errp == NULL) will be triggered unexpectedly in error_setv(). In ghes_record_cper_errors(), get_ghes_source_offsets() can return a error initialized by error_setg(). Without bailing on this error, it can call into the second error_setg() due to the unexpected value from the read acknowledgement register.
Bail early in ghes_record_cper_errors() when error is received from get_ghes_source_offsets() to avoid the exception. Signed-off-by: Gavin Shan <[email protected]> --- hw/acpi/ghes.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/hw/acpi/ghes.c b/hw/acpi/ghes.c index 527b85c8d8..055e5d719a 100644 --- a/hw/acpi/ghes.c +++ b/hw/acpi/ghes.c @@ -513,6 +513,9 @@ void ghes_record_cper_errors(AcpiGhesState *ags, const void *cper, size_t len, } else { get_ghes_source_offsets(source_id, le64_to_cpu(ags->hest_addr_le), &cper_addr, &read_ack_register_addr, errp); + if (*errp) { + return; + } } cpu_physical_memory_read(read_ack_register_addr, -- 2.51.0
