From: Paolo Bonzini <pbonzini@redhat.com>
To: qemu-devel@nongnu.org
Subject: [PULL 054/113] vl: split various early command line options to a separate function
Date: Wed, 2 Dec 2020 03:07:50 -0500 [thread overview]
Message-ID: <20201202080849.4125477-55-pbonzini@redhat.com> (raw)
In-Reply-To: <20201202080849.4125477-1-pbonzini@redhat.com>
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>
---
softmmu/vl.c | 200 ++++++++++++++++++++++++++++-----------------------
1 file changed, 112 insertions(+), 88 deletions(-)
diff --git a/softmmu/vl.c b/softmmu/vl.c
index 2f2372bac7..9caff9fe8e 100644
--- a/softmmu/vl.c
+++ b/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);
--
2.26.2
next prev parent reply other threads:[~2020-12-02 8:55 UTC|newest]
Thread overview: 116+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-12-02 8:06 [PULL 000/113] First batch of misc (i386, kernel-doc, memory, vl.c) changes for QEMU 6.0 Paolo Bonzini
2020-12-02 8:06 ` [PULL 001/113] target/i386: fix operand order for PDEP and PEXT Paolo Bonzini
2020-12-02 8:06 ` [PULL 002/113] target/i386: Support up to 32768 CPUs without IRQ remapping Paolo Bonzini
2020-12-02 8:06 ` [PULL 003/113] target/i386: seg_helper: Correct segement selector nullification in the RET/IRET helper Paolo Bonzini
2020-12-02 8:07 ` [PULL 004/113] WHPX: support for the kernel-irqchip on/off Paolo Bonzini
2020-12-02 8:07 ` [PULL 005/113] docs/devel/loads-stores: Add regexp for DMA functions Paolo Bonzini
2020-12-02 8:07 ` [PULL 006/113] qom: eliminate identical functions Paolo Bonzini
2020-12-02 8:07 ` [PULL 007/113] dma: Document address_space_map/address_space_unmap() prototypes Paolo Bonzini
2020-12-02 8:07 ` [PULL 008/113] dma: Let dma_memory_set() propagate MemTxResult Paolo Bonzini
2020-12-02 8:07 ` [PULL 009/113] dma: Let dma_memory_rw() " Paolo Bonzini
2020-12-02 8:07 ` [PULL 010/113] dma: Let dma_memory_read() " Paolo Bonzini
2020-12-02 8:07 ` [PULL 011/113] dma: Let dma_memory_write() " Paolo Bonzini
2020-12-02 8:07 ` [PULL 012/113] pci: Let pci_dma_rw() " Paolo Bonzini
2020-12-02 8:07 ` [PULL 013/113] pci: Let pci_dma_read() " Paolo Bonzini
2020-12-02 8:07 ` [PULL 014/113] pci: Let pci_dma_write() " Paolo Bonzini
2020-12-02 8:07 ` [PULL 015/113] hw/ssi/aspeed_smc: Rename 'max_slaves' variable as 'max_peripherals' Paolo Bonzini
2020-12-02 8:07 ` [PULL 016/113] hw/ssi: Update coding style to make checkpatch.pl happy Paolo Bonzini
2020-12-02 8:07 ` [PULL 017/113] hw/ssi: Rename SSI 'slave' as 'peripheral' Paolo Bonzini
2020-12-02 8:07 ` [PULL 018/113] hw/core/stream: Rename StreamSlave as StreamSink Paolo Bonzini
2020-12-02 8:07 ` [PULL 019/113] hw/dma/xilinx_axidma: " Paolo Bonzini
2020-12-02 8:07 ` [PULL 020/113] hw/net/xilinx_axienet: " Paolo Bonzini
2020-12-02 8:07 ` [PULL 021/113] alpha: remove bios_name Paolo Bonzini
2020-12-02 8:07 ` [PULL 022/113] arm: " Paolo Bonzini
2020-12-02 8:07 ` [PULL 023/113] hppa: " Paolo Bonzini
2020-12-02 8:07 ` [PULL 024/113] i386: " Paolo Bonzini
2020-12-02 8:07 ` [PULL 025/113] lm32: " Paolo Bonzini
2020-12-02 8:07 ` [PULL 026/113] m68k: " Paolo Bonzini
2020-12-02 8:07 ` [PULL 027/113] mips: " Paolo Bonzini
2020-12-02 8:07 ` [PULL 028/113] moxie: " Paolo Bonzini
2020-12-02 8:07 ` [PULL 029/113] ppc: " Paolo Bonzini
2020-12-02 8:07 ` [PULL 030/113] rx: move BIOS load from MCU to board Paolo Bonzini
2020-12-02 8:07 ` [PULL 031/113] s390: remove bios_name Paolo Bonzini
2020-12-02 8:07 ` [PULL 032/113] sh4: " Paolo Bonzini
2020-12-02 8:07 ` [PULL 033/113] sparc: " Paolo Bonzini
2020-12-02 8:07 ` [PULL 034/113] digic: " Paolo Bonzini
2020-12-02 8:07 ` [PULL 035/113] vl: " Paolo Bonzini
2020-12-02 8:07 ` [PULL 036/113] arm: do not use ram_size global Paolo Bonzini
2020-12-02 8:07 ` [PULL 037/113] cris: " Paolo Bonzini
2020-12-02 8:07 ` [PULL 038/113] hppa: " Paolo Bonzini
2020-12-02 8:07 ` [PULL 039/113] i386: " Paolo Bonzini
2020-12-02 8:07 ` [PULL 040/113] m68k: " Paolo Bonzini
2020-12-02 8:07 ` [PULL 041/113] microblaze: " Paolo Bonzini
2020-12-02 8:07 ` [PULL 042/113] mips: " Paolo Bonzini
2020-12-02 8:07 ` [PULL 043/113] moxie: " Paolo Bonzini
2020-12-02 8:07 ` [PULL 044/113] nios2: " Paolo Bonzini
2020-12-02 8:07 ` [PULL 045/113] ppc: " Paolo Bonzini
2020-12-02 8:07 ` [PULL 046/113] riscv: " Paolo Bonzini
2020-12-02 8:07 ` [PULL 047/113] s390x: " Paolo Bonzini
2020-12-02 8:07 ` [PULL 048/113] sparc64: " Paolo Bonzini
2020-12-02 8:07 ` [PULL 049/113] make ram_size local to vl.c Paolo Bonzini
2020-12-02 8:07 ` [PULL 050/113] hw/char/serial: Clean up unnecessary code Paolo Bonzini
2020-12-02 8:07 ` [PULL 051/113] treewide: do not use short-form boolean options Paolo Bonzini
2020-12-02 8:07 ` [PULL 052/113] vl: extract validation of -smp to machine.c Paolo Bonzini
2020-12-02 8:07 ` [PULL 053/113] vl: remove bogus check Paolo Bonzini
2020-12-02 8:07 ` Paolo Bonzini [this message]
2020-12-02 8:07 ` [PULL 055/113] vl: move various initialization routines out of qemu_init Paolo Bonzini
2020-12-02 8:07 ` [PULL 056/113] vl: extract qemu_init_subsystems Paolo Bonzini
2020-12-02 8:07 ` [PULL 057/113] vl: move prelaunch part of qemu_init to new functions Paolo Bonzini
2020-12-02 8:07 ` [PULL 058/113] vl: extract various command line validation snippets to a new function Paolo Bonzini
2020-12-02 8:07 ` [PULL 059/113] vl: preconfig and loadvm are mutually exclusive Paolo Bonzini
2020-12-02 8:07 ` [PULL 060/113] vl: extract various command line desugaring snippets to a new function Paolo Bonzini
2020-12-02 8:07 ` [PULL 061/113] qemu-option: restrict qemu_opts_set to merge-lists QemuOpts Paolo Bonzini
2020-12-02 8:07 ` [PULL 062/113] vl: create "-net nic -net user" default earlier Paolo Bonzini
2020-12-02 8:07 ` [PULL 063/113] vl: load plugins as late as possible Paolo Bonzini
2020-12-02 8:08 ` [PULL 064/113] vl: extract default devices to separate functions Paolo Bonzini
2020-12-02 8:08 ` [PULL 065/113] vl: move CHECKPOINT_INIT after preconfig Paolo Bonzini
2020-12-02 8:08 ` [PULL 066/113] vl: separate qemu_create_early_backends Paolo Bonzini
2020-12-02 8:08 ` [PULL 067/113] vl: separate qemu_create_late_backends Paolo Bonzini
2020-12-02 8:08 ` [PULL 068/113] vl: separate qemu_create_machine Paolo Bonzini
2020-12-02 8:08 ` [PULL 069/113] vl: separate qemu_apply_machine_options Paolo Bonzini
2020-12-02 8:08 ` [PULL 070/113] vl: separate qemu_resolve_machine_memdev Paolo Bonzini
2020-12-02 8:08 ` [PULL 071/113] vl: initialize displays before preconfig loop Paolo Bonzini
2020-12-02 8:08 ` [PULL 072/113] vl: move -global check earlier Paolo Bonzini
2020-12-02 8:08 ` [PULL 073/113] migration, vl: start migration via qmp_migrate_incoming Paolo Bonzini
2020-12-02 8:08 ` [PULL 074/113] vl: start VM via qmp_cont Paolo Bonzini
2020-12-02 8:08 ` [PULL 075/113] hmp: introduce cmd_available Paolo Bonzini
2020-12-02 8:08 ` [PULL 076/113] vl: extract softmmu/datadir.c Paolo Bonzini
2020-12-02 8:08 ` [PULL 077/113] vl: extract machine done notifiers Paolo Bonzini
2020-12-02 8:08 ` [PULL 078/113] vl: extract softmmu/rtc.c Paolo Bonzini
2020-12-02 8:08 ` [PULL 079/113] vl: remove serial_max_hds Paolo Bonzini
2020-12-02 8:08 ` [PULL 080/113] vl: clean up -boot variables Paolo Bonzini
2020-12-02 8:08 ` [PULL 081/113] config-file: move -set implementation to vl.c Paolo Bonzini
2020-12-02 8:08 ` [PULL 082/113] docs: temporarily disable the kernel-doc extension Paolo Bonzini
2020-12-02 8:08 ` [PULL 083/113] kernel-doc: fix processing nested structs with attributes Paolo Bonzini
2020-12-02 8:08 ` [PULL 084/113] kernel-doc: add support for ____cacheline_aligned_in_smp attribute Paolo Bonzini
2020-12-02 8:08 ` [PULL 085/113] scripts/kernel-doc: Add support for named variable macro arguments Paolo Bonzini
2020-12-02 8:08 ` [PULL 086/113] scripts: kernel-doc: proper handle @foo->bar() Paolo Bonzini
2020-12-02 8:08 ` [PULL 087/113] scripts: kernel-doc: accept negation like !@var Paolo Bonzini
2020-12-02 8:08 ` [PULL 088/113] scripts: kernel-doc: accept blank lines on parameter description Paolo Bonzini
2020-12-02 8:08 ` [PULL 089/113] Replace HTTP links with HTTPS ones: documentation Paolo Bonzini
2020-12-02 8:08 ` [PULL 090/113] scripts/kernel-doc: parse __ETHTOOL_DECLARE_LINK_MODE_MASK Paolo Bonzini
2020-12-02 8:08 ` [PULL 091/113] scripts/kernel-doc: handle function pointer prototypes Paolo Bonzini
2020-12-02 8:08 ` [PULL 092/113] scripts/kernel-doc: optionally treat warnings as errors Paolo Bonzini
2020-12-02 8:08 ` [PULL 093/113] kernel-doc: include line numbers for function prototypes Paolo Bonzini
2020-12-02 8:08 ` [PULL 094/113] kernel-doc: add support for ____cacheline_aligned attribute Paolo Bonzini
2020-12-02 8:08 ` [PULL 095/113] scripts: kernel-doc: add support for typedef enum Paolo Bonzini
2020-12-02 8:08 ` [PULL 096/113] Revert "scripts/kerneldoc: For Sphinx 3 use c:macro for macros with arguments" Paolo Bonzini
2020-12-02 8:08 ` [PULL 097/113] Revert "kernel-doc: Use c:struct for Sphinx 3.0 and later" Paolo Bonzini
2020-12-02 8:08 ` [PULL 098/113] scripts: kernel-doc: make it more compatible with Sphinx 3.x Paolo Bonzini
2020-12-02 8:08 ` [PULL 099/113] scripts: kernel-doc: use a less pedantic markup for funcs on " Paolo Bonzini
2020-12-02 8:08 ` [PULL 100/113] scripts: kernel-doc: fix troubles with line counts Paolo Bonzini
2020-12-02 8:08 ` [PULL 101/113] scripts: kernel-doc: reimplement -nofunction argument Paolo Bonzini
2020-12-02 8:08 ` [PULL 102/113] scripts: kernel-doc: fix typedef identification Paolo Bonzini
2020-12-02 8:08 ` [PULL 103/113] scripts: kernel-doc: don't mangle with parameter list Paolo Bonzini
2020-12-02 8:08 ` [PULL 104/113] scripts: kernel-doc: allow passing desired Sphinx C domain dialect Paolo Bonzini
2020-12-02 8:08 ` [PULL 105/113] scripts: kernel-doc: fix line number handling Paolo Bonzini
2020-12-02 8:08 ` [PULL 106/113] scripts: kernel-doc: try to use c:function if possible Paolo Bonzini
2020-12-02 8:08 ` [PULL 107/113] Revert "kernel-doc: Handle function typedefs without asterisks" Paolo Bonzini
2020-12-02 8:08 ` [PULL 108/113] Revert "kernel-doc: Handle function typedefs that return pointers" Paolo Bonzini
2020-12-02 8:08 ` [PULL 109/113] scripts: kernel-doc: fix typedef parsing Paolo Bonzini
2020-12-02 8:08 ` [PULL 110/113] scripts: kernel-doc: split typedef complex regex Paolo Bonzini
2020-12-02 8:08 ` [PULL 111/113] scripts: kernel-doc: use :c:union when needed Paolo Bonzini
2020-12-02 8:08 ` [PULL 112/113] Revert "docs: temporarily disable the kernel-doc extension" Paolo Bonzini
2020-12-02 8:08 ` [PULL 113/113] scripts: kernel-doc: remove unnecesssary change wrt Linux Paolo Bonzini
2020-12-02 11:52 ` [PULL 000/113] First batch of misc (i386, kernel-doc, memory, vl.c) changes for QEMU 6.0 no-reply
2020-12-09 14:16 ` Peter Maydell
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20201202080849.4125477-55-pbonzini@redhat.com \
--to=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).