qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [RFC][PATCH 1/2] machine-specific command line switches


From: Jan Kiszka
Subject: [Qemu-devel] [RFC][PATCH 1/2] machine-specific command line switches
Date: Sat, 17 May 2008 15:34:48 +0200
User-agent: Thunderbird 2.0.0.12 (X11/20080226)

For a different project, I once wrote a patch to organize purely
machine-specific command line switches under the hood of the respective
machine implementations. Now the MusicPal has precisely that need as
well. So I reanimated the patch, and here we go:

The idea is to add two fields to QEMUMachine and process them:
 o options_help - a string that is inserted under a separate section of
   the "qemu -h" output.
 o parse_option - a callback invoked if a given option was not handled
   by the generic code. It returns -1 if the option is unkown, 0 if it
   is know but comes without an argument, and 1 when the argument was
   consumed.

Signed-off-by: Jan Kiszka <address@hidden>
---
 hw/boards.h |    4 ++++
 vl.c        |   41 +++++++++++++++++++++++++++++++----------
 2 files changed, 35 insertions(+), 10 deletions(-)

Index: b/hw/boards.h
===================================================================
--- a/hw/boards.h
+++ b/hw/boards.h
@@ -10,12 +10,16 @@ typedef void QEMUMachineInitFunc(ram_add
                                  const char *initrd_filename,
                                  const char *cpu_model);
 
+typedef int QEMUMachineParseOption(const char *optname, const char *optarg);
+
 typedef struct QEMUMachine {
     const char *name;
     const char *desc;
     QEMUMachineInitFunc *init;
 #define RAMSIZE_FIXED  (1 << 0)
     ram_addr_t ram_require;
+    const char *options_help;
+    QEMUMachineParseOption *parse_option;
     struct QEMUMachine *next;
 } QEMUMachine;
 
Index: b/vl.c
===================================================================
--- a/vl.c
+++ b/vl.c
@@ -7141,6 +7141,8 @@ static int main_loop(void)
 
 static void help(int exitcode)
 {
+    QEMUMachine *m;
+
     printf("QEMU PC emulator version " QEMU_VERSION ", Copyright (c) 2003-2008 
Fabrice Bellard\n"
            "usage: %s [options] [disk_image]\n"
            "\n"
@@ -7275,14 +7277,7 @@ static void help(int exitcode)
            "-clock          force the use of the given methods for timer 
alarm.\n"
            "                To see what timers are available use -clock ?\n"
            "-startdate      select initial date of the clock\n"
-           "\n"
-           "During emulation, the following keys are useful:\n"
-           "ctrl-alt-f      toggle full screen\n"
-           "ctrl-alt-n      switch to virtual console 'n'\n"
-           "ctrl-alt        toggle mouse and keyboard grab\n"
-           "\n"
-           "When using -nographic, press 'ctrl-a h' to get some help.\n"
-           ,
+           "\n",
            "qemu",
            DEFAULT_RAM_SIZE,
 #ifndef _WIN32
@@ -7291,6 +7286,17 @@ static void help(int exitcode)
 #endif
            DEFAULT_GDBSTUB_PORT,
            "/tmp/qemu.log");
+    for (m = first_machine; m != NULL; m = m->next) {
+        if (m->options_help)
+            printf("Options specific to %s machine:\n%s\n",
+                   m->name, m->options_help);
+    }
+    printf("During emulation, the following keys are useful:\n"
+           "ctrl-alt-f      toggle full screen\n"
+           "ctrl-alt-n      switch to virtual console 'n'\n"
+           "ctrl-alt        toggle mouse and keyboard grab\n"
+           "\n"
+           "When using -nographic, press 'ctrl-a h' to get some help.\n");
     exit(exitcode);
 }
 
@@ -7673,7 +7679,7 @@ int main(int argc, char **argv)
     const char *gdbstub_port;
 #endif
     uint32_t boot_devices_bitmap = 0;
-    int i;
+    int i, result;
     int snapshot, linux_boot, net_boot;
     const char *initrd_filename;
     const char *kernel_filename, *kernel_cmdline;
@@ -7692,7 +7698,7 @@ int main(int argc, char **argv)
     const char *parallel_devices[MAX_PARALLEL_PORTS];
     int parallel_device_index;
     const char *loadvm = NULL;
-    QEMUMachine *machine;
+    QEMUMachine *machine, *m;
     const char *cpu_model;
     const char *usb_devices[MAX_USB_CMDLINE];
     int usb_devices_index;
@@ -7784,6 +7790,21 @@ int main(int argc, char **argv)
             /* Treat --foo the same as -foo.  */
             if (r[1] == '-')
                 r++;
+
+            result = -1;
+            for (m = first_machine; m != NULL; m = m->next) {
+                if (m->parse_option) {
+                    result = m->parse_option(r,
+                        (optind < argc) ? argv[optind] : NULL);
+                    if (result >= 0)
+                        break;
+                }
+            }
+            if (result >= 0) {
+                optind += result;
+                continue;
+            }
+
             popt = qemu_options;
             for(;;) {
                 if (!popt->name) {




reply via email to

[Prev in Thread] Current Thread [Next in Thread]