From: Ashish Kalra <ashish.kalra@xxxxxxx> OVMF expects both fw_cfg and the modern CPU hotplug interface to return the same boot CPU count. We reduce the fw_cfg boot cpu count with number of mirror vcpus's. This fails the OVMF sanity check as fw_cfg boot cpu count and modern CPU hotplug interface boot count don't match, hence disable the modern CPU hotplug interface. Signed-off-by: Ashish Kalra <ashish.kalra@xxxxxxx> --- hw/acpi/cpu.c | 11 ++++++++++- include/hw/acpi/cpu.h | 1 + 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/hw/acpi/cpu.c b/hw/acpi/cpu.c index 8ac2fd018e..6cfaf2b450 100644 --- a/hw/acpi/cpu.c +++ b/hw/acpi/cpu.c @@ -86,7 +86,12 @@ static uint64_t cpu_hotplug_rd(void *opaque, hwaddr addr, unsigned size) case ACPI_CPU_CMD_DATA2_OFFSET_R: switch (cpu_st->command) { case CPHP_GET_NEXT_CPU_WITH_EVENT_CMD: - val = 0; + /* Disabling modern CPUHP interface for mirror vCPU support */ + if (!cpu_st->mirror_vcpu_enabled) { + val = 0; + } else { + val = -1ULL; + } break; case CPHP_GET_CPU_ID_CMD: val = cdev->arch_id >> 32; @@ -226,6 +231,10 @@ void cpu_hotplug_hw_init(MemoryRegion *as, Object *owner, state->dev_count = id_list->len; state->devs = g_new0(typeof(*state->devs), state->dev_count); for (i = 0; i < id_list->len; i++) { + /* Disabling modern CPUHP interface for mirror vCPU support */ + if (id_list->cpus[i].mirror_vcpu) { + state->mirror_vcpu_enabled = TRUE; + } state->devs[i].cpu = CPU(id_list->cpus[i].cpu); state->devs[i].arch_id = id_list->cpus[i].arch_id; } diff --git a/include/hw/acpi/cpu.h b/include/hw/acpi/cpu.h index 999caaf510..e7949e86b8 100644 --- a/include/hw/acpi/cpu.h +++ b/include/hw/acpi/cpu.h @@ -33,6 +33,7 @@ typedef struct CPUHotplugState { uint8_t command; uint32_t dev_count; AcpiCpuStatus *devs; + bool mirror_vcpu_enabled; } CPUHotplugState; void acpi_cpu_plug_cb(HotplugHandler *hotplug_dev, -- 2.17.1