mirror of
https://github.com/xemu-project/xemu.git
synced 2024-11-30 06:50:57 +00:00
vl: fix [memory] section with -readconfig
The -M memory.* options do not have magic applied to them like the -m
option, namely no "M" (for mebibytes) is tacked at the end of a suffixless
value for "-M memory.size".
This magic is performed by parse_memory_options, and we have to do it for
both "-m" and the [memory] section of a config file. Storing [memory]
sections directly to machine_opts_dict changed the meaning of
[memory]
size = "1024"
in a -readconfig file from 1024MiB to 8KiB (1024 Bytes rounded up to
8KiB silently). To avoid this, the [memory] section has to be changed
back to QemuOpts (combining [memory] and "-m" will work fine thanks to
.merge_lists being true).
Change parse_memory_options() so that, similar to the older function
set_memory_options(), it operates after command line parsing is done;
and also call it where set_memory_options() used to be.
Note, the parsing code uses exit(1) instead of exit(EXIT_FAILURE) to
match neighboring code.
Reported-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Fixes: ce9d03fb3f
("machine: add mem compound property", 2022-05-12)
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
55794c904d
commit
e12f0685e8
25
softmmu/vl.c
25
softmmu/vl.c
@ -1947,16 +1947,15 @@ static void qemu_resolve_machine_memdev(void)
|
||||
}
|
||||
}
|
||||
|
||||
static void parse_memory_options(const char *arg)
|
||||
static void parse_memory_options(void)
|
||||
{
|
||||
QemuOpts *opts;
|
||||
QemuOpts *opts = qemu_find_opts_singleton("memory");
|
||||
QDict *dict, *prop;
|
||||
const char *mem_str;
|
||||
Location loc;
|
||||
|
||||
opts = qemu_opts_parse_noisily(qemu_find_opts("memory"), arg, true);
|
||||
if (!opts) {
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
loc_push_none(&loc);
|
||||
qemu_opts_loc_restore(opts);
|
||||
|
||||
prop = qdict_new();
|
||||
|
||||
@ -1987,6 +1986,7 @@ static void parse_memory_options(const char *arg)
|
||||
qdict_put(dict, "memory", prop);
|
||||
keyval_merge(machine_opts_dict, dict, &error_fatal);
|
||||
qobject_unref(dict);
|
||||
loc_pop(&loc);
|
||||
}
|
||||
|
||||
static void qemu_create_machine(QDict *qdict)
|
||||
@ -2053,8 +2053,7 @@ static bool is_qemuopts_group(const char *group)
|
||||
if (g_str_equal(group, "object") ||
|
||||
g_str_equal(group, "machine") ||
|
||||
g_str_equal(group, "smp-opts") ||
|
||||
g_str_equal(group, "boot-opts") ||
|
||||
g_str_equal(group, "memory")) {
|
||||
g_str_equal(group, "boot-opts")) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
@ -2078,8 +2077,6 @@ static void qemu_record_config_group(const char *group, QDict *dict,
|
||||
machine_merge_property("smp", dict, &error_fatal);
|
||||
} else if (g_str_equal(group, "boot-opts")) {
|
||||
machine_merge_property("boot", dict, &error_fatal);
|
||||
} else if (g_str_equal(group, "memory")) {
|
||||
machine_merge_property("memory", dict, &error_fatal);
|
||||
} else {
|
||||
abort();
|
||||
}
|
||||
@ -2882,7 +2879,10 @@ void qemu_init(int argc, char **argv, char **envp)
|
||||
exit(0);
|
||||
break;
|
||||
case QEMU_OPTION_m:
|
||||
parse_memory_options(optarg);
|
||||
opts = qemu_opts_parse_noisily(qemu_find_opts("memory"), optarg, true);
|
||||
if (opts == NULL) {
|
||||
exit(1);
|
||||
}
|
||||
break;
|
||||
#ifdef CONFIG_TPM
|
||||
case QEMU_OPTION_tpmdev:
|
||||
@ -3515,6 +3515,9 @@ void qemu_init(int argc, char **argv, char **envp)
|
||||
|
||||
configure_rtc(qemu_find_opts_singleton("rtc"));
|
||||
|
||||
/* Transfer QemuOpts options into machine options */
|
||||
parse_memory_options();
|
||||
|
||||
qemu_create_machine(machine_opts_dict);
|
||||
|
||||
suspend_mux_open();
|
||||
|
Loading…
Reference in New Issue
Block a user