Skip to content

Commit

Permalink
vl: split various early command line options to a separate function
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Paolo Bonzini <[email protected]>
  • Loading branch information
bonzini committed Dec 10, 2020
1 parent db372ed commit 0546c06
Showing 1 changed file with 112 additions and 88 deletions.
200 changes: 112 additions & 88 deletions softmmu/vl.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -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);
Expand Down Expand Up @@ -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();
Expand All @@ -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);
Expand All @@ -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);

Expand Down

0 comments on commit 0546c06

Please sign in to comment.