When building ACPI tables regarding CPUs we should always build them for the number of possible CPUs, not the number of present CPUs. So we create cpu nodes in DSDT for possible cpus and then ensure only the present CPUs are marked useful.
Co-developed-by: Andrew Jones <drjo...@redhat.com> Signed-off-by: Andrew Jones <drjo...@redhat.com> Co-developed-by: Ying Fang <fangyi...@huawei.com> Signed-off-by: Ying Fang <fangyi...@huawei.com> Co-developed-by: Yanan Wang <wangyana...@huawei.com> Signed-off-by: Yanan Wang <wangyana...@huawei.com> --- hw/arm/virt-acpi-build.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c index 60fe2e65a7..a2d8e87616 100644 --- a/hw/arm/virt-acpi-build.c +++ b/hw/arm/virt-acpi-build.c @@ -59,15 +59,17 @@ #define ACPI_BUILD_TABLE_SIZE 0x20000 -static void acpi_dsdt_add_cpus(Aml *scope, VirtMachineState *vms) +static void acpi_dsdt_add_cpus(Aml *scope, const CPUArchIdList *possible_cpus) { - MachineState *ms = MACHINE(vms); uint16_t i; - for (i = 0; i < ms->smp.cpus; i++) { + for (i = 0; i < possible_cpus->len; i++) { Aml *dev = aml_device("C%.03X", i); aml_append(dev, aml_name_decl("_HID", aml_string("ACPI0007"))); aml_append(dev, aml_name_decl("_UID", aml_int(i))); + if (possible_cpus->cpus[i].cpu == NULL) { + aml_append(dev, aml_name_decl("_STA", aml_int(0))); + } aml_append(scope, dev); } } @@ -596,6 +598,8 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms) VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms); Aml *scope, *dsdt; MachineState *ms = MACHINE(vms); + MachineClass *mc = MACHINE_GET_CLASS(vms); + const CPUArchIdList *possible_cpus = mc->possible_cpu_arch_ids(ms); const MemMapEntry *memmap = vms->memmap; const int *irqmap = vms->irqmap; @@ -609,7 +613,7 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms) * the RTC ACPI device at all when using UEFI. */ scope = aml_scope("\\_SB"); - acpi_dsdt_add_cpus(scope, vms); + acpi_dsdt_add_cpus(scope, possible_cpus); acpi_dsdt_add_uart(scope, &memmap[VIRT_UART], (irqmap[VIRT_UART] + ARM_SPI_BASE)); if (vmc->acpi_expose_flash) { -- 2.19.1