[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 1/3] qemu-options: introduce functions to parse options
From: |
Hogan Wang |
Subject: |
[PATCH 1/3] qemu-options: introduce functions to parse options |
Date: |
Tue, 28 Jul 2020 15:11:02 +0800 |
From: w00506750 <hogan.wang@huawei.com>
All of the qemu options are parsed in qemu_init function,
and make qemu_init function too long and nasty. Introduce
'parser' function pointer in QEMUOption struct to parse
one option or a set of options.
Signed-off-by: Hogan Wang <hogan.wang@huawei.com>
---
qemu-options-wrapper.h | 10 +++++-----
qemu-options.hx | 12 ++++++++----
softmmu/vl.c | 33 +++++++++++++++++----------------
3 files changed, 30 insertions(+), 25 deletions(-)
diff --git a/qemu-options-wrapper.h b/qemu-options-wrapper.h
index 6f548e3922..efdfbf1dfd 100644
--- a/qemu-options-wrapper.h
+++ b/qemu-options-wrapper.h
@@ -1,15 +1,15 @@
#if defined(QEMU_OPTIONS_GENERATE_ENUM)
-#define DEF(option, opt_arg, opt_enum, opt_help, arch_mask) \
+#define DEF(option, opt_arg, opt_enum, opt_help, arch_mask, ...) \
opt_enum,
#define DEFHEADING(text)
#define ARCHHEADING(text, arch_mask)
#elif defined(QEMU_OPTIONS_GENERATE_HELP)
-#define DEF(option, opt_arg, opt_enum, opt_help, arch_mask) \
- if ((arch_mask) & arch_type) \
+#define DEF(option, opt_arg, opt_enum, opt_help, arch_mask, ...) \
+ if ((arch_mask) & arch_type) \
fputs(opt_help, stdout);
#define ARCHHEADING(text, arch_mask) \
@@ -20,8 +20,8 @@
#elif defined(QEMU_OPTIONS_GENERATE_OPTIONS)
-#define DEF(option, opt_arg, opt_enum, opt_help, arch_mask) \
- { option, opt_arg, opt_enum, arch_mask },
+#define DEF(option, opt_arg, opt_enum, opt_help, arch_mask, ...) \
+ { option, opt_arg, opt_enum, arch_mask, __VA_ARGS__},
#define DEFHEADING(text)
#define ARCHHEADING(text, arch_mask)
diff --git a/qemu-options.hx b/qemu-options.hx
index 708583b4ce..988fa4026b 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -3352,7 +3352,8 @@ testing of various kernels.
ERST
DEF("kernel", HAS_ARG, QEMU_OPTION_kernel, \
- "-kernel bzImage use 'bzImage' as kernel image\n", QEMU_ARCH_ALL)
+ "-kernel bzImage use 'bzImage' as kernel image\n", QEMU_ARCH_ALL, \
+ parse_linux_boot)
SRST
``-kernel bzImage``
Use bzImage as kernel image. The kernel can be either a Linux kernel
@@ -3360,14 +3361,16 @@ SRST
ERST
DEF("append", HAS_ARG, QEMU_OPTION_append, \
- "-append cmdline use 'cmdline' as kernel command line\n", QEMU_ARCH_ALL)
+ "-append cmdline use 'cmdline' as kernel command line\n", QEMU_ARCH_ALL, \
+ parse_linux_boot)
SRST
``-append cmdline``
Use cmdline as kernel command line
ERST
DEF("initrd", HAS_ARG, QEMU_OPTION_initrd, \
- "-initrd file use 'file' as initial ram disk\n", QEMU_ARCH_ALL)
+ "-initrd file use 'file' as initial ram disk\n", QEMU_ARCH_ALL, \
+ parse_linux_boot)
SRST
``-initrd file``
Use file as initial ram disk.
@@ -3380,7 +3383,8 @@ SRST
ERST
DEF("dtb", HAS_ARG, QEMU_OPTION_dtb, \
- "-dtb file use 'file' as device tree image\n", QEMU_ARCH_ALL)
+ "-dtb file use 'file' as device tree image\n", QEMU_ARCH_ALL, \
+ parse_linux_boot)
SRST
``-dtb file``
Use file as a device tree binary (dtb) image and pass it to the
diff --git a/softmmu/vl.c b/softmmu/vl.c
index 4eb9d1f7fd..edb24fd3f7 100644
--- a/softmmu/vl.c
+++ b/softmmu/vl.c
@@ -1715,8 +1715,16 @@ typedef struct QEMUOption {
int flags;
int index;
uint32_t arch_mask;
+ int (*parser)(const struct QEMUOption *popt, const char* optarg);
} QEMUOption;
+static int parse_linux_boot(const QEMUOption *popt, const char* optarg)
+{
+ qemu_opts_set(qemu_find_opts("machine"), NULL, popt->name, optarg,
+ &error_abort);
+ return 0;
+}
+
static const QEMUOption qemu_options[] = {
{ "h", 0, QEMU_OPTION_h, QEMU_ARCH_ALL },
#define QEMU_OPTIONS_GENERATE_OPTIONS
@@ -2981,6 +2989,15 @@ void qemu_init(int argc, char **argv, char **envp)
error_report("Option not supported for this target");
exit(1);
}
+
+ if (popt->parser) {
+ if (popt->parser(popt, optarg)) {
+ error_report("Parser '%s' option error", popt->name);
+ exit(1);
+ }
+ continue;
+ }
+
switch(popt->index) {
case QEMU_OPTION_cpu:
/* hw initialization will check this */
@@ -3075,22 +3092,6 @@ void qemu_init(int argc, char **argv, char **envp)
exit(1);
}
break;
- case QEMU_OPTION_kernel:
- qemu_opts_set(qemu_find_opts("machine"), NULL, "kernel",
optarg,
- &error_abort);
- break;
- case QEMU_OPTION_initrd:
- qemu_opts_set(qemu_find_opts("machine"), NULL, "initrd",
optarg,
- &error_abort);
- break;
- case QEMU_OPTION_append:
- qemu_opts_set(qemu_find_opts("machine"), NULL, "append",
optarg,
- &error_abort);
- break;
- case QEMU_OPTION_dtb:
- qemu_opts_set(qemu_find_opts("machine"), NULL, "dtb", optarg,
- &error_abort);
- break;
case QEMU_OPTION_cdrom:
drive_add(IF_DEFAULT, 2, optarg, CDROM_OPTS);
break;
--
2.27.0
- [PATCH 1/3] qemu-options: introduce functions to parse options,
Hogan Wang <=