From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54969) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WNntJ-0001oA-Ln for qemu-devel@nongnu.org; Wed, 12 Mar 2014 14:28:42 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WNntC-0005xr-WC for qemu-devel@nongnu.org; Wed, 12 Mar 2014 14:28:33 -0400 Received: from mx1.redhat.com ([209.132.183.28]:13532) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WNntC-0005wp-P0 for qemu-devel@nongnu.org; Wed, 12 Mar 2014 14:28:26 -0400 From: Eduardo Habkost Date: Wed, 12 Mar 2014 15:28:08 -0300 Message-Id: <1394648890-933-3-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 2/4] pc: Refuse CPU hotplug if the resulting APIC ID is too large 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" The ACPI CPU hotplug code requires APIC IDs to be smaller than ACPI_CPU_HOTPLUG_ID_LIMIT, so enforce the limit before trying to hotplug a new vCPU, returning an error instead of crashing. Signed-off-by: Eduardo Habkost --- hw/i386/pc.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/hw/i386/pc.c b/hw/i386/pc.c index e715a33..74cb4f9 100644 --- a/hw/i386/pc.c +++ b/hw/i386/pc.c @@ -53,6 +53,7 @@ #include "qemu/bitmap.h" #include "qemu/config-file.h" #include "hw/acpi/acpi.h" +#include "hw/acpi/cpu_hotplug.h" #include "hw/cpu/icc_bus.h" #include "hw/boards.h" #include "hw/pci/pci_host.h" @@ -974,6 +975,13 @@ void pc_hot_add_cpu(const int64_t id, Error **errp) return; } + if (apic_id >= ACPI_CPU_HOTPLUG_ID_LIMIT) { + error_setg(errp, "Unable to add CPU: %" PRIi64 + ", resulting APIC ID (%" PRIi64 ") is too large", + id, apic_id); + return; + } + icc_bridge = DEVICE(object_resolve_path_type("icc-bridge", TYPE_ICC_BRIDGE, NULL)); pc_new_cpu(current_cpu_model, apic_id, icc_bridge, errp); -- 1.8.5.3