55 lines
1.9 KiB
Diff
55 lines
1.9 KiB
Diff
|
|
From 028d71744dfeedabfa67d629c71a6ed5e494cc68 Mon Sep 17 00:00:00 2001
|
||
|
|
From: Salil Mehta <salil.mehta@huawei.com>
|
||
|
|
Date: Tue, 29 Aug 2023 00:47:05 +0000
|
||
|
|
Subject: [PATCH] arm/virt: Create GED dev before *disabled* CPU Objs are
|
||
|
|
destroyed
|
||
|
|
|
||
|
|
ACPI CPU hotplug state (is_present=_STA.PRESENT, is_enabled=_STA.ENABLED) for
|
||
|
|
all the possible vCPUs MUST be initialized during machine init. This is done
|
||
|
|
during the creation of the GED device. VMM/Qemu MUST expose/fake the ACPI state
|
||
|
|
of the disabled vCPUs to the Guest kernel as 'present' (_STA.PRESENT) always
|
||
|
|
i.e. ACPI persistent. if the 'disabled' vCPU objectes are destroyed before the
|
||
|
|
GED device has been created then their ACPI hotplug state might not get
|
||
|
|
initialized correctly as acpi_persistent flag is part of the CPUState. This will
|
||
|
|
expose wrong status of the unplugged vCPUs to the Guest kernel.
|
||
|
|
|
||
|
|
Hence, moving the GED device creation before disabled vCPU objects get destroyed
|
||
|
|
as part of the post CPU init routine.
|
||
|
|
|
||
|
|
Signed-off-by: Salil Mehta <salil.mehta@huawei.com>
|
||
|
|
---
|
||
|
|
hw/arm/virt.c | 10 +++++++---
|
||
|
|
1 file changed, 7 insertions(+), 3 deletions(-)
|
||
|
|
|
||
|
|
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
|
||
|
|
index 155000f22f..818398e753 100644
|
||
|
|
--- a/hw/arm/virt.c
|
||
|
|
+++ b/hw/arm/virt.c
|
||
|
|
@@ -2472,6 +2472,12 @@ static void machvirt_init(MachineState *machine)
|
||
|
|
|
||
|
|
create_gic(vms, sysmem);
|
||
|
|
|
||
|
|
+ has_ged = has_ged && aarch64 && firmware_loaded &&
|
||
|
|
+ virt_is_acpi_enabled(vms);
|
||
|
|
+ if (has_ged) {
|
||
|
|
+ vms->acpi_dev = create_acpi_ged(vms);
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
virt_cpu_post_init(vms, sysmem);
|
||
|
|
|
||
|
|
fdt_add_pmu_nodes(vms);
|
||
|
|
@@ -2496,9 +2502,7 @@ static void machvirt_init(MachineState *machine)
|
||
|
|
|
||
|
|
create_pcie(vms);
|
||
|
|
|
||
|
|
- if (has_ged && aarch64 && firmware_loaded && virt_is_acpi_enabled(vms)) {
|
||
|
|
- vms->acpi_dev = create_acpi_ged(vms);
|
||
|
|
- } else {
|
||
|
|
+ if (!has_ged) {
|
||
|
|
create_gpio_devices(vms, VIRT_GPIO, sysmem);
|
||
|
|
}
|
||
|
|
|
||
|
|
--
|
||
|
|
2.27.0
|
||
|
|
|