pc: acpi: create Processor and Notify objects only for valid lapics
do not assume that all lapics in range 0..apic_id_limit are valid and do not create Processor and Notify objects for not possible lapics. Signed-off-by: Igor Mammedov <imammedo@redhat.com> Reviewed-by: Eduardo Habkost <ehabkost@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
		
							parent
							
								
									907e7c94d1
								
							
						
					
					
						commit
						2adba0a18a
					
				@ -965,7 +965,7 @@ static Aml *build_crs(PCIHostState *host,
 | 
				
			|||||||
    return crs;
 | 
					    return crs;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void build_processor_devices(Aml *sb_scope, unsigned acpi_cpus,
 | 
					static void build_processor_devices(Aml *sb_scope, MachineState *machine,
 | 
				
			||||||
                                    AcpiCpuInfo *cpu, AcpiPmInfo *pm)
 | 
					                                    AcpiCpuInfo *cpu, AcpiPmInfo *pm)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    int i;
 | 
					    int i;
 | 
				
			||||||
@ -975,11 +975,14 @@ static void build_processor_devices(Aml *sb_scope, unsigned acpi_cpus,
 | 
				
			|||||||
    Aml *field;
 | 
					    Aml *field;
 | 
				
			||||||
    Aml *ifctx;
 | 
					    Aml *ifctx;
 | 
				
			||||||
    Aml *method;
 | 
					    Aml *method;
 | 
				
			||||||
 | 
					    MachineClass *mc = MACHINE_GET_CLASS(machine);
 | 
				
			||||||
 | 
					    CPUArchIdList *apic_ids = mc->possible_cpu_arch_ids(machine);
 | 
				
			||||||
 | 
					    PCMachineState *pcms = PC_MACHINE(machine);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* The current AML generator can cover the APIC ID range [0..255],
 | 
					    /* The current AML generator can cover the APIC ID range [0..255],
 | 
				
			||||||
     * inclusive, for VCPU hotplug. */
 | 
					     * inclusive, for VCPU hotplug. */
 | 
				
			||||||
    QEMU_BUILD_BUG_ON(ACPI_CPU_HOTPLUG_ID_LIMIT > 256);
 | 
					    QEMU_BUILD_BUG_ON(ACPI_CPU_HOTPLUG_ID_LIMIT > 256);
 | 
				
			||||||
    g_assert(acpi_cpus <= ACPI_CPU_HOTPLUG_ID_LIMIT);
 | 
					    g_assert(pcms->apic_id_limit <= ACPI_CPU_HOTPLUG_ID_LIMIT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* create PCI0.PRES device and its _CRS to reserve CPU hotplug MMIO */
 | 
					    /* create PCI0.PRES device and its _CRS to reserve CPU hotplug MMIO */
 | 
				
			||||||
    dev = aml_device("PCI0." stringify(CPU_HOTPLUG_RESOURCE_DEVICE));
 | 
					    dev = aml_device("PCI0." stringify(CPU_HOTPLUG_RESOURCE_DEVICE));
 | 
				
			||||||
@ -1004,22 +1007,26 @@ static void build_processor_devices(Aml *sb_scope, unsigned acpi_cpus,
 | 
				
			|||||||
    aml_append(sb_scope, field);
 | 
					    aml_append(sb_scope, field);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* build Processor object for each processor */
 | 
					    /* build Processor object for each processor */
 | 
				
			||||||
    for (i = 0; i < acpi_cpus; i++) {
 | 
					    for (i = 0; i < apic_ids->len; i++) {
 | 
				
			||||||
        dev = aml_processor(i, 0, 0, "CP%.02X", i);
 | 
					        int apic_id = apic_ids->cpus[i].arch_id;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        assert(apic_id < ACPI_CPU_HOTPLUG_ID_LIMIT);
 | 
				
			||||||
 | 
					        dev = aml_processor(apic_id, 0, 0, "CP%.02X", apic_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        method = aml_method("_MAT", 0, AML_NOTSERIALIZED);
 | 
					        method = aml_method("_MAT", 0, AML_NOTSERIALIZED);
 | 
				
			||||||
        aml_append(method,
 | 
					        aml_append(method,
 | 
				
			||||||
            aml_return(aml_call1(CPU_MAT_METHOD, aml_int(i))));
 | 
					            aml_return(aml_call1(CPU_MAT_METHOD, aml_int(apic_id))));
 | 
				
			||||||
        aml_append(dev, method);
 | 
					        aml_append(dev, method);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        method = aml_method("_STA", 0, AML_NOTSERIALIZED);
 | 
					        method = aml_method("_STA", 0, AML_NOTSERIALIZED);
 | 
				
			||||||
        aml_append(method,
 | 
					        aml_append(method,
 | 
				
			||||||
            aml_return(aml_call1(CPU_STATUS_METHOD, aml_int(i))));
 | 
					            aml_return(aml_call1(CPU_STATUS_METHOD, aml_int(apic_id))));
 | 
				
			||||||
        aml_append(dev, method);
 | 
					        aml_append(dev, method);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        method = aml_method("_EJ0", 1, AML_NOTSERIALIZED);
 | 
					        method = aml_method("_EJ0", 1, AML_NOTSERIALIZED);
 | 
				
			||||||
        aml_append(method,
 | 
					        aml_append(method,
 | 
				
			||||||
            aml_return(aml_call2(CPU_EJECT_METHOD, aml_int(i), aml_arg(0)))
 | 
					            aml_return(aml_call2(CPU_EJECT_METHOD, aml_int(apic_id),
 | 
				
			||||||
 | 
					                aml_arg(0)))
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
        aml_append(dev, method);
 | 
					        aml_append(dev, method);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1031,10 +1038,12 @@ static void build_processor_devices(Aml *sb_scope, unsigned acpi_cpus,
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    /* Arg0 = Processor ID = APIC ID */
 | 
					    /* Arg0 = Processor ID = APIC ID */
 | 
				
			||||||
    method = aml_method(AML_NOTIFY_METHOD, 2, AML_NOTSERIALIZED);
 | 
					    method = aml_method(AML_NOTIFY_METHOD, 2, AML_NOTSERIALIZED);
 | 
				
			||||||
    for (i = 0; i < acpi_cpus; i++) {
 | 
					    for (i = 0; i < apic_ids->len; i++) {
 | 
				
			||||||
        ifctx = aml_if(aml_equal(aml_arg(0), aml_int(i)));
 | 
					        int apic_id = apic_ids->cpus[i].arch_id;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ifctx = aml_if(aml_equal(aml_arg(0), aml_int(apic_id)));
 | 
				
			||||||
        aml_append(ifctx,
 | 
					        aml_append(ifctx,
 | 
				
			||||||
            aml_notify(aml_name("CP%.02X", i), aml_arg(1))
 | 
					            aml_notify(aml_name("CP%.02X", apic_id), aml_arg(1))
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
        aml_append(method, ifctx);
 | 
					        aml_append(method, ifctx);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -1047,14 +1056,15 @@ static void build_processor_devices(Aml *sb_scope, unsigned acpi_cpus,
 | 
				
			|||||||
     * ith up to 255 elements. Windows guests up to win2k8 fail when
 | 
					     * ith up to 255 elements. Windows guests up to win2k8 fail when
 | 
				
			||||||
     * VarPackageOp is used.
 | 
					     * VarPackageOp is used.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    pkg = acpi_cpus <= 255 ? aml_package(acpi_cpus) :
 | 
					    pkg = pcms->apic_id_limit <= 255 ? aml_package(pcms->apic_id_limit) :
 | 
				
			||||||
                             aml_varpackage(acpi_cpus);
 | 
					                                       aml_varpackage(pcms->apic_id_limit);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (i = 0; i < acpi_cpus; i++) {
 | 
					    for (i = 0; i < pcms->apic_id_limit; i++) {
 | 
				
			||||||
        uint8_t b = test_bit(i, cpu->found_cpus) ? 0x01 : 0x00;
 | 
					        uint8_t b = test_bit(i, cpu->found_cpus) ? 0x01 : 0x00;
 | 
				
			||||||
        aml_append(pkg, aml_int(b));
 | 
					        aml_append(pkg, aml_int(b));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    aml_append(sb_scope, aml_name_decl(CPU_ON_BITMAP, pkg));
 | 
					    aml_append(sb_scope, aml_name_decl(CPU_ON_BITMAP, pkg));
 | 
				
			||||||
 | 
					    g_free(apic_ids);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void build_memory_devices(Aml *sb_scope, int nr_mem,
 | 
					static void build_memory_devices(Aml *sb_scope, int nr_mem,
 | 
				
			||||||
@ -2327,7 +2337,7 @@ build_dsdt(GArray *table_data, GArray *linker,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    sb_scope = aml_scope("\\_SB");
 | 
					    sb_scope = aml_scope("\\_SB");
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        build_processor_devices(sb_scope, pcms->apic_id_limit, cpu, pm);
 | 
					        build_processor_devices(sb_scope, machine, cpu, pm);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        build_memory_devices(sb_scope, nr_mem, pm->mem_hp_io_base,
 | 
					        build_memory_devices(sb_scope, nr_mem, pm->mem_hp_io_base,
 | 
				
			||||||
                             pm->mem_hp_io_len);
 | 
					                             pm->mem_hp_io_len);
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user