On Thu, 28 Dec 2017 13:54:17 +0800 Dongjiu Geng <gengdongjiu@xxxxxxxxxx> wrote: > Support this feature since version 2.10, disable it by > default in the old version. patch should go before acpi tables are actually added, otherwise it might break bisectability. > > Signed-off-by: Dongjiu Geng <gengdongjiu@xxxxxxxxxx> > --- > Address Shannon's comments to add platform version in [1]. > > [1]: https://lkml.org/lkml/2017/8/25/821 > > Signed-off-by: Dongjiu Geng <gengdongjiu@xxxxxxxxxx> > --- > hw/arm/virt-acpi-build.c | 14 +++++++++----- > hw/arm/virt.c | 4 ++++ > include/hw/arm/virt.h | 1 + > 3 files changed, 14 insertions(+), 5 deletions(-) > > diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c > index 06c14b3..b6974ef 100644 > --- a/hw/arm/virt-acpi-build.c > +++ b/hw/arm/virt-acpi-build.c > @@ -801,10 +801,11 @@ void virt_acpi_build(VirtMachineState *vms, AcpiBuildTables *tables) > acpi_add_table(table_offsets, tables_blob); > build_spcr(tables_blob, tables->linker, vms); > > - acpi_add_table(table_offsets, tables_blob); > - build_hardware_error_table(tables->hardware_errors, tables->linker); > - build_apei_ghes(tables_blob, tables->hardware_errors, tables->linker); > - > + if (!vmc->no_ras) { it's better to avoid no_foo, use something like vmc->has_ras instead > + acpi_add_table(table_offsets, tables_blob); > + build_hardware_error_table(tables->hardware_errors, tables->linker); > + build_apei_ghes(tables_blob, tables->hardware_errors, tables->linker); > + } > > if (nb_numa_nodes > 0) { > acpi_add_table(table_offsets, tables_blob); > @@ -891,6 +892,7 @@ static const VMStateDescription vmstate_virt_acpi_build = { > > void virt_acpi_setup(VirtMachineState *vms) > { > + VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms); > AcpiBuildTables tables; > AcpiBuildState *build_state; > > @@ -922,7 +924,9 @@ 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)); > > - ghes_add_fw_cfg(vms->fw_cfg, tables.hardware_errors); > + if (!vmc->no_ras) { > + ghes_add_fw_cfg(vms->fw_cfg, tables.hardware_errors); > + } > > build_state->rsdp_mr = acpi_add_rom_blob(build_state, tables.rsdp, > ACPI_BUILD_RSDP_FILE, 0); > diff --git a/hw/arm/virt.c b/hw/arm/virt.c > index 68495c2..ab79988 100644 > --- a/hw/arm/virt.c > +++ b/hw/arm/virt.c > @@ -1732,8 +1732,12 @@ static void virt_2_9_instance_init(Object *obj) > > static void virt_machine_2_9_options(MachineClass *mc) > { > + VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc)); > + > virt_machine_2_10_options(mc); > SET_MACHINE_COMPAT(mc, VIRT_COMPAT_2_9); > + /* memory recovery feature was introduced with 2.10 */ > + vmc->no_ras = true; > } > DEFINE_VIRT_MACHINE(2, 9) > > diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h > index 33b0ff3..8fbd664 100644 > --- a/include/hw/arm/virt.h > +++ b/include/hw/arm/virt.h > @@ -84,6 +84,7 @@ typedef struct { > bool disallow_affinity_adjustment; > bool no_its; > bool no_pmu; > + bool no_ras; > bool claim_edge_triggered_timers; > } VirtMachineClass; >