@@ -133,6 +133,8 @@ static const char *boot_order;
static const char *boot_once;
static const char *incoming;
static const char *loadvm;
+static ram_addr_t maxram_size;
+static uint64_t ram_slots;
static int display_remote;
static int snapshot;
static QemuPluginList plugin_list = QTAILQ_HEAD_INITIALIZER(plugin_list);
@@ -2795,8 +2797,13 @@ static void qemu_create_late_backends(void)
qemu_semihosting_console_init();
}
-static bool set_memory_options(uint64_t *ram_slots, ram_addr_t *maxram_size,
- MachineClass *mc)
+static bool have_custom_ram_size(void)
+{
+ QemuOpts *opts = qemu_find_opts_singleton("memory");
+ return !!qemu_opt_get_size(opts, "size", 0);
+}
+
+static void set_memory_options(MachineClass *mc)
{
uint64_t sz;
const char *mem_str;
@@ -2846,7 +2853,7 @@ static bool set_memory_options(uint64_t *ram_slots, ram_addr_t *maxram_size,
/* store value for the future use */
qemu_opt_set_number(opts, "size", ram_size, &error_abort);
- *maxram_size = ram_size;
+ maxram_size = ram_size;
if (qemu_opt_get(opts, "maxmem")) {
uint64_t slots;
@@ -2867,15 +2874,59 @@ static bool set_memory_options(uint64_t *ram_slots, ram_addr_t *maxram_size,
exit(EXIT_FAILURE);
}
- *maxram_size = sz;
- *ram_slots = slots;
+ maxram_size = sz;
+ ram_slots = slots;
} else if (qemu_opt_get(opts, "slots")) {
error_report("invalid -m option value: missing 'maxmem' option");
exit(EXIT_FAILURE);
}
loc_pop(&loc);
- return !!mem_str;
+}
+
+static void qemu_create_machine(MachineClass *machine_class)
+{
+ object_set_machine_compat_props(machine_class->compat_props);
+
+ set_memory_options(machine_class);
+
+ current_machine = MACHINE(object_new_with_class(OBJECT_CLASS(machine_class)));
+ if (machine_help_func(qemu_get_machine_opts(), current_machine)) {
+ exit(0);
+ }
+ object_property_add_child(object_get_root(), "machine",
+ OBJECT(current_machine));
+ object_property_add_child(container_get(OBJECT(current_machine),
+ "/unattached"),
+ "sysbus", OBJECT(sysbus_get_default()));
+
+ if (machine_class->minimum_page_bits) {
+ if (!set_preferred_target_page_bits(machine_class->minimum_page_bits)) {
+ /* This would be a board error: specifying a minimum smaller than
+ * a target's compile-time fixed setting.
+ */
+ g_assert_not_reached();
+ }
+ }
+
+ cpu_exec_init_all();
+ page_size_init();
+
+ if (machine_class->hw_version) {
+ qemu_set_hw_version(machine_class->hw_version);
+ }
+
+ machine_smp_parse(current_machine,
+ qemu_opts_find(qemu_find_opts("smp-opts"), NULL), &error_fatal);
+
+ /*
+ * Get the default machine options from the machine if it is not already
+ * specified either by the configuration file or by the command line.
+ */
+ if (machine_class->default_machine_opts) {
+ qemu_opts_set_defaults(qemu_find_opts("machine"),
+ machine_class->default_machine_opts, 0);
+ }
}
static int global_init_func(void *opaque, QemuOpts *opts, Error **errp)
@@ -3404,10 +3455,7 @@ void qemu_init(int argc, char **argv, char **envp)
const char *optarg;
MachineClass *machine_class;
bool userconfig = true;
- ram_addr_t maxram_size;
- uint64_t ram_slots = 0;
FILE *vmstate_dump_file = NULL;
- bool have_custom_ram_size;
qemu_add_opts(&qemu_drive_opts);
qemu_add_drive_opts(&qemu_legacy_drive_opts);
@@ -4333,49 +4381,7 @@ void qemu_init(int argc, char **argv, char **envp)
configure_rtc(qemu_find_opts_singleton("rtc"));
- machine_class = select_machine();
- object_set_machine_compat_props(machine_class->compat_props);
-
- have_custom_ram_size = set_memory_options(&ram_slots, &maxram_size,
- machine_class);
-
- current_machine = MACHINE(object_new_with_class(OBJECT_CLASS(machine_class)));
- if (machine_help_func(qemu_get_machine_opts(), current_machine)) {
- exit(0);
- }
- object_property_add_child(object_get_root(), "machine",
- OBJECT(current_machine));
- object_property_add_child(container_get(OBJECT(current_machine),
- "/unattached"),
- "sysbus", OBJECT(sysbus_get_default()));
-
- if (machine_class->minimum_page_bits) {
- if (!set_preferred_target_page_bits(machine_class->minimum_page_bits)) {
- /* This would be a board error: specifying a minimum smaller than
- * a target's compile-time fixed setting.
- */
- g_assert_not_reached();
- }
- }
-
- cpu_exec_init_all();
- page_size_init();
-
- if (machine_class->hw_version) {
- qemu_set_hw_version(machine_class->hw_version);
- }
-
- machine_smp_parse(current_machine,
- qemu_opts_find(qemu_find_opts("smp-opts"), NULL), &error_fatal);
-
- /*
- * Get the default machine options from the machine if it is not already
- * specified either by the configuration file or by the command line.
- */
- if (machine_class->default_machine_opts) {
- qemu_opts_set_defaults(qemu_find_opts("machine"),
- machine_class->default_machine_opts, 0);
- }
+ qemu_create_machine(select_machine());
qemu_disable_default_devices();
qemu_create_default_devices();
@@ -4410,6 +4416,7 @@ void qemu_init(int argc, char **argv, char **envp)
* called from configure_accelerator().
*/
+ machine_class = MACHINE_GET_CLASS(current_machine);
if (!qtest_enabled() && machine_class->deprecation_reason) {
error_report("Machine type '%s' is deprecated: %s",
machine_class->name, machine_class->deprecation_reason);
@@ -4470,7 +4477,7 @@ void qemu_init(int argc, char **argv, char **envp)
exit(EXIT_FAILURE);
}
backend_size = object_property_get_uint(backend, "size", &error_abort);
- if (have_custom_ram_size && backend_size != ram_size) {
+ if (have_custom_ram_size() && backend_size != ram_size) {
error_report("Size specified by -m option must match size of "
"explicitly specified 'memory-backend' property");
exit(EXIT_FAILURE);