mirror of https://github.com/xemu-project/xemu.git
vl: separate qemu_create_machine
Reviewed-by: Igor Mammedov <imammedo@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
07a91b1ac6
commit
f5c9fcb82d
113
softmmu/vl.c
113
softmmu/vl.c
|
@ -133,6 +133,8 @@ static const char *boot_order;
|
||||||
static const char *boot_once;
|
static const char *boot_once;
|
||||||
static const char *incoming;
|
static const char *incoming;
|
||||||
static const char *loadvm;
|
static const char *loadvm;
|
||||||
|
static ram_addr_t maxram_size;
|
||||||
|
static uint64_t ram_slots;
|
||||||
static int display_remote;
|
static int display_remote;
|
||||||
static int snapshot;
|
static int snapshot;
|
||||||
static QemuPluginList plugin_list = QTAILQ_HEAD_INITIALIZER(plugin_list);
|
static QemuPluginList plugin_list = QTAILQ_HEAD_INITIALIZER(plugin_list);
|
||||||
|
@ -2795,8 +2797,13 @@ static void qemu_create_late_backends(void)
|
||||||
qemu_semihosting_console_init();
|
qemu_semihosting_console_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool set_memory_options(uint64_t *ram_slots, ram_addr_t *maxram_size,
|
static bool have_custom_ram_size(void)
|
||||||
MachineClass *mc)
|
{
|
||||||
|
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;
|
uint64_t sz;
|
||||||
const char *mem_str;
|
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 */
|
/* store value for the future use */
|
||||||
qemu_opt_set_number(opts, "size", ram_size, &error_abort);
|
qemu_opt_set_number(opts, "size", ram_size, &error_abort);
|
||||||
*maxram_size = ram_size;
|
maxram_size = ram_size;
|
||||||
|
|
||||||
if (qemu_opt_get(opts, "maxmem")) {
|
if (qemu_opt_get(opts, "maxmem")) {
|
||||||
uint64_t slots;
|
uint64_t slots;
|
||||||
|
@ -2867,15 +2874,59 @@ static bool set_memory_options(uint64_t *ram_slots, ram_addr_t *maxram_size,
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
*maxram_size = sz;
|
maxram_size = sz;
|
||||||
*ram_slots = slots;
|
ram_slots = slots;
|
||||||
} else if (qemu_opt_get(opts, "slots")) {
|
} else if (qemu_opt_get(opts, "slots")) {
|
||||||
error_report("invalid -m option value: missing 'maxmem' option");
|
error_report("invalid -m option value: missing 'maxmem' option");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
loc_pop(&loc);
|
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)
|
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;
|
const char *optarg;
|
||||||
MachineClass *machine_class;
|
MachineClass *machine_class;
|
||||||
bool userconfig = true;
|
bool userconfig = true;
|
||||||
ram_addr_t maxram_size;
|
|
||||||
uint64_t ram_slots = 0;
|
|
||||||
FILE *vmstate_dump_file = NULL;
|
FILE *vmstate_dump_file = NULL;
|
||||||
bool have_custom_ram_size;
|
|
||||||
|
|
||||||
qemu_add_opts(&qemu_drive_opts);
|
qemu_add_opts(&qemu_drive_opts);
|
||||||
qemu_add_drive_opts(&qemu_legacy_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"));
|
configure_rtc(qemu_find_opts_singleton("rtc"));
|
||||||
|
|
||||||
machine_class = select_machine();
|
qemu_create_machine(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_disable_default_devices();
|
qemu_disable_default_devices();
|
||||||
qemu_create_default_devices();
|
qemu_create_default_devices();
|
||||||
|
@ -4410,6 +4416,7 @@ void qemu_init(int argc, char **argv, char **envp)
|
||||||
* called from configure_accelerator().
|
* called from configure_accelerator().
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
machine_class = MACHINE_GET_CLASS(current_machine);
|
||||||
if (!qtest_enabled() && machine_class->deprecation_reason) {
|
if (!qtest_enabled() && machine_class->deprecation_reason) {
|
||||||
error_report("Machine type '%s' is deprecated: %s",
|
error_report("Machine type '%s' is deprecated: %s",
|
||||||
machine_class->name, machine_class->deprecation_reason);
|
machine_class->name, machine_class->deprecation_reason);
|
||||||
|
@ -4470,7 +4477,7 @@ void qemu_init(int argc, char **argv, char **envp)
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
backend_size = object_property_get_uint(backend, "size", &error_abort);
|
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 "
|
error_report("Size specified by -m option must match size of "
|
||||||
"explicitly specified 'memory-backend' property");
|
"explicitly specified 'memory-backend' property");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
|
|
Loading…
Reference in New Issue