From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:55085) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WNntP-0001pt-M7 for qemu-devel@nongnu.org; Wed, 12 Mar 2014 14:28:47 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WNntG-00064J-LO for qemu-devel@nongnu.org; Wed, 12 Mar 2014 14:28:39 -0400 Received: from mx1.redhat.com ([209.132.183.28]:7960) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WNntG-000634-CI for qemu-devel@nongnu.org; Wed, 12 Mar 2014 14:28:30 -0400 From: Eduardo Habkost Date: Wed, 12 Mar 2014 15:28:10 -0300 Message-Id: <1394648890-933-5-git-send-email-ehabkost@redhat.com> In-Reply-To: <1394648890-933-1-git-send-email-ehabkost@redhat.com> References: <1394648890-933-1-git-send-email-ehabkost@redhat.com> Subject: [Qemu-devel] [PATCH v2 4/4] pc: Refuse max_cpus if it results in too large APIC ID List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Igor Mammedov , Laszlo Ersek , =?UTF-8?q?Andreas=20F=C3=A4rber?= , "Michael S. Tsirkin" This changes the PC initialization code to reject max_cpus if it results in an APIC ID that's too large, instead of aborting or erroring out when it is already too late. Currently there are two limits we need to check: the CPU hotplug APIC ID limit (due to the AcpiCpuHotplug.sts array length), and the MAX_CPUMASK_BITS limit (that's used for CPU bitmaps on NUMA code and hw/i386/acpi-build.c). Signed-off-by: Eduardo Habkost --- hw/i386/pc.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/hw/i386/pc.c b/hw/i386/pc.c index 74cb4f9..50376a3 100644 --- a/hw/i386/pc.c +++ b/hw/i386/pc.c @@ -992,6 +992,7 @@ void pc_cpus_init(const char *cpu_model, DeviceState *icc_bridge) int i; X86CPU *cpu = NULL; Error *error = NULL; + unsigned long apic_id_limit; /* init CPUs */ if (cpu_model == NULL) { @@ -1003,6 +1004,14 @@ void pc_cpus_init(const char *cpu_model, DeviceState *icc_bridge) } current_cpu_model = cpu_model; + apic_id_limit = pc_apic_id_limit(max_cpus); + if (apic_id_limit > ACPI_CPU_HOTPLUG_ID_LIMIT + || apic_id_limit > MAX_CPUMASK_BITS) { + error_report("max_cpus is too large. APIC ID of last CPU is %lu", + apic_id_limit - 1); + exit(1); + } + for (i = 0; i < smp_cpus; i++) { cpu = pc_new_cpu(cpu_model, x86_cpu_apic_id_from_index(i), icc_bridge, &error); -- 1.8.5.3