Introduce -smp ,maxcpus= flag to specify maximum number of CPUS. Follow on patch will use it to determine the size of the MADT and other BIOS tables. Signed-off-by: Jes Sorensen --- hw/fw_cfg.c | 1 + hw/fw_cfg.h | 1 + qemu-options.hx | 5 ++++- sysemu.h | 1 + vl.c | 20 +++++++++++++++++++- 5 files changed, 26 insertions(+), 2 deletions(-) Index: qemu/hw/fw_cfg.c =================================================================== --- qemu.orig/hw/fw_cfg.c +++ qemu/hw/fw_cfg.c @@ -279,6 +279,7 @@ void *fw_cfg_init(uint32_t ctl_port, uin fw_cfg_add_bytes(s, FW_CFG_UUID, qemu_uuid, 16); fw_cfg_add_i16(s, FW_CFG_NOGRAPHIC, (uint16_t)(display_type == DT_NOGRAPHIC)); fw_cfg_add_i16(s, FW_CFG_NB_CPUS, (uint16_t)smp_cpus); + fw_cfg_add_i16(s, FW_CFG_MAX_CPUS, (uint16_t)max_cpus); register_savevm("fw_cfg", -1, 1, fw_cfg_save, fw_cfg_load, s); qemu_register_reset(fw_cfg_reset, 0, s); Index: qemu/hw/fw_cfg.h =================================================================== --- qemu.orig/hw/fw_cfg.h +++ qemu/hw/fw_cfg.h @@ -15,6 +15,7 @@ #define FW_CFG_INITRD_SIZE 0x0b #define FW_CFG_BOOT_DEVICE 0x0c #define FW_CFG_NUMA 0x0d +#define FW_CFG_MAX_CPUS 0x0e #define FW_CFG_MAX_ENTRY 0x10 #define FW_CFG_WRITE_CHANNEL 0x4000 Index: qemu/qemu-options.hx =================================================================== --- qemu.orig/qemu-options.hx +++ qemu/qemu-options.hx @@ -39,7 +39,10 @@ Select CPU model (-cpu ? for list and ad ETEXI DEF("smp", HAS_ARG, QEMU_OPTION_smp, - "-smp n set the number of CPUs to 'n' [default=1]\n") + "-smp n,[maxcpus=cpus]\n" + " set the number of CPUs to 'n' [default=1]\n" + " maxcpus= maximum number of total cpus, including\n" + " offline CPUs for hotplug etc.\n") STEXI @item -smp @var{n} Simulate an SMP system with @var{n} CPUs. On the PC target, up to 255 Index: qemu/sysemu.h =================================================================== --- qemu.orig/sysemu.h +++ qemu/sysemu.h @@ -118,6 +118,7 @@ extern int alt_grab; extern int usb_enabled; extern int no_virtio_balloon; extern int smp_cpus; +extern int max_cpus; extern int cursor_hide; extern int graphic_rotate; extern int no_quit; Index: qemu/vl.c =================================================================== --- qemu.orig/vl.c +++ qemu/vl.c @@ -241,6 +241,7 @@ int rtc_td_hack = 0; int usb_enabled = 0; int singlestep = 0; int smp_cpus = 1; +int max_cpus = 16; const char *vnc_display; int acpi_enabled = 1; int no_hpet = 0; @@ -5550,12 +5551,29 @@ int main(int argc, char **argv, char **e usb_devices_index++; break; case QEMU_OPTION_smp: - smp_cpus = atoi(optarg); + { + char *p; + char option[128]; + smp_cpus = strtol(optarg, &p, 10); if (smp_cpus < 1) { fprintf(stderr, "Invalid number of CPUs\n"); exit(1); } + if (*p++ != ',') + break; + if (get_param_value(option, 128, "maxcpus", p)) + max_cpus = strtol(option, NULL, 0); + if (max_cpus < smp_cpus) { + fprintf(stderr, "maxcpus must be equal to or greater than " + "smp\n"); + exit(1); + } + if (max_cpus > 255) { + fprintf(stderr, "Unsupported number of maxcpus\n"); + exit(1); + } break; + } case QEMU_OPTION_vnc: display_type = DT_VNC; vnc_display = optarg;