From: Ashish Kalra <ashish.kalra@amd.com>
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@amd.com>
---
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