@@ -14,7 +14,6 @@ struct QEMUMachine {
const char *alias;
const char *desc;
QEMUMachineInitFunc *init;
- int max_cpus;
int is_default;
QemuOptDesc *opts_desc;
QemuOptValue *opts_default;
@@ -77,6 +76,12 @@ extern QEMUMachine *current_machine;
},{ \
.name = "default_drive", \
.type = QEMU_OPT_STRING, \
+ },{ \
+ .name = "max_cpus", \
+ .type = QEMU_OPT_NUMBER, \
+ },{ \
+ .name = "sockets", \
+ .type = QEMU_OPT_NUMBER, \
}
@@ -321,7 +321,8 @@ int fw_cfg_add_file(FWCfgState *s, const char *dir, const char *filename,
}
FWCfgState *fw_cfg_init(uint32_t ctl_port, uint32_t data_port,
- target_phys_addr_t ctl_addr, target_phys_addr_t data_addr)
+ target_phys_addr_t ctl_addr, target_phys_addr_t data_addr,
+ QemuOpts *opts)
{
FWCfgState *s;
int io_ctl_memory, io_data_memory;
@@ -349,7 +350,8 @@ FWCfgState *fw_cfg_init(uint32_t ctl_port, uint32_t data_port,
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);
+ fw_cfg_add_i16(s, FW_CFG_MAX_CPUS,
+ (uint16_t)qemu_opt_get_number(opts, "sockets", smp_cpus));
fw_cfg_add_i16(s, FW_CFG_BOOT_MENU, (uint16_t)boot_menu);
vmstate_register(-1, &vmstate_fw_cfg, s);
@@ -63,7 +63,8 @@ int fw_cfg_add_callback(FWCfgState *s, uint16_t key, FWCfgCallback callback,
int fw_cfg_add_file(FWCfgState *s, const char *dir, const char *filename,
uint8_t *data, uint32_t len);
FWCfgState *fw_cfg_init(uint32_t ctl_port, uint32_t data_port,
- target_phys_addr_t crl_addr, target_phys_addr_t data_addr);
+ target_phys_addr_t crl_addr, target_phys_addr_t data_addr,
+ QemuOpts *opts);
#endif /* NO_QEMU_PROTOS */
@@ -22,6 +22,8 @@
* THE SOFTWARE.
*/
+#include "qemu-common.h"
+#include "qemu-option.h"
#include "hw.h"
#include "fw_cfg.h"
#include "multiboot.h"
@@ -449,7 +449,7 @@ int e820_add_entry(uint64_t address, uint64_t length, uint32_t type)
return e820_table.count;
}
-static void *bochs_bios_init(void)
+static void *bochs_bios_init(QemuOpts *opts)
{
void *fw_cfg;
uint8_t *smbios_table;
@@ -468,7 +468,7 @@ static void *bochs_bios_init(void)
register_ioport_write(0x500, 1, 1, bochs_bios_write, NULL);
register_ioport_write(0x503, 1, 1, bochs_bios_write, NULL);
- fw_cfg = fw_cfg_init(BIOS_CFG_IOPORT, BIOS_CFG_IOPORT + 1, 0, 0);
+ fw_cfg = fw_cfg_init(BIOS_CFG_IOPORT, BIOS_CFG_IOPORT + 1, 0, 0, opts);
fw_cfg_add_i32(fw_cfg, FW_CFG_ID, 1);
fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)ram_size);
@@ -804,7 +804,8 @@ void pc_memory_init(ram_addr_t ram_size,
const char *kernel_cmdline,
const char *initrd_filename,
ram_addr_t *below_4g_mem_size_p,
- ram_addr_t *above_4g_mem_size_p)
+ ram_addr_t *above_4g_mem_size_p,
+ QemuOpts *opts)
{
char *filename;
int ret, linux_boot, i;
@@ -882,7 +883,7 @@ void pc_memory_init(ram_addr_t ram_size,
cpu_register_physical_memory((uint32_t)(-bios_size),
bios_size, bios_offset | IO_MEM_ROM);
- fw_cfg = bochs_bios_init();
+ fw_cfg = bochs_bios_init(opts);
rom_set_fw(fw_cfg);
if (linux_boot) {
@@ -91,7 +91,8 @@ void pc_memory_init(ram_addr_t ram_size,
const char *kernel_cmdline,
const char *initrd_filename,
ram_addr_t *below_4g_mem_size_p,
- ram_addr_t *above_4g_mem_size_p);
+ ram_addr_t *above_4g_mem_size_p,
+ QemuOpts *opts);
qemu_irq *pc_allocate_cpu_irq(void);
void pc_vga_init(PCIBus *pci_bus);
void pc_basic_device_init(qemu_irq *isa_irq,
@@ -70,7 +70,7 @@ static void pc_init(QemuOpts *opts)
/* allocate ram and load rom/bios */
pc_memory_init(ram_size, kernel_filename, kernel_cmdline, initrd_filename,
- &below_4g_mem_size, &above_4g_mem_size);
+ &below_4g_mem_size, &above_4g_mem_size, opts);
cpu_irq = pc_allocate_cpu_irq();
i8259 = i8259_init(cpu_irq[0]);
@@ -186,13 +186,13 @@ static QEMUMachine pc_machine = {
.alias = "pc",
.desc = "Standard PC",
.init = pc_init,
- .max_cpus = 255,
.is_default = 1,
.opts_desc = pc_opts_desc,
.opts_default = (QemuOptValue[]) {
QOPT_VALUE("acpi", "on"),
QOPT_VALUE("pci", "on"),
QOPT_VALUE("cpu", PC_DEFAULT_CPU_MODEL),
+ QOPT_VALUE("max_cpus", "255"),
{ /* end of list */ }
},
};
@@ -201,12 +201,12 @@ static QEMUMachine pc_machine_v0_12 = {
.name = "pc-0.12",
.desc = "Standard PC",
.init = pc_init,
- .max_cpus = 255,
.opts_desc = pc_opts_desc,
.opts_default = (QemuOptValue[]) {
QOPT_VALUE("acpi", "on"),
QOPT_VALUE("pci", "on"),
QOPT_VALUE("cpu", PC_DEFAULT_CPU_MODEL),
+ QOPT_VALUE("max_cpus", "255"),
QOPT_COMPAT_INT("virtio-serial-pci", "max_nr_ports", 1),
QOPT_COMPAT_INT("virtio-serial-pci", "vectors", 0),
{ /* end of list */ }
@@ -217,12 +217,12 @@ static QEMUMachine pc_machine_v0_11 = {
.name = "pc-0.11",
.desc = "Standard PC, qemu 0.11",
.init = pc_init,
- .max_cpus = 255,
.opts_desc = pc_opts_desc,
.opts_default = (QemuOptValue[]) {
QOPT_VALUE("acpi", "on"),
QOPT_VALUE("pci", "on"),
QOPT_VALUE("cpu", PC_DEFAULT_CPU_MODEL),
+ QOPT_VALUE("max_cpus", "255"),
QOPT_COMPAT_INT("virtio-blk-pci", "vectors", 0),
QOPT_COMPAT_INT("virtio-serial-pci", "max_nr_ports", 1),
QOPT_COMPAT_INT("virtio-serial-pci", "vectors", 0),
@@ -237,12 +237,12 @@ static QEMUMachine pc_machine_v0_10 = {
.name = "pc-0.10",
.desc = "Standard PC, qemu 0.10",
.init = pc_init,
- .max_cpus = 255,
.opts_desc = pc_opts_desc,
.opts_default = (QemuOptValue[]) {
QOPT_VALUE("acpi", "on"),
QOPT_VALUE("pci", "on"),
QOPT_VALUE("cpu", PC_DEFAULT_CPU_MODEL),
+ QOPT_VALUE("max_cpu", "255"),
QOPT_COMPAT_INT("virtio-blk-pci", "class", PCI_CLASS_STORAGE_OTHER),
QOPT_COMPAT_INT("virtio-serial-pci", "class", PCI_CLASS_DISPLAY_OTHER),
QOPT_COMPAT_INT("virtio-net-pci", "vectors", 0),
@@ -265,9 +265,9 @@ static QEMUMachine isapc_machine = {
QOPT_VALUE("acpi", "off"),
QOPT_VALUE("pci", "off"),
QOPT_VALUE("cpu", "486"),
+ QOPT_VALUE("max_cpus", "1"),
{ /* end of list */ }
},
- .max_cpus = 1,
};
static void pc_machine_init(void)
@@ -407,7 +407,7 @@ static void ppc_core99_init (QemuOpts *opts)
macio_nvram_map(nvr, 0xFFF04000);
/* No PCI init: the BIOS will do it */
- fw_cfg = fw_cfg_init(0, 0, CFG_ADDR, CFG_ADDR + 2);
+ fw_cfg = fw_cfg_init(0, 0, CFG_ADDR, CFG_ADDR + 2, opts);
fw_cfg_add_i32(fw_cfg, FW_CFG_ID, 1);
fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)ram_size);
fw_cfg_add_i16(fw_cfg, FW_CFG_MACHINE_ID, machine_arch);
@@ -442,7 +442,10 @@ static QEMUMachine core99_machine = {
.name = "mac99",
.desc = "Mac99 based PowerMAC",
.init = ppc_core99_init,
- .max_cpus = MAX_CPUS,
+ .opts_default = (QemuOptValue[]) {
+ QOPT_VALUE("max_cpus", stringify(MAX_CPUS)),
+ { /* end of list */ }
+ },
#ifdef TARGET_PPC64
.is_default = 1,
#endif
@@ -379,7 +379,7 @@ static void ppc_heathrow_init (QemuOpts *opts)
/* No PCI init: the BIOS will do it */
- fw_cfg = fw_cfg_init(0, 0, CFG_ADDR, CFG_ADDR + 2);
+ fw_cfg = fw_cfg_init(0, 0, CFG_ADDR, CFG_ADDR + 2, opts);
fw_cfg_add_i32(fw_cfg, FW_CFG_ID, 1);
fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)ram_size);
fw_cfg_add_i16(fw_cfg, FW_CFG_MACHINE_ID, ARCH_HEATHROW);
@@ -414,7 +414,10 @@ static QEMUMachine heathrow_machine = {
.name = "g3beige",
.desc = "Heathrow based PowerMAC",
.init = ppc_heathrow_init,
- .max_cpus = MAX_CPUS,
+ .opts_default = (QemuOptValue[]) {
+ QOPT_VALUE("max_cpus", stringify(MAX_CPUS)),
+ { /* end of list */ }
+ },
#ifndef TARGET_PPC64
.is_default = 1,
#endif
@@ -793,7 +793,10 @@ static QEMUMachine prep_machine = {
.name = "prep",
.desc = "PowerPC PREP platform",
.init = ppc_prep_init,
- .max_cpus = MAX_CPUS,
+ .opts_default = (QemuOptValue[]) {
+ QOPT_VALUE("max_cpus", stringify(MAX_CPUS)),
+ { /* end of list */ }
+ },
};
static void prep_machine_init(void)
@@ -444,9 +444,9 @@ static QEMUMachine realview_eb_mpcore_machine = {
.init = realview_eb_mpcore_init,
.opts_default = (QemuOptValue[]) {
QOPT_VALUE("default_drive", "scsi"),
+ QOPT_VALUE("max_cpus", "4"),
{ /* end of list */ }
},
- .max_cpus = 4,
};
static QEMUMachine realview_pb_a8_machine = {
@@ -461,9 +461,9 @@ static QEMUMachine realview_pbx_a9_machine = {
.init = realview_pbx_a9_init,
.opts_default = (QemuOptValue[]) {
QOPT_VALUE("default_drive", "scsi"),
+ QOPT_VALUE("max_cpus", "4"),
{ /* end of list */ }
},
- .max_cpus = 4,
};
static void realview_machine_init(void)
@@ -278,10 +278,9 @@ static QEMUMachine s390_machine = {
QOPT_VALUE("parallel", "off"),
QOPT_VALUE("virtcon", "on"),
QOPT_VALUE("vga", "off"),
+ QOPT_VALUE("max_cpus", "255"),
{ /* end of list */ }
},
- .no_vga = 1,
- .max_cpus = 255,
.is_default = 1,
};
@@ -798,7 +798,8 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, ram_addr_t RAM_size,
const char *boot_device,
const char *kernel_filename,
const char *kernel_cmdline,
- const char *initrd_filename, const char *cpu_model)
+ const char *initrd_filename, const char *cpu_model,
+ QemuOpts *opts)
{
unsigned int i;
void *iommu, *espdma, *ledma, *nvram;
@@ -932,7 +933,7 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, ram_addr_t RAM_size,
ecc_init(hwdef->ecc_base, slavio_irq[28],
hwdef->ecc_version);
- fw_cfg = fw_cfg_init(0, 0, CFG_ADDR, CFG_ADDR + 2);
+ fw_cfg = fw_cfg_init(0, 0, CFG_ADDR, CFG_ADDR + 2, opts);
fw_cfg_add_i32(fw_cfg, FW_CFG_ID, 1);
fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)ram_size);
fw_cfg_add_i16(fw_cfg, FW_CFG_MACHINE_ID, hwdef->machine_id);
@@ -1208,7 +1209,7 @@ static void ss5_init(QemuOpts *opts)
const char *initrd_filename = qemu_opt_get(opts, "initrd");
const char *cpu_model = qemu_opt_get(opts, "cpu");
sun4m_hw_init(&sun4m_hwdefs[0], RAM_size, boot_device, kernel_filename,
- kernel_cmdline, initrd_filename, cpu_model);
+ kernel_cmdline, initrd_filename, cpu_model, opts);
}
/* SPARCstation 10 hardware initialisation */
@@ -1221,7 +1222,7 @@ static void ss10_init(QemuOpts *opts)
const char *initrd_filename = qemu_opt_get(opts, "initrd");
const char *cpu_model = qemu_opt_get(opts, "cpu");
sun4m_hw_init(&sun4m_hwdefs[1], RAM_size, boot_device, kernel_filename,
- kernel_cmdline, initrd_filename, cpu_model);
+ kernel_cmdline, initrd_filename, cpu_model, opts);
}
/* SPARCserver 600MP hardware initialisation */
@@ -1234,7 +1235,7 @@ static void ss600mp_init(QemuOpts *opts)
const char *initrd_filename = qemu_opt_get(opts, "initrd");
const char *cpu_model = qemu_opt_get(opts, "cpu");
sun4m_hw_init(&sun4m_hwdefs[2], RAM_size, boot_device, kernel_filename,
- kernel_cmdline, initrd_filename, cpu_model);
+ kernel_cmdline, initrd_filename, cpu_model, opts);
}
/* SPARCstation 20 hardware initialisation */
@@ -1247,7 +1248,7 @@ static void ss20_init(QemuOpts *opts)
const char *initrd_filename = qemu_opt_get(opts, "initrd");
const char *cpu_model = qemu_opt_get(opts, "cpu");
sun4m_hw_init(&sun4m_hwdefs[3], RAM_size, boot_device, kernel_filename,
- kernel_cmdline, initrd_filename, cpu_model);
+ kernel_cmdline, initrd_filename, cpu_model, opts);
}
/* SPARCstation Voyager hardware initialisation */
@@ -1260,7 +1261,7 @@ static void vger_init(QemuOpts *opts)
const char *initrd_filename = qemu_opt_get(opts, "initrd");
const char *cpu_model = qemu_opt_get(opts, "cpu");
sun4m_hw_init(&sun4m_hwdefs[4], RAM_size, boot_device, kernel_filename,
- kernel_cmdline, initrd_filename, cpu_model);
+ kernel_cmdline, initrd_filename, cpu_model, opts);
}
/* SPARCstation LX hardware initialisation */
@@ -1273,7 +1274,7 @@ static void ss_lx_init(QemuOpts *opts)
const char *initrd_filename = qemu_opt_get(opts, "initrd");
const char *cpu_model = qemu_opt_get(opts, "cpu");
sun4m_hw_init(&sun4m_hwdefs[5], RAM_size, boot_device, kernel_filename,
- kernel_cmdline, initrd_filename, cpu_model);
+ kernel_cmdline, initrd_filename, cpu_model, opts);
}
/* SPARCstation 4 hardware initialisation */
@@ -1286,7 +1287,7 @@ static void ss4_init(QemuOpts *opts)
const char *initrd_filename = qemu_opt_get(opts, "initrd");
const char *cpu_model = qemu_opt_get(opts, "cpu");
sun4m_hw_init(&sun4m_hwdefs[6], RAM_size, boot_device, kernel_filename,
- kernel_cmdline, initrd_filename, cpu_model);
+ kernel_cmdline, initrd_filename, cpu_model, opts);
}
/* SPARCClassic hardware initialisation */
@@ -1299,7 +1300,7 @@ static void scls_init(QemuOpts *opts)
const char *initrd_filename = qemu_opt_get(opts, "initrd");
const char *cpu_model = qemu_opt_get(opts, "cpu");
sun4m_hw_init(&sun4m_hwdefs[7], RAM_size, boot_device, kernel_filename,
- kernel_cmdline, initrd_filename, cpu_model);
+ kernel_cmdline, initrd_filename, cpu_model, opts);
}
/* SPARCbook hardware initialisation */
@@ -1312,7 +1313,7 @@ static void sbook_init(QemuOpts *opts)
const char *initrd_filename = qemu_opt_get(opts, "initrd");
const char *cpu_model = qemu_opt_get(opts, "cpu");
sun4m_hw_init(&sun4m_hwdefs[8], RAM_size, boot_device, kernel_filename,
- kernel_cmdline, initrd_filename, cpu_model);
+ kernel_cmdline, initrd_filename, cpu_model, opts);
}
static QEMUMachine ss5_machine = {
@@ -1332,9 +1333,9 @@ static QEMUMachine ss10_machine = {
.init = ss10_init,
.opts_default = (QemuOptValue[]) {
QOPT_VALUE("default_drive", "scsi"),
+ QOPT_VALUE("max_cpus", "4"),
{ /* end of list */ }
},
- .max_cpus = 4,
};
static QEMUMachine ss600mp_machine = {
@@ -1343,9 +1344,9 @@ static QEMUMachine ss600mp_machine = {
.init = ss600mp_init,
.opts_default = (QemuOptValue[]) {
QOPT_VALUE("default_drive", "scsi"),
+ QOPT_VALUE("max_cpus", "4"),
{ /* end of list */ }
},
- .max_cpus = 4,
};
static QEMUMachine ss20_machine = {
@@ -1354,9 +1355,9 @@ static QEMUMachine ss20_machine = {
.init = ss20_init,
.opts_default = (QemuOptValue[]) {
QOPT_VALUE("default_drive", "scsi"),
+ QOPT_VALUE("max_cpus", "4"),
{ /* end of list */ }
},
- .max_cpus = 4,
};
static QEMUMachine voyager_machine = {
@@ -1488,7 +1489,8 @@ static void sun4d_hw_init(const struct sun4d_hwdef *hwdef, ram_addr_t RAM_size,
const char *boot_device,
const char *kernel_filename,
const char *kernel_cmdline,
- const char *initrd_filename, const char *cpu_model)
+ const char *initrd_filename, const char *cpu_model,
+ QemuOpts *opts)
{
unsigned int i;
void *iounits[MAX_IOUNITS], *espdma, *ledma, *nvram;
@@ -1574,7 +1576,7 @@ static void sun4d_hw_init(const struct sun4d_hwdef *hwdef, ram_addr_t RAM_size,
graphic_height, graphic_depth, hwdef->nvram_machine_id,
"Sun4d");
- fw_cfg = fw_cfg_init(0, 0, CFG_ADDR, CFG_ADDR + 2);
+ fw_cfg = fw_cfg_init(0, 0, CFG_ADDR, CFG_ADDR + 2, opts);
fw_cfg_add_i32(fw_cfg, FW_CFG_ID, 1);
fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)ram_size);
fw_cfg_add_i16(fw_cfg, FW_CFG_MACHINE_ID, hwdef->machine_id);
@@ -1606,7 +1608,7 @@ static void ss1000_init(QemuOpts *opts)
const char *initrd_filename = qemu_opt_get(opts, "initrd");
const char *cpu_model = qemu_opt_get(opts, "cpu");
sun4d_hw_init(&sun4d_hwdefs[0], RAM_size, boot_device, kernel_filename,
- kernel_cmdline, initrd_filename, cpu_model);
+ kernel_cmdline, initrd_filename, cpu_model, opts);
}
/* SPARCcenter 2000 hardware initialisation */
@@ -1619,7 +1621,7 @@ static void ss2000_init(QemuOpts *opts)
const char *initrd_filename = qemu_opt_get(opts, "initrd");
const char *cpu_model = qemu_opt_get(opts, "cpu");
sun4d_hw_init(&sun4d_hwdefs[1], RAM_size, boot_device, kernel_filename,
- kernel_cmdline, initrd_filename, cpu_model);
+ kernel_cmdline, initrd_filename, cpu_model, opts);
}
static QEMUMachine ss1000_machine = {
@@ -1628,9 +1630,9 @@ static QEMUMachine ss1000_machine = {
.init = ss1000_init,
.opts_default = (QemuOptValue[]) {
QOPT_VALUE("default_drive", "scsi"),
+ QOPT_VALUE("max_cpus", "8"),
{ /* end of list */ }
},
- .max_cpus = 8,
};
static QEMUMachine ss2000_machine = {
@@ -1639,9 +1641,9 @@ static QEMUMachine ss2000_machine = {
.init = ss2000_init,
.opts_default = (QemuOptValue[]) {
QOPT_VALUE("default_drive", "scsi"),
+ QOPT_VALUE("max_cpus", "20"),
{ /* end of list */ }
},
- .max_cpus = 20,
};
static const struct sun4c_hwdef sun4c_hwdefs[] = {
@@ -1691,7 +1693,8 @@ static void sun4c_hw_init(const struct sun4c_hwdef *hwdef, ram_addr_t RAM_size,
const char *boot_device,
const char *kernel_filename,
const char *kernel_cmdline,
- const char *initrd_filename, const char *cpu_model)
+ const char *initrd_filename, const char *cpu_model,
+ QemuOpts *opts)
{
void *iommu, *espdma, *ledma, *nvram;
qemu_irq *cpu_irqs, slavio_irq[8], espdma_irq, ledma_irq;
@@ -1776,7 +1779,7 @@ static void sun4c_hw_init(const struct sun4c_hwdef *hwdef, ram_addr_t RAM_size,
graphic_height, graphic_depth, hwdef->nvram_machine_id,
"Sun4c");
- fw_cfg = fw_cfg_init(0, 0, CFG_ADDR, CFG_ADDR + 2);
+ fw_cfg = fw_cfg_init(0, 0, CFG_ADDR, CFG_ADDR + 2, opts);
fw_cfg_add_i32(fw_cfg, FW_CFG_ID, 1);
fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)ram_size);
fw_cfg_add_i16(fw_cfg, FW_CFG_MACHINE_ID, hwdef->machine_id);
@@ -1808,7 +1811,7 @@ static void ss2_init(QemuOpts *opts)
const char *initrd_filename = qemu_opt_get(opts, "initrd");
const char *cpu_model = qemu_opt_get(opts, "cpu");
sun4c_hw_init(&sun4c_hwdefs[0], RAM_size, boot_device, kernel_filename,
- kernel_cmdline, initrd_filename, cpu_model);
+ kernel_cmdline, initrd_filename, cpu_model, opts);
}
static QEMUMachine ss2_machine = {
@@ -742,7 +742,7 @@ static void sun4uv_init(ram_addr_t RAM_size,
const char *boot_devices,
const char *kernel_filename, const char *kernel_cmdline,
const char *initrd_filename, const char *cpu_model,
- const struct hwdef *hwdef)
+ const struct hwdef *hwdef, QemuOpts *opts)
{
CPUState *env;
M48t59State *nvram;
@@ -824,7 +824,7 @@ static void sun4uv_init(ram_addr_t RAM_size,
graphic_width, graphic_height, graphic_depth,
(uint8_t *)&nd_table[0].macaddr);
- fw_cfg = fw_cfg_init(BIOS_CFG_IOPORT, BIOS_CFG_IOPORT + 1, 0, 0);
+ fw_cfg = fw_cfg_init(BIOS_CFG_IOPORT, BIOS_CFG_IOPORT + 1, 0, 0, opts);
fw_cfg_add_i32(fw_cfg, FW_CFG_ID, 1);
fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)ram_size);
fw_cfg_add_i16(fw_cfg, FW_CFG_MACHINE_ID, hwdef->machine_id);
@@ -890,7 +890,7 @@ static void sun4u_init(QemuOpts *opts)
const char *initrd_filename = qemu_opt_get(opts, "initrd");
const char *cpu_model = qemu_opt_get(opts, "cpu");
sun4uv_init(RAM_size, boot_devices, kernel_filename,
- kernel_cmdline, initrd_filename, cpu_model, &hwdefs[0]);
+ kernel_cmdline, initrd_filename, cpu_model, &hwdefs[0], opts);
}
/* Sun4v hardware initialisation */
@@ -903,7 +903,7 @@ static void sun4v_init(QemuOpts *opts)
const char *initrd_filename = qemu_opt_get(opts, "initrd");
const char *cpu_model = qemu_opt_get(opts, "cpu");
sun4uv_init(RAM_size, boot_devices, kernel_filename,
- kernel_cmdline, initrd_filename, cpu_model, &hwdefs[1]);
+ kernel_cmdline, initrd_filename, cpu_model, &hwdefs[1], opts);
}
/* Niagara hardware initialisation */
@@ -916,14 +916,13 @@ static void niagara_init(QemuOpts *opts)
const char *initrd_filename = qemu_opt_get(opts, "initrd");
const char *cpu_model = qemu_opt_get(opts, "cpu");
sun4uv_init(RAM_size, boot_devices, kernel_filename,
- kernel_cmdline, initrd_filename, cpu_model, &hwdefs[2]);
+ kernel_cmdline, initrd_filename, cpu_model, &hwdefs[2], opts);
}
static QEMUMachine sun4u_machine = {
.name = "sun4u",
.desc = "Sun4u platform",
.init = sun4u_init,
- .max_cpus = 1, // XXX for now
.is_default = 1,
};
@@ -931,14 +930,12 @@ static QEMUMachine sun4v_machine = {
.name = "sun4v",
.desc = "Sun4v platform",
.init = sun4v_init,
- .max_cpus = 1, // XXX for now
};
static QEMUMachine niagara_machine = {
.name = "Niagara",
.desc = "Sun4v platform, Niagara",
.init = niagara_init,
- .max_cpus = 1, // XXX for now
};
static void sun4u_machine_init(void)
@@ -112,7 +112,6 @@ static QEMUMachine xenpv_machine = {
.name = "xenpv",
.desc = "Xen Para-virtualized PC",
.init = xen_init_pv,
- .max_cpus = 1,
};
static void xenpv_machine_init(void)
@@ -124,7 +124,6 @@ extern int alt_grab;
extern int ctrl_grab;
extern int usb_enabled;
extern int smp_cpus;
-extern int max_cpus;
extern int cursor_hide;
extern int graphic_rotate;
extern int no_quit;
@@ -205,7 +205,6 @@ int rtc_td_hack = 0;
int usb_enabled = 0;
int singlestep = 0;
int smp_cpus = 1;
-int max_cpus = 0;
int smp_cores = 1;
int smp_threads = 1;
const char *vnc_display;
@@ -1278,6 +1277,7 @@ static void smp_parse(const char *optarg)
int smp, sockets = 0, threads = 0, cores = 0;
char *endptr;
char option[128];
+ int max_cpus = 0;
smp = strtoul(optarg, &endptr, 10);
if (endptr != optarg) {
@@ -1315,8 +1315,13 @@ static void smp_parse(const char *optarg)
smp_cpus = smp;
smp_cores = cores > 0 ? cores : 1;
smp_threads = threads > 0 ? threads : 1;
- if (max_cpus == 0)
+ if (max_cpus == 0) {
max_cpus = smp_cpus;
+ }
+
+ if (max_cpus) {
+ qemu_opts_parsef(&qemu_machine_opts, "max_cpus=%d", max_cpus);
+ }
}
/***********************************************************/
@@ -2642,6 +2647,7 @@ int main(int argc, char **argv, char **envp)
int show_vnc_port = 0;
int defconfig = 1;
QemuOpts *machine_opts = NULL;
+ int max_cpus = 0;
error_set_progname(argv[0]);
@@ -3277,15 +3283,6 @@ int main(int argc, char **argv, char **envp)
fprintf(stderr, "Invalid number of CPUs\n");
exit(1);
}
- 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;
@@ -3490,18 +3487,11 @@ int main(int argc, char **argv, char **envp)
}
}
- /*
- * Default to max_cpus = smp_cpus, in case the user doesn't
- * specify a max_cpus value.
- */
- if (!max_cpus)
- max_cpus = smp_cpus;
-
- machine->max_cpus = machine->max_cpus ?: 1; /* Default to UP */
- if (smp_cpus > machine->max_cpus) {
+ max_cpus = qemu_opt_get_number(machine_opts, "max_cpus", 1);
+ if (smp_cpus > max_cpus) {
fprintf(stderr, "Number of SMP cpus requested (%d), exceeds max cpus "
"supported by machine `%s' (%d)\n", smp_cpus, machine->name,
- machine->max_cpus);
+ max_cpus);
exit(1);
}
max_cpus is a weird property today. On the one hand, it represents the maximum CPUs a board can support and is used to validate the number of vcpus requested by the user. On the other hand, max_cpus can be set by the user in which case it is taken to mean the number of physical sockets that should be advertised by the firmware. Furthermore, if max_cpus isn't explicitly set by the user, it's defaulted to the number of smp_cpus. But there's actually a second copy of max_cpus that still represents the maximum cpus spported by the platform. Yes, it's confusing. So let's be a bit more obvious. This patch introduces a sockets parameter that allows a user to explicitly set the number of advertised sockets apart from the number of maximum cpus. This is something of a stop gap. We really ought to specify a more rich NUMA topology as machine options but that will come later. Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>