LoongArch cpu hotplug is based on ACPI GED device, there is a little change about ipi and extioi device, the value of num-cpu property is maximum cpu number rather than present cpu number.
It can be verified with qemu command: qemu-system-loongarch64 -smp 2,maxcpus=16,sockets=4,cores=4,threads=1 and vcpu can be added or remove with hmp command: device_add la464-loongarch-cpu,socket-id=0,core-id=2,thread-id=0,id=cpu-2 device_del cpu-2 --- v2 ... v3: 1. Use qdev_realize_and_unref() with qdev_realize() and object_unref(). 2. Set vcpus_count with 1 since vcpu object is created for every thread. 3. Remove property hw-id, use internal variable hw_id to differentiate cold-plug cpus and hot-plug cpus. 4. Add generic function virt_init_cpu_irq() to init interrupt pin of CPU object, used by both cold-plug and hot-plug CPUs v1 ... v2: 1. Add new property hw-id, property hw-id is set for cold-added CPUs, and property socket-id/core-id/thread-id is set for hot-added CPUs. The two properties can be generated from each other. 2. Use general hotplug api such as hotplug_handler_pre_plug etc 3. Reorganize the patch order, split the patch set into 4 small patches. --- Bibo Mao (5): hw/loongarch/virt: Add CPU topology support hw/loongarch/virt: Implement cpu plug interface hw/loongarch/virt: Add generic function to init interrupt pin of CPU hw/loongarch/virt: Update the ACPI table for hotplug cpu hw/loongarch/virt: Enable cpu hotplug feature on virt machine docs/system/loongarch/virt.rst | 31 +++ hw/loongarch/Kconfig | 1 + hw/loongarch/acpi-build.c | 35 +++- hw/loongarch/virt.c | 349 +++++++++++++++++++++++++++++---- include/hw/loongarch/virt.h | 3 + target/loongarch/cpu.c | 25 +++ target/loongarch/cpu.h | 17 ++ 7 files changed, 416 insertions(+), 45 deletions(-) base-commit: 92ec7805190313c9e628f8fc4eb4f932c15247bd -- 2.39.3