On Thu, Oct 13, 2016 at 11:52:39AM +0200, Igor Mammedov wrote:
[...]
> @@ -236,7 +237,11 @@ void build_legacy_cpu_hotplug_aml(Aml *ctx, MachineState
> *machine,
> /* The current AML generator can cover the APIC ID range [0..255],
> * inclusive, for VCPU hotplug. */
> QEMU_BUILD_BUG_ON(ACPI_CPU_HOTPLUG_ID_LIMIT > 256);
> - g_assert(pcms->apic_id_limit <= ACPI_CPU_HOTPLUG_ID_LIMIT);
> + if (pcms->apic_id_limit > ACPI_CPU_HOTPLUG_ID_LIMIT) {
> + error_report("max_cpus is too large. APIC ID of last CPU is %u",
> + pcms->apic_id_limit - 1);
> + exit(1);
> + }
Moving the check here seems to make sense, but:
>
> /* create PCI0.PRES device and its _CRS to reserve CPU hotplug MMIO */
> dev = aml_device("PCI0." stringify(CPU_HOTPLUG_RESOURCE_DEVICE));
> diff --git a/hw/i386/pc.c b/hw/i386/pc.c
> index 93ff49c..f1c1013 100644
> --- a/hw/i386/pc.c
> +++ b/hw/i386/pc.c
> @@ -778,7 +778,6 @@ static FWCfgState *bochs_bios_init(AddressSpace *as,
> PCMachineState *pcms)
[Added more context below to show the code around the change]
> numa_fw_cfg = g_new0(uint64_t, 1 + pcms->apic_id_limit + nb_numa_nodes);
> numa_fw_cfg[0] = cpu_to_le64(nb_numa_nodes);
> for (i = 0; i < max_cpus; i++) {
> unsigned int apic_id = x86_cpu_apic_id_from_index(i);
> - assert(apic_id < pcms->apic_id_limit);
If you really needed to remove this assert, that means you can
write beyond the end of numa_fw_fg[] below. Are you sure you need
to remove it?
> j = numa_get_node_for_cpu(i);
> if (j < nb_numa_nodes) {
> numa_fw_cfg[apic_id + 1] = cpu_to_le64(j);
^^^^^^^^^^^ here
> }
> }
>
> @@ -1190,12 +1189,6 @@ void pc_cpus_init(PCMachineState *pcms)
> * This is used for FW_CFG_MAX_CPUS. See comments on bochs_bios_init().
> */
> pcms->apic_id_limit = x86_cpu_apic_id_from_index(max_cpus - 1) + 1;
> - if (pcms->apic_id_limit > ACPI_CPU_HOTPLUG_ID_LIMIT) {
> - error_report("max_cpus is too large. APIC ID of last CPU is %u",
> - pcms->apic_id_limit - 1);
> - exit(1);
> - }
> -
> pcms->possible_cpus = g_malloc0(sizeof(CPUArchIdList) +
> sizeof(CPUArchId) * max_cpus);
> for (i = 0; i < max_cpus; i++) {
> --
> 2.7.4
>
--
Eduardo