ACPI: Record the Generic Error Status Block address
Record the GHEB address via fw_cfg file, when recording a error to CPER, it will use this address to find out Generic Error Data Entries and write the error. In order to avoid migration failure, make hardware error table address to a part of GED device instead of global variable, then this address will be migrated to target QEMU. Acked-by: Xiang Zheng <zhengxiang9@huawei.com> Signed-off-by: Dongjiu Geng <gengdongjiu@huawei.com> Reviewed-by: Igor Mammedov <imammedo@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Message-id: 20200512030609.19593-7-gengdongjiu@huawei.com Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
205cc75dee
commit
a08a64627b
|
@ -247,6 +247,24 @@ static const VMStateDescription vmstate_ged_state = {
|
|||
}
|
||||
};
|
||||
|
||||
static bool ghes_needed(void *opaque)
|
||||
{
|
||||
AcpiGedState *s = opaque;
|
||||
return s->ghes_state.ghes_addr_le;
|
||||
}
|
||||
|
||||
static const VMStateDescription vmstate_ghes_state = {
|
||||
.name = "acpi-ged/ghes",
|
||||
.version_id = 1,
|
||||
.minimum_version_id = 1,
|
||||
.needed = ghes_needed,
|
||||
.fields = (VMStateField[]) {
|
||||
VMSTATE_STRUCT(ghes_state, AcpiGedState, 1,
|
||||
vmstate_ghes_state, AcpiGhesState),
|
||||
VMSTATE_END_OF_LIST()
|
||||
}
|
||||
};
|
||||
|
||||
static const VMStateDescription vmstate_acpi_ged = {
|
||||
.name = "acpi-ged",
|
||||
.version_id = 1,
|
||||
|
@ -257,6 +275,7 @@ static const VMStateDescription vmstate_acpi_ged = {
|
|||
},
|
||||
.subsections = (const VMStateDescription * []) {
|
||||
&vmstate_memhp_state,
|
||||
&vmstate_ghes_state,
|
||||
NULL
|
||||
}
|
||||
};
|
||||
|
|
|
@ -24,6 +24,8 @@
|
|||
#include "hw/acpi/ghes.h"
|
||||
#include "hw/acpi/aml-build.h"
|
||||
#include "qemu/error-report.h"
|
||||
#include "hw/acpi/generic_event_device.h"
|
||||
#include "hw/nvram/fw_cfg.h"
|
||||
|
||||
#define ACPI_GHES_ERRORS_FW_CFG_FILE "etc/hardware_errors"
|
||||
#define ACPI_GHES_DATA_ADDR_FW_CFG_FILE "etc/hardware_errors_addr"
|
||||
|
@ -213,3 +215,15 @@ void acpi_build_hest(GArray *table_data, BIOSLinker *linker)
|
|||
build_header(linker, table_data, (void *)(table_data->data + hest_start),
|
||||
"HEST", table_data->len - hest_start, 1, NULL, NULL);
|
||||
}
|
||||
|
||||
void acpi_ghes_add_fw_cfg(AcpiGhesState *ags, FWCfgState *s,
|
||||
GArray *hardware_error)
|
||||
{
|
||||
/* Create a read-only fw_cfg file for GHES */
|
||||
fw_cfg_add_file(s, ACPI_GHES_ERRORS_FW_CFG_FILE, hardware_error->data,
|
||||
hardware_error->len);
|
||||
|
||||
/* 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);
|
||||
}
|
||||
|
|
|
@ -917,6 +917,7 @@ void virt_acpi_setup(VirtMachineState *vms)
|
|||
{
|
||||
AcpiBuildTables tables;
|
||||
AcpiBuildState *build_state;
|
||||
AcpiGedState *acpi_ged_state;
|
||||
|
||||
if (!vms->fw_cfg) {
|
||||
trace_virt_acpi_setup();
|
||||
|
@ -947,6 +948,13 @@ void virt_acpi_setup(VirtMachineState *vms)
|
|||
fw_cfg_add_file(vms->fw_cfg, ACPI_BUILD_TPMLOG_FILE, tables.tcpalog->data,
|
||||
acpi_data_len(tables.tcpalog));
|
||||
|
||||
if (vms->ras) {
|
||||
assert(vms->acpi_dev);
|
||||
acpi_ged_state = ACPI_GED(vms->acpi_dev);
|
||||
acpi_ghes_add_fw_cfg(&acpi_ged_state->ghes_state,
|
||||
vms->fw_cfg, tables.hardware_errors);
|
||||
}
|
||||
|
||||
build_state->rsdp_mr = acpi_add_rom_blob(virt_acpi_build_update,
|
||||
build_state, tables.rsdp,
|
||||
ACPI_BUILD_RSDP_FILE, 0);
|
||||
|
|
|
@ -61,6 +61,7 @@
|
|||
|
||||
#include "hw/sysbus.h"
|
||||
#include "hw/acpi/memory_hotplug.h"
|
||||
#include "hw/acpi/ghes.h"
|
||||
|
||||
#define ACPI_POWER_BUTTON_DEVICE "PWRB"
|
||||
|
||||
|
@ -96,6 +97,7 @@ typedef struct AcpiGedState {
|
|||
GEDState ged_state;
|
||||
uint32_t ged_event_bitmap;
|
||||
qemu_irq irq;
|
||||
AcpiGhesState ghes_state;
|
||||
} AcpiGedState;
|
||||
|
||||
void build_ged_aml(Aml *table, const char* name, HotplugHandler *hotplug_dev,
|
||||
|
|
|
@ -62,6 +62,12 @@ enum {
|
|||
ACPI_HEST_SRC_ID_RESERVED,
|
||||
};
|
||||
|
||||
typedef struct AcpiGhesState {
|
||||
uint64_t ghes_addr_le;
|
||||
} AcpiGhesState;
|
||||
|
||||
void build_ghes_error_table(GArray *hardware_errors, BIOSLinker *linker);
|
||||
void acpi_build_hest(GArray *table_data, BIOSLinker *linker);
|
||||
void acpi_ghes_add_fw_cfg(AcpiGhesState *vms, FWCfgState *s,
|
||||
GArray *hardware_errors);
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue