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
|
||||
|
||||
static const char *cpu_option;
|
||||
static const char *data_dir[16];
|
||||
static int data_dir_idx;
|
||||
enum vga_retrace_method vga_retrace_method = VGA_RETRACE_DUMB;
|
||||
@ -142,6 +143,9 @@ int vga_interface_type = VGA_NONE;
|
||||
static DisplayOptions dpy;
|
||||
static int num_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];
|
||||
int win2k_install_hack = 0;
|
||||
int singlestep = 0;
|
||||
@ -2866,6 +2870,105 @@ static char *find_datadir(void)
|
||||
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)
|
||||
{
|
||||
int i;
|
||||
@ -2882,21 +2985,16 @@ void qemu_init(int argc, char **argv, char **envp)
|
||||
const char *optarg;
|
||||
const char *loadvm = NULL;
|
||||
MachineClass *machine_class;
|
||||
const char *cpu_option;
|
||||
const char *vga_model = NULL;
|
||||
const char *incoming = NULL;
|
||||
bool userconfig = true;
|
||||
bool nographic = false;
|
||||
int display_remote = 0;
|
||||
const char *log_mask = NULL;
|
||||
const char *log_file = NULL;
|
||||
ram_addr_t maxram_size;
|
||||
uint64_t ram_slots = 0;
|
||||
FILE *vmstate_dump_file = NULL;
|
||||
Error *main_loop_err = NULL;
|
||||
Error *err = NULL;
|
||||
bool list_data_dirs = false;
|
||||
char **dirs;
|
||||
const char *mem_path = NULL;
|
||||
bool have_custom_ram_size;
|
||||
BlockdevOptionsQueue bdo_queue = QSIMPLEQ_HEAD_INITIALIZER(bdo_queue);
|
||||
@ -3846,19 +3944,17 @@ void qemu_init(int argc, char **argv, char **envp)
|
||||
loc_set_none();
|
||||
|
||||
/*
|
||||
* 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'.
|
||||
* These options affect everything else and should be processed
|
||||
* before daemonizing.
|
||||
*/
|
||||
if (cpu_option && is_help_option(cpu_option)) {
|
||||
list_cpus(cpu_option);
|
||||
exit(0);
|
||||
}
|
||||
qemu_process_early_options();
|
||||
|
||||
if (qemu_opts_foreach(qemu_find_opts("device"),
|
||||
device_help_func, NULL, NULL)) {
|
||||
exit(0);
|
||||
qemu_process_help_options();
|
||||
qemu_maybe_daemonize(pid_file);
|
||||
|
||||
if (qemu_init_main_loop(&main_loop_err)) {
|
||||
error_report_err(main_loop_err);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
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,
|
||||
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)));
|
||||
if (machine_help_func(qemu_get_machine_opts(), current_machine)) {
|
||||
exit(0);
|
||||
@ -3938,44 +4000,6 @@ void qemu_init(int argc, char **argv, char **envp)
|
||||
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,
|
||||
qemu_opts_find(qemu_find_opts("smp-opts"), NULL), &error_fatal);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user