From patchwork Wed Dec 5 16:32:17 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Will Deacon X-Patchwork-Id: 1842161 Return-Path: X-Original-To: patchwork-kvm@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork1.kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by patchwork1.kernel.org (Postfix) with ESMTP id BC91440B17 for ; Wed, 5 Dec 2012 16:32:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752947Ab2LEQcl (ORCPT ); Wed, 5 Dec 2012 11:32:41 -0500 Received: from cam-admin0.cambridge.arm.com ([217.140.96.50]:39226 "EHLO cam-admin0.cambridge.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752216Ab2LEQcj (ORCPT ); Wed, 5 Dec 2012 11:32:39 -0500 Received: from mudshark.cambridge.arm.com (mudshark.cambridge.arm.com [10.1.79.58]) by cam-admin0.cambridge.arm.com (8.12.6/8.12.6) with ESMTP id qB5GWSUO007988; Wed, 5 Dec 2012 16:32:28 GMT Received: by mudshark.cambridge.arm.com (Postfix, from userid 1000) id 6EBF6C2A9C; Wed, 5 Dec 2012 16:32:27 +0000 (GMT) From: Will Deacon To: kvm@vger.kernel.org Cc: penberg@kernel.org, marc.zyngier@arm.com, Will Deacon Subject: [PATCH 3/3] kvm tools: allow arch's to provide their own command-line options Date: Wed, 5 Dec 2012 16:32:17 +0000 Message-Id: <1354725137-18077-3-git-send-email-will.deacon@arm.com> X-Mailer: git-send-email 1.8.0 In-Reply-To: <1354725137-18077-1-git-send-email-will.deacon@arm.com> References: <1354725137-18077-1-git-send-email-will.deacon@arm.com> Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org 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 --- 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;