Commit 6be68d7eb9037fa3b8ef18901e5c02c120463efd

Authored by Jes Sorensen
Committed by Anthony Liguori
1 parent 96c1606b

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 <jes@sgi.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
hw/fw_cfg.c
@@ -279,6 +279,7 @@ void *fw_cfg_init(uint32_t ctl_port, uint32_t data_port, @@ -279,6 +279,7 @@ void *fw_cfg_init(uint32_t ctl_port, uint32_t data_port,
279 fw_cfg_add_bytes(s, FW_CFG_UUID, qemu_uuid, 16); 279 fw_cfg_add_bytes(s, FW_CFG_UUID, qemu_uuid, 16);
280 fw_cfg_add_i16(s, FW_CFG_NOGRAPHIC, (uint16_t)(display_type == DT_NOGRAPHIC)); 280 fw_cfg_add_i16(s, FW_CFG_NOGRAPHIC, (uint16_t)(display_type == DT_NOGRAPHIC));
281 fw_cfg_add_i16(s, FW_CFG_NB_CPUS, (uint16_t)smp_cpus); 281 fw_cfg_add_i16(s, FW_CFG_NB_CPUS, (uint16_t)smp_cpus);
  282 + fw_cfg_add_i16(s, FW_CFG_MAX_CPUS, (uint16_t)max_cpus);
282 fw_cfg_add_i16(s, FW_CFG_BOOT_MENU, (uint16_t)boot_menu); 283 fw_cfg_add_i16(s, FW_CFG_BOOT_MENU, (uint16_t)boot_menu);
283 284
284 register_savevm("fw_cfg", -1, 1, fw_cfg_save, fw_cfg_load, s); 285 register_savevm("fw_cfg", -1, 1, fw_cfg_save, fw_cfg_load, s);
hw/fw_cfg.h
@@ -16,6 +16,7 @@ @@ -16,6 +16,7 @@
16 #define FW_CFG_BOOT_DEVICE 0x0c 16 #define FW_CFG_BOOT_DEVICE 0x0c
17 #define FW_CFG_NUMA 0x0d 17 #define FW_CFG_NUMA 0x0d
18 #define FW_CFG_BOOT_MENU 0x0e 18 #define FW_CFG_BOOT_MENU 0x0e
  19 +#define FW_CFG_MAX_CPUS 0x0f
19 #define FW_CFG_MAX_ENTRY 0x10 20 #define FW_CFG_MAX_ENTRY 0x10
20 21
21 #define FW_CFG_WRITE_CHANNEL 0x4000 22 #define FW_CFG_WRITE_CHANNEL 0x4000
qemu-options.hx
@@ -39,7 +39,10 @@ Select CPU model (-cpu ? for list and additional feature selection) @@ -39,7 +39,10 @@ Select CPU model (-cpu ? for list and additional feature selection)
39 ETEXI 39 ETEXI
40 40
41 DEF("smp", HAS_ARG, QEMU_OPTION_smp, 41 DEF("smp", HAS_ARG, QEMU_OPTION_smp,
42 - "-smp n set the number of CPUs to 'n' [default=1]\n") 42 + "-smp n[,maxcpus=cpus]\n"
  43 + " set the number of CPUs to 'n' [default=1]\n"
  44 + " maxcpus= maximum number of total cpus, including\n"
  45 + " offline CPUs for hotplug etc.\n")
43 STEXI 46 STEXI
44 @item -smp @var{n} 47 @item -smp @var{n}
45 Simulate an SMP system with @var{n} CPUs. On the PC target, up to 255 48 Simulate an SMP system with @var{n} CPUs. On the PC target, up to 255
sysemu.h
@@ -121,6 +121,7 @@ extern int usb_enabled; @@ -121,6 +121,7 @@ extern int usb_enabled;
121 extern int virtio_balloon; 121 extern int virtio_balloon;
122 extern const char *virtio_balloon_devaddr; 122 extern const char *virtio_balloon_devaddr;
123 extern int smp_cpus; 123 extern int smp_cpus;
  124 +extern int max_cpus;
124 extern int cursor_hide; 125 extern int cursor_hide;
125 extern int graphic_rotate; 126 extern int graphic_rotate;
126 extern int no_quit; 127 extern int no_quit;
@@ -222,6 +222,7 @@ int rtc_td_hack = 0; @@ -222,6 +222,7 @@ int rtc_td_hack = 0;
222 int usb_enabled = 0; 222 int usb_enabled = 0;
223 int singlestep = 0; 223 int singlestep = 0;
224 int smp_cpus = 1; 224 int smp_cpus = 1;
  225 +int max_cpus = 0;
225 const char *vnc_display; 226 const char *vnc_display;
226 int acpi_enabled = 1; 227 int acpi_enabled = 1;
227 int no_hpet = 0; 228 int no_hpet = 0;
@@ -5453,12 +5454,29 @@ int main(int argc, char **argv, char **envp) @@ -5453,12 +5454,29 @@ int main(int argc, char **argv, char **envp)
5453 add_device_config(DEV_GENERIC, optarg); 5454 add_device_config(DEV_GENERIC, optarg);
5454 break; 5455 break;
5455 case QEMU_OPTION_smp: 5456 case QEMU_OPTION_smp:
5456 - smp_cpus = atoi(optarg); 5457 + {
  5458 + char *p;
  5459 + char option[128];
  5460 + smp_cpus = strtol(optarg, &p, 10);
5457 if (smp_cpus < 1) { 5461 if (smp_cpus < 1) {
5458 fprintf(stderr, "Invalid number of CPUs\n"); 5462 fprintf(stderr, "Invalid number of CPUs\n");
5459 exit(1); 5463 exit(1);
5460 } 5464 }
  5465 + if (*p++ != ',')
  5466 + break;
  5467 + if (get_param_value(option, 128, "maxcpus", p))
  5468 + max_cpus = strtol(option, NULL, 0);
  5469 + if (max_cpus < smp_cpus) {
  5470 + fprintf(stderr, "maxcpus must be equal to or greater than "
  5471 + "smp\n");
  5472 + exit(1);
  5473 + }
  5474 + if (max_cpus > 255) {
  5475 + fprintf(stderr, "Unsupported number of maxcpus\n");
  5476 + exit(1);
  5477 + }
5461 break; 5478 break;
  5479 + }
5462 case QEMU_OPTION_vnc: 5480 case QEMU_OPTION_vnc:
5463 display_type = DT_VNC; 5481 display_type = DT_VNC;
5464 vnc_display = optarg; 5482 vnc_display = optarg;
@@ -5639,6 +5657,13 @@ int main(int argc, char **argv, char **envp) @@ -5639,6 +5657,13 @@ int main(int argc, char **argv, char **envp)
5639 } 5657 }
5640 #endif 5658 #endif
5641 5659
  5660 + /*
  5661 + * Default to max_cpus = smp_cpus, in case the user doesn't
  5662 + * specify a max_cpus value.
  5663 + */
  5664 + if (!max_cpus)
  5665 + max_cpus = smp_cpus;
  5666 +
5642 machine->max_cpus = machine->max_cpus ?: 1; /* Default to UP */ 5667 machine->max_cpus = machine->max_cpus ?: 1; /* Default to UP */
5643 if (smp_cpus > machine->max_cpus) { 5668 if (smp_cpus > machine->max_cpus) {
5644 fprintf(stderr, "Number of SMP cpus requested (%d), exceeds max cpus " 5669 fprintf(stderr, "Number of SMP cpus requested (%d), exceeds max cpus "