mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-10-15 15:32:51 +00:00
vl: split various early command line options to a separate function
Various options affect the global state of QEMU including the rest of qemu_init, and they need to be called very early. Group them together in a function that is called at the beginning. Reviewed-by: Igor Mammedov <imammedo@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
db372edc06
commit
0546c0609c
200
softmmu/vl.c
200
softmmu/vl.c
|
@ -117,6 +117,7 @@
|
||||||
|
|
||||||
#define MAX_VIRTIO_CONSOLES 1
|
#define MAX_VIRTIO_CONSOLES 1
|
||||||
|
|
||||||
|
static const char *cpu_option;
|
||||||
static const char *data_dir[16];
|
static const char *data_dir[16];
|
||||||
static int data_dir_idx;
|
static int data_dir_idx;
|
||||||
enum vga_retrace_method vga_retrace_method = VGA_RETRACE_DUMB;
|
enum vga_retrace_method vga_retrace_method = VGA_RETRACE_DUMB;
|
||||||
|
@ -142,6 +143,9 @@ int vga_interface_type = VGA_NONE;
|
||||||
static DisplayOptions dpy;
|
static DisplayOptions dpy;
|
||||||
static int num_serial_hds;
|
static int num_serial_hds;
|
||||||
static Chardev **serial_hds;
|
static Chardev **serial_hds;
|
||||||
|
static const char *log_mask;
|
||||||
|
static const char *log_file;
|
||||||
|
static bool list_data_dirs;
|
||||||
Chardev *parallel_hds[MAX_PARALLEL_PORTS];
|
Chardev *parallel_hds[MAX_PARALLEL_PORTS];
|
||||||
int win2k_install_hack = 0;
|
int win2k_install_hack = 0;
|
||||||
int singlestep = 0;
|
int singlestep = 0;
|
||||||
|
@ -2866,6 +2870,105 @@ static char *find_datadir(void)
|
||||||
return get_relocated_path(CONFIG_QEMU_DATADIR);
|
return get_relocated_path(CONFIG_QEMU_DATADIR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void qemu_process_early_options(void)
|
||||||
|
{
|
||||||
|
char **dirs;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
#ifdef CONFIG_SECCOMP
|
||||||
|
QemuOptsList *olist = qemu_find_opts_err("sandbox", NULL);
|
||||||
|
if (olist) {
|
||||||
|
qemu_opts_foreach(olist, parse_sandbox, NULL, &error_fatal);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
qemu_opts_foreach(qemu_find_opts("name"),
|
||||||
|
parse_name, NULL, &error_fatal);
|
||||||
|
|
||||||
|
#ifndef _WIN32
|
||||||
|
qemu_opts_foreach(qemu_find_opts("add-fd"),
|
||||||
|
parse_add_fd, NULL, &error_fatal);
|
||||||
|
|
||||||
|
qemu_opts_foreach(qemu_find_opts("add-fd"),
|
||||||
|
cleanup_add_fd, NULL, &error_fatal);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (!trace_init_backends()) {
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
trace_init_file();
|
||||||
|
|
||||||
|
/* Open the logfile at this point and set the log mask if necessary. */
|
||||||
|
qemu_set_log_filename(log_file, &error_fatal);
|
||||||
|
if (log_mask) {
|
||||||
|
int mask;
|
||||||
|
mask = qemu_str_to_log_mask(log_mask);
|
||||||
|
if (!mask) {
|
||||||
|
qemu_print_log_usage(stdout);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
qemu_set_log(mask);
|
||||||
|
} else {
|
||||||
|
qemu_set_log(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* add configured firmware directories */
|
||||||
|
dirs = g_strsplit(CONFIG_QEMU_FIRMWAREPATH, G_SEARCHPATH_SEPARATOR_S, 0);
|
||||||
|
for (i = 0; dirs[i] != NULL; i++) {
|
||||||
|
qemu_add_data_dir(get_relocated_path(dirs[i]));
|
||||||
|
}
|
||||||
|
g_strfreev(dirs);
|
||||||
|
|
||||||
|
/* try to find datadir relative to the executable path */
|
||||||
|
qemu_add_data_dir(find_datadir());
|
||||||
|
}
|
||||||
|
|
||||||
|
static void qemu_process_help_options(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check for -cpu help and -device help before we call select_machine(),
|
||||||
|
* which will return an error if the architecture has no default machine
|
||||||
|
* type and the user did not specify one, so that the user doesn't need
|
||||||
|
* to say '-cpu help -machine something'.
|
||||||
|
*/
|
||||||
|
if (cpu_option && is_help_option(cpu_option)) {
|
||||||
|
list_cpus(cpu_option);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (qemu_opts_foreach(qemu_find_opts("device"),
|
||||||
|
device_help_func, NULL, NULL)) {
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -L help lists the data directories and exits. */
|
||||||
|
if (list_data_dirs) {
|
||||||
|
for (i = 0; i < data_dir_idx; i++) {
|
||||||
|
printf("%s\n", data_dir[i]);
|
||||||
|
}
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void qemu_maybe_daemonize(const char *pid_file)
|
||||||
|
{
|
||||||
|
Error *err;
|
||||||
|
|
||||||
|
os_daemonize();
|
||||||
|
rcu_disable_atfork();
|
||||||
|
|
||||||
|
if (pid_file && !qemu_write_pidfile(pid_file, &err)) {
|
||||||
|
error_reportf_err(err, "cannot create PID file: ");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
qemu_unlink_pidfile_notifier.notify = qemu_unlink_pidfile;
|
||||||
|
qemu_add_exit_notifier(&qemu_unlink_pidfile_notifier);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void qemu_init(int argc, char **argv, char **envp)
|
void qemu_init(int argc, char **argv, char **envp)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -2882,21 +2985,16 @@ void qemu_init(int argc, char **argv, char **envp)
|
||||||
const char *optarg;
|
const char *optarg;
|
||||||
const char *loadvm = NULL;
|
const char *loadvm = NULL;
|
||||||
MachineClass *machine_class;
|
MachineClass *machine_class;
|
||||||
const char *cpu_option;
|
|
||||||
const char *vga_model = NULL;
|
const char *vga_model = NULL;
|
||||||
const char *incoming = NULL;
|
const char *incoming = NULL;
|
||||||
bool userconfig = true;
|
bool userconfig = true;
|
||||||
bool nographic = false;
|
bool nographic = false;
|
||||||
int display_remote = 0;
|
int display_remote = 0;
|
||||||
const char *log_mask = NULL;
|
|
||||||
const char *log_file = NULL;
|
|
||||||
ram_addr_t maxram_size;
|
ram_addr_t maxram_size;
|
||||||
uint64_t ram_slots = 0;
|
uint64_t ram_slots = 0;
|
||||||
FILE *vmstate_dump_file = NULL;
|
FILE *vmstate_dump_file = NULL;
|
||||||
Error *main_loop_err = NULL;
|
Error *main_loop_err = NULL;
|
||||||
Error *err = NULL;
|
Error *err = NULL;
|
||||||
bool list_data_dirs = false;
|
|
||||||
char **dirs;
|
|
||||||
const char *mem_path = NULL;
|
const char *mem_path = NULL;
|
||||||
bool have_custom_ram_size;
|
bool have_custom_ram_size;
|
||||||
BlockdevOptionsQueue bdo_queue = QSIMPLEQ_HEAD_INITIALIZER(bdo_queue);
|
BlockdevOptionsQueue bdo_queue = QSIMPLEQ_HEAD_INITIALIZER(bdo_queue);
|
||||||
|
@ -3846,19 +3944,17 @@ void qemu_init(int argc, char **argv, char **envp)
|
||||||
loc_set_none();
|
loc_set_none();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check for -cpu help and -device help before we call select_machine(),
|
* These options affect everything else and should be processed
|
||||||
* which will return an error if the architecture has no default machine
|
* before daemonizing.
|
||||||
* type and the user did not specify one, so that the user doesn't need
|
|
||||||
* to say '-cpu help -machine something'.
|
|
||||||
*/
|
*/
|
||||||
if (cpu_option && is_help_option(cpu_option)) {
|
qemu_process_early_options();
|
||||||
list_cpus(cpu_option);
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (qemu_opts_foreach(qemu_find_opts("device"),
|
qemu_process_help_options();
|
||||||
device_help_func, NULL, NULL)) {
|
qemu_maybe_daemonize(pid_file);
|
||||||
exit(0);
|
|
||||||
|
if (qemu_init_main_loop(&main_loop_err)) {
|
||||||
|
error_report_err(main_loop_err);
|
||||||
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
user_register_global_props();
|
user_register_global_props();
|
||||||
|
@ -3879,40 +3975,6 @@ void qemu_init(int argc, char **argv, char **envp)
|
||||||
have_custom_ram_size = set_memory_options(&ram_slots, &maxram_size,
|
have_custom_ram_size = set_memory_options(&ram_slots, &maxram_size,
|
||||||
machine_class);
|
machine_class);
|
||||||
|
|
||||||
os_daemonize();
|
|
||||||
rcu_disable_atfork();
|
|
||||||
|
|
||||||
if (pid_file && !qemu_write_pidfile(pid_file, &err)) {
|
|
||||||
error_reportf_err(err, "cannot create PID file: ");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
qemu_unlink_pidfile_notifier.notify = qemu_unlink_pidfile;
|
|
||||||
qemu_add_exit_notifier(&qemu_unlink_pidfile_notifier);
|
|
||||||
|
|
||||||
if (qemu_init_main_loop(&main_loop_err)) {
|
|
||||||
error_report_err(main_loop_err);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef CONFIG_SECCOMP
|
|
||||||
olist = qemu_find_opts_err("sandbox", NULL);
|
|
||||||
if (olist) {
|
|
||||||
qemu_opts_foreach(olist, parse_sandbox, NULL, &error_fatal);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
qemu_opts_foreach(qemu_find_opts("name"),
|
|
||||||
parse_name, NULL, &error_fatal);
|
|
||||||
|
|
||||||
#ifndef _WIN32
|
|
||||||
qemu_opts_foreach(qemu_find_opts("add-fd"),
|
|
||||||
parse_add_fd, NULL, &error_fatal);
|
|
||||||
|
|
||||||
qemu_opts_foreach(qemu_find_opts("add-fd"),
|
|
||||||
cleanup_add_fd, NULL, &error_fatal);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
current_machine = MACHINE(object_new_with_class(OBJECT_CLASS(machine_class)));
|
current_machine = MACHINE(object_new_with_class(OBJECT_CLASS(machine_class)));
|
||||||
if (machine_help_func(qemu_get_machine_opts(), current_machine)) {
|
if (machine_help_func(qemu_get_machine_opts(), current_machine)) {
|
||||||
exit(0);
|
exit(0);
|
||||||
|
@ -3938,44 +4000,6 @@ void qemu_init(int argc, char **argv, char **envp)
|
||||||
qemu_set_hw_version(machine_class->hw_version);
|
qemu_set_hw_version(machine_class->hw_version);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!trace_init_backends()) {
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
trace_init_file();
|
|
||||||
|
|
||||||
/* Open the logfile at this point and set the log mask if necessary.
|
|
||||||
*/
|
|
||||||
qemu_set_log_filename(log_file, &error_fatal);
|
|
||||||
if (log_mask) {
|
|
||||||
int mask;
|
|
||||||
mask = qemu_str_to_log_mask(log_mask);
|
|
||||||
if (!mask) {
|
|
||||||
qemu_print_log_usage(stdout);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
qemu_set_log(mask);
|
|
||||||
} else {
|
|
||||||
qemu_set_log(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* add configured firmware directories */
|
|
||||||
dirs = g_strsplit(CONFIG_QEMU_FIRMWAREPATH, G_SEARCHPATH_SEPARATOR_S, 0);
|
|
||||||
for (i = 0; dirs[i] != NULL; i++) {
|
|
||||||
qemu_add_data_dir(get_relocated_path(dirs[i]));
|
|
||||||
}
|
|
||||||
g_strfreev(dirs);
|
|
||||||
|
|
||||||
/* try to find datadir relative to the executable path */
|
|
||||||
qemu_add_data_dir(find_datadir());
|
|
||||||
|
|
||||||
/* -L help lists the data directories and exits. */
|
|
||||||
if (list_data_dirs) {
|
|
||||||
for (i = 0; i < data_dir_idx; i++) {
|
|
||||||
printf("%s\n", data_dir[i]);
|
|
||||||
}
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
machine_smp_parse(current_machine,
|
machine_smp_parse(current_machine,
|
||||||
qemu_opts_find(qemu_find_opts("smp-opts"), NULL), &error_fatal);
|
qemu_opts_find(qemu_find_opts("smp-opts"), NULL), &error_fatal);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue