Currently, only x86 has architecture command-line options (for setting
the BIOS video mode) however this is likely to become more common in the
future.

This patch adds some simple macros and a struct definition to allow
architectures to augment the command-line options with private
definitions. The BIOS video mode option (--vidmode) is also migrated to
the new framework.

Signed-off-by: Will Deacon <will.dea...@arm.com>
---
 tools/kvm/arm/fdt.c                             |  4 ++--
 tools/kvm/arm/include/kvm/kvm-config-arch.h     |  7 +++++++
 tools/kvm/builtin-run.c                         | 21 ++++++---------------
 tools/kvm/include/kvm/kvm-config.h              |  3 ++-
 tools/kvm/include/kvm/kvm.h                     |  4 ++--
 tools/kvm/include/kvm/parse-options.h           |  3 +++
 tools/kvm/kvm.c                                 |  6 +++---
 tools/kvm/powerpc/include/kvm/kvm-config-arch.h |  7 +++++++
 tools/kvm/powerpc/kvm.c                         |  4 ++--
 tools/kvm/x86/include/kvm/kvm-config-arch.h     | 15 +++++++++++++++
 tools/kvm/x86/kvm.c                             | 16 ++++++++++++++--
 11 files changed, 63 insertions(+), 27 deletions(-)
 create mode 100644 tools/kvm/arm/include/kvm/kvm-config-arch.h
 create mode 100644 tools/kvm/powerpc/include/kvm/kvm-config-arch.h
 create mode 100644 tools/kvm/x86/include/kvm/kvm-config-arch.h

diff --git a/tools/kvm/arm/fdt.c b/tools/kvm/arm/fdt.c
index 8e17d3c..c7f4b52 100644
--- a/tools/kvm/arm/fdt.c
+++ b/tools/kvm/arm/fdt.c
@@ -258,8 +258,8 @@ int load_flat_binary(struct kvm *kvm, int fd_kernel, int 
fd_initrd,
        return true;
 }
 
-bool load_bzimage(struct kvm *kvm, int fd_kernel,
-                 int fd_initrd, const char *kernel_cmdline, u16 vidmode)
+bool load_bzimage(struct kvm *kvm, int fd_kernel, int fd_initrd,
+                 const char *kernel_cmdline)
 {
        /* To b or not to b? That is the zImage. */
        return false;
diff --git a/tools/kvm/arm/include/kvm/kvm-config-arch.h 
b/tools/kvm/arm/include/kvm/kvm-config-arch.h
new file mode 100644
index 0000000..60f61de
--- /dev/null
+++ b/tools/kvm/arm/include/kvm/kvm-config-arch.h
@@ -0,0 +1,7 @@
+#ifndef KVM__KVM_CONFIG_ARCH_H
+#define KVM__KVM_CONFIG_ARCH_H
+
+struct kvm_config_arch {
+};
+
+#endif /* KVM__KVM_CONFIG_ARCH_H */
diff --git a/tools/kvm/builtin-run.c b/tools/kvm/builtin-run.c
index 96e68af..d0b876a 100644
--- a/tools/kvm/builtin-run.c
+++ b/tools/kvm/builtin-run.c
@@ -90,6 +90,10 @@ void kvm_run_set_wrapper_sandbox(void)
        kvm_run_wrapper = KVM_RUN_SANDBOX;
 }
 
+#ifndef OPT_ARCH_RUN
+#define OPT_ARCH_RUN(...)
+#endif
+
 #define BUILD_OPTIONS(name, cfg, kvm)                                  \
        struct option name[] = {                                        \
        OPT_GROUP("Basic options:"),                                    \
@@ -144,10 +148,6 @@ void kvm_run_set_wrapper_sandbox(void)
        OPT_BOOLEAN('\0', "no-dhcp", &(cfg)->no_dhcp, "Disable kernel"  \
                        " DHCP in rootfs mode"),                        \
                                                                        \
-       OPT_GROUP("BIOS options:"),                                     \
-       OPT_INTEGER('\0', "vidmode", &(cfg)->vidmode,                   \
-                   "Video mode"),                                      \
-                                                                       \
        OPT_GROUP("Debug options:"),                                    \
        OPT_BOOLEAN('\0', "debug", &do_debug_print,                     \
                        "Enable debug messages"),                       \
@@ -159,6 +159,8 @@ void kvm_run_set_wrapper_sandbox(void)
                        "Enable MMIO debugging"),                       \
        OPT_INTEGER('\0', "debug-iodelay", &(cfg)->debug_iodelay,       \
                        "Delay IO by millisecond"),                     \
+                                                                       \
+       OPT_ARCH(RUN, cfg)                                              \
        OPT_END()                                                       \
        };
 
@@ -598,17 +600,6 @@ static struct kvm *kvm_cmd_run_init(int argc, const char 
**argv)
        if (!kvm->cfg.script)
                kvm->cfg.script = DEFAULT_SCRIPT;
 
-       if (!kvm->cfg.vidmode)
-               kvm->cfg.vidmode = -1;
-
-       /* vidmode should be either specified or set by default */
-       if (kvm->cfg.vnc || kvm->cfg.sdl) {
-               if (kvm->cfg.vidmode == -1)
-                       kvm->cfg.vidmode = 0x312;
-       } else {
-               kvm->cfg.vidmode = 0;
-       }
-
        if (!kvm->cfg.network)
                 kvm->cfg.network = DEFAULT_NETWORK;
 
diff --git a/tools/kvm/include/kvm/kvm-config.h 
b/tools/kvm/include/kvm/kvm-config.h
index df36a76..c66f481 100644
--- a/tools/kvm/include/kvm/kvm-config.h
+++ b/tools/kvm/include/kvm/kvm-config.h
@@ -2,6 +2,7 @@
 #define KVM_CONFIG_H_
 
 #include "kvm/disk-image.h"
+#include "kvm/kvm-config-arch.h"
 
 #define DEFAULT_KVM_DEV                "/dev/kvm"
 #define DEFAULT_CONSOLE                "serial"
@@ -17,6 +18,7 @@
 #define MIN_RAM_SIZE_BYTE      (MIN_RAM_SIZE_MB << MB_SHIFT)
 
 struct kvm_config {
+       struct kvm_config_arch arch;
        struct disk_image_params disk_image[MAX_DISK_IMAGES];
        u64 ram_size;
        u8  image_count;
@@ -25,7 +27,6 @@ struct kvm_config {
        int active_console;
        int debug_iodelay;
        int nrcpus;
-       int vidmode;
        const char *kernel_cmdline;
        const char *kernel_filename;
        const char *vmlinux_filename;
diff --git a/tools/kvm/include/kvm/kvm.h b/tools/kvm/include/kvm/kvm.h
index b54ac03..acb0818 100644
--- a/tools/kvm/include/kvm/kvm.h
+++ b/tools/kvm/include/kvm/kvm.h
@@ -78,7 +78,7 @@ void kvm__init_ram(struct kvm *kvm);
 int kvm__exit(struct kvm *kvm);
 bool kvm__load_firmware(struct kvm *kvm, const char *firmware_filename);
 bool kvm__load_kernel(struct kvm *kvm, const char *kernel_filename,
-                       const char *initrd_filename, const char 
*kernel_cmdline, u16 vidmode);
+                       const char *initrd_filename, const char 
*kernel_cmdline);
 int kvm_timer__init(struct kvm *kvm);
 int kvm_timer__exit(struct kvm *kvm);
 void kvm__irq_line(struct kvm *kvm, int irq, int level);
@@ -109,7 +109,7 @@ void *guest_flat_to_host(struct kvm *kvm, u64 offset);
 u64 host_to_guest_flat(struct kvm *kvm, void *ptr);
 
 int load_flat_binary(struct kvm *kvm, int fd_kernel, int fd_initrd, const char 
*kernel_cmdline);
-bool load_bzimage(struct kvm *kvm, int fd_kernel, int fd_initrd, const char 
*kernel_cmdline, u16 vidmode);
+bool load_bzimage(struct kvm *kvm, int fd_kernel, int fd_initrd, const char 
*kernel_cmdline);
 
 /*
  * Debugging
diff --git a/tools/kvm/include/kvm/parse-options.h 
b/tools/kvm/include/kvm/parse-options.h
index cc188b9..09a5fca 100644
--- a/tools/kvm/include/kvm/parse-options.h
+++ b/tools/kvm/include/kvm/parse-options.h
@@ -191,6 +191,9 @@ struct option {
 
 #define OPT_END() { .type = OPTION_END }
 
+#define OPT_ARCH(cmd, cfg)                 \
+       OPT_ARCH_##cmd(OPT_GROUP("Arch-specific options:"), &(cfg)->arch)
+
 enum {
        PARSE_OPT_HELP = -1,
        PARSE_OPT_DONE,
diff --git a/tools/kvm/kvm.c b/tools/kvm/kvm.c
index af19e37..3ea6339 100644
--- a/tools/kvm/kvm.c
+++ b/tools/kvm/kvm.c
@@ -303,7 +303,7 @@ int kvm__init(struct kvm *kvm)
 
        if (!kvm->cfg.firmware_filename) {
                if (!kvm__load_kernel(kvm, kvm->cfg.kernel_filename,
-                               kvm->cfg.initrd_filename, 
kvm->cfg.real_cmdline, kvm->cfg.vidmode))
+                               kvm->cfg.initrd_filename, 
kvm->cfg.real_cmdline))
                        die("unable to load kernel %s", 
kvm->cfg.kernel_filename);
        }
 
@@ -349,7 +349,7 @@ static bool initrd_check(int fd)
 }
 
 bool kvm__load_kernel(struct kvm *kvm, const char *kernel_filename,
-               const char *initrd_filename, const char *kernel_cmdline, u16 
vidmode)
+               const char *initrd_filename, const char *kernel_cmdline)
 {
        bool ret;
        int fd_kernel = -1, fd_initrd = -1;
@@ -367,7 +367,7 @@ bool kvm__load_kernel(struct kvm *kvm, const char 
*kernel_filename,
                        die("%s is not an initrd", initrd_filename);
        }
 
-       ret = load_bzimage(kvm, fd_kernel, fd_initrd, kernel_cmdline, vidmode);
+       ret = load_bzimage(kvm, fd_kernel, fd_initrd, kernel_cmdline);
 
        if (ret)
                goto found_kernel;
diff --git a/tools/kvm/powerpc/include/kvm/kvm-config-arch.h 
b/tools/kvm/powerpc/include/kvm/kvm-config-arch.h
new file mode 100644
index 0000000..60f61de
--- /dev/null
+++ b/tools/kvm/powerpc/include/kvm/kvm-config-arch.h
@@ -0,0 +1,7 @@
+#ifndef KVM__KVM_CONFIG_ARCH_H
+#define KVM__KVM_CONFIG_ARCH_H
+
+struct kvm_config_arch {
+};
+
+#endif /* KVM__KVM_CONFIG_ARCH_H */
diff --git a/tools/kvm/powerpc/kvm.c b/tools/kvm/powerpc/kvm.c
index d8dfc01..dc9f89d 100644
--- a/tools/kvm/powerpc/kvm.c
+++ b/tools/kvm/powerpc/kvm.c
@@ -204,8 +204,8 @@ int load_flat_binary(struct kvm *kvm, int fd_kernel, int 
fd_initrd, const char *
        return true;
 }
 
-bool load_bzimage(struct kvm *kvm, int fd_kernel,
-                 int fd_initrd, const char *kernel_cmdline, u16 vidmode)
+bool load_bzimage(struct kvm *kvm, int fd_kernel, int fd_initrd,
+                 const char *kernel_cmdline)
 {
        /* We don't support bzImages. */
        return false;
diff --git a/tools/kvm/x86/include/kvm/kvm-config-arch.h 
b/tools/kvm/x86/include/kvm/kvm-config-arch.h
new file mode 100644
index 0000000..3eae8db
--- /dev/null
+++ b/tools/kvm/x86/include/kvm/kvm-config-arch.h
@@ -0,0 +1,15 @@
+#ifndef KVM__KVM_CONFIG_ARCH_H
+#define KVM__KVM_CONFIG_ARCH_H
+
+#include "kvm/parse-options.h"
+
+struct kvm_config_arch {
+       int vidmode;
+};
+
+#define OPT_ARCH_RUN(pfx, cfg)                                         \
+       pfx,                                                            \
+       OPT_GROUP("BIOS options:"),                                     \
+       OPT_INTEGER('\0', "vidmode", &(cfg)->vidmode, "Video mode"),
+
+#endif /* KVM__KVM_CONFIG_ARCH_H */
diff --git a/tools/kvm/x86/kvm.c b/tools/kvm/x86/kvm.c
index 9971ffd..687e6b7 100644
--- a/tools/kvm/x86/kvm.c
+++ b/tools/kvm/x86/kvm.c
@@ -235,8 +235,8 @@ int load_flat_binary(struct kvm *kvm, int fd_kernel, int 
fd_initrd, const char *
 
 static const char *BZIMAGE_MAGIC = "HdrS";
 
-bool load_bzimage(struct kvm *kvm, int fd_kernel,
-                 int fd_initrd, const char *kernel_cmdline, u16 vidmode)
+bool load_bzimage(struct kvm *kvm, int fd_kernel, int fd_initrd,
+                 const char *kernel_cmdline)
 {
        struct boot_params *kern_boot;
        unsigned long setup_sects;
@@ -245,6 +245,7 @@ bool load_bzimage(struct kvm *kvm, int fd_kernel,
        ssize_t setup_size;
        void *p;
        int nr;
+       u16 vidmode;
 
        /*
         * See Documentation/x86/boot.txt for details no bzImage on-disk and
@@ -293,6 +294,17 @@ bool load_bzimage(struct kvm *kvm, int fd_kernel,
                memcpy(p, kernel_cmdline, cmdline_size - 1);
        }
 
+       if (!kvm->cfg.arch.vidmode)
+               vidmode = -1;
+
+       /* vidmode should be either specified or set by default */
+       if (kvm->cfg.vnc || kvm->cfg.sdl) {
+               if (vidmode == -1)
+                       vidmode = 0x312;
+       } else {
+               vidmode = 0;
+       }
+
        kern_boot       = guest_real_to_host(kvm, BOOT_LOADER_SELECTOR, 0x00);
 
        kern_boot->hdr.cmd_line_ptr     = BOOT_CMDLINE_OFFSET;
-- 
1.8.0

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to