diff options
author | Eduardo Habkost <ehabkost@redhat.com> | 2014-03-14 16:33:51 -0300 |
---|---|---|
committer | Michael S. Tsirkin <mst@redhat.com> | 2014-03-18 16:08:43 +0200 |
commit | 5ff020b7b02dce36a66c106df986ff68f8452542 (patch) | |
tree | 1aa642518ef5030faeeb67f4ce175f40694a1a4d /hw/i386 | |
parent | 1d14ac5af04fab9ee734cc4c810f022df6745278 (diff) | |
download | qemu-5ff020b7b02dce36a66c106df986ff68f8452542.tar.gz qemu-5ff020b7b02dce36a66c106df986ff68f8452542.tar.bz2 qemu-5ff020b7b02dce36a66c106df986ff68f8452542.zip |
pc: Refuse CPU hotplug if the resulting APIC ID is too large
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 <ehabkost@redhat.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Diffstat (limited to 'hw/i386')
-rw-r--r-- | hw/i386/pc.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/hw/i386/pc.c b/hw/i386/pc.c index e715a3312d..74cb4f962c 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); |