diff --git a/builtin-run.c b/builtin-run.c index 1ad574d..ec783f6 100644 --- a/builtin-run.c +++ b/builtin-run.c @@ -594,6 +594,7 @@ static int kvm_cmd_run_init(int argc, const char **argv) } kvm->cfg.vmlinux_filename = find_vmlinux(); + kvm->vmlinux = kvm->cfg.vmlinux_filename; if (kvm->cfg.nrcpus == 0) kvm->cfg.nrcpus = nr_online_cpus; @@ -642,11 +643,14 @@ static int kvm_cmd_run_init(int argc, const char **argv) if (!kvm->cfg.vnc && !kvm->cfg.sdl) kvm->cfg.vidmode = -1; - r = term_init(kvm); - if (r < 0) { - pr_err("term_init() failed with error %d\n", r); - goto fail; - } + memset(real_cmdline, 0, sizeof(real_cmdline)); + kvm__arch_set_cmdline(real_cmdline, kvm->cfg.vnc || kvm->cfg.sdl); + + if (strlen(real_cmdline) > 0) + strcat(real_cmdline, " "); + + if (kvm->cfg.kernel_cmdline) + strlcat(real_cmdline, kvm->cfg.kernel_cmdline, sizeof(real_cmdline)); if (!kvm->cfg.guest_name) { if (kvm->cfg.custom_rootfs) { @@ -657,49 +661,6 @@ static int kvm_cmd_run_init(int argc, const char **argv) } } - r = kvm__init(kvm); - if (r) - goto fail; - - r = ioeventfd__init(kvm); - if (r < 0) { - pr_err("ioeventfd__init() failed with error %d\n", r); - goto fail; - } - - r = kvm_cpu__init(kvm); - if (r < 0) { - pr_err("kvm_cpu__init() failed with error %d\n", r); - goto fail; - } - - r = irq__init(kvm); - if (r < 0) { - pr_err("irq__init() failed with error %d\n", r); - goto fail; - } - - r = pci__init(kvm); - if (r < 0) { - pr_err("pci__init() failed with error %d\n", r); - goto fail; - } - - r = ioport__init(kvm); - if (r < 0) { - pr_err("ioport__init() failed with error %d\n", r); - goto fail; - } - - memset(real_cmdline, 0, sizeof(real_cmdline)); - kvm__arch_set_cmdline(real_cmdline, kvm->cfg.vnc || kvm->cfg.sdl); - - if (strlen(real_cmdline) > 0) - strcat(real_cmdline, " "); - - if (kvm->cfg.kernel_cmdline) - strlcat(real_cmdline, kvm->cfg.kernel_cmdline, sizeof(real_cmdline)); - if (!kvm->cfg.using_rootfs && !kvm->cfg.disk_image[0].filename && !kvm->cfg.initrd_filename) { char tmp[PATH_MAX]; @@ -730,25 +691,61 @@ static int kvm_cmd_run_init(int argc, const char **argv) strlcat(real_cmdline, " root=/dev/vda rw ", sizeof(real_cmdline)); } + kvm->cfg.real_cmdline = real_cmdline; + + printf(" # %s run -k %s -m %Lu -c %d --name %s\n", KVM_BINARY_NAME, + kvm->cfg.kernel_filename, kvm->cfg.ram_size / 1024 / 1024, kvm->cfg.nrcpus, kvm->cfg.guest_name); + + r = kvm__init(kvm); + if (r) + goto fail; + + r = term_init(kvm); + if (r < 0) { + pr_err("term_init() failed with error %d\n", r); + goto fail; + } + + + r = ioeventfd__init(kvm); + if (r < 0) { + pr_err("ioeventfd__init() failed with error %d\n", r); + goto fail; + } + + r = kvm_cpu__init(kvm); + if (r < 0) { + pr_err("kvm_cpu__init() failed with error %d\n", r); + goto fail; + } + + r = irq__init(kvm); + if (r < 0) { + pr_err("irq__init() failed with error %d\n", r); + goto fail; + } + + r = pci__init(kvm); + if (r < 0) { + pr_err("pci__init() failed with error %d\n", r); + goto fail; + } + + r = ioport__init(kvm); + if (r < 0) { + pr_err("ioport__init() failed with error %d\n", r); + goto fail; + } + r = disk_image__init(kvm); if (r < 0) { pr_err("disk_image__init() failed with error %d\n", r); goto fail; } - printf(" # %s run -k %s -m %Lu -c %d --name %s\n", KVM_BINARY_NAME, - kvm->cfg.kernel_filename, kvm->cfg.ram_size / 1024 / 1024, kvm->cfg.nrcpus, kvm->cfg.guest_name); - - if (!kvm->cfg.firmware_filename) { - if (!kvm__load_kernel(kvm, kvm->cfg.kernel_filename, - kvm->cfg.initrd_filename, real_cmdline, kvm->cfg.vidmode)) - die("unable to load kernel %s", kvm->cfg.kernel_filename); - - kvm->vmlinux = kvm->cfg.vmlinux_filename; - r = symbol_init(kvm); - if (r < 0) - pr_debug("symbol_init() failed with error %d\n", r); - } + r = symbol_init(kvm); + if (r < 0) + pr_debug("symbol_init() failed with error %d\n", r); ioport__setup_arch(); @@ -848,17 +845,6 @@ static int kvm_cmd_run_init(int argc, const char **argv) goto fail; } - if (kvm->cfg.firmware_filename) { - if (!kvm__load_firmware(kvm, kvm->cfg.firmware_filename)) - die("unable to load firmware image %s: %s", kvm->cfg.firmware_filename, strerror(errno)); - } else { - kvm__arch_setup_firmware(kvm); - if (r < 0) { - pr_err("kvm__arch_setup_firmware() failed with error %d\n", r); - goto fail; - } - } - r = thread_pool__init(kvm); if (r < 0) { pr_err("thread_pool__init() failed with error %d\n", r); diff --git a/include/kvm/kvm-config.h b/include/kvm/kvm-config.h index 5e7dc28..df36a76 100644 --- a/include/kvm/kvm-config.h +++ b/include/kvm/kvm-config.h @@ -43,6 +43,7 @@ struct kvm_config { const char *sandbox; const char *hugetlbfs_path; const char *custom_rootfs_name; + const char *real_cmdline; struct virtio_net_params *net_params; bool single_step; bool vnc; diff --git a/kvm.c b/kvm.c index b950c08..7a6e15e 100644 --- a/kvm.c +++ b/kvm.c @@ -246,6 +246,21 @@ int kvm__init(struct kvm *kvm) kvm__arch_init(kvm, kvm->cfg.hugetlbfs_path, kvm->cfg.ram_size); + 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)) + die("unable to load kernel %s", kvm->cfg.kernel_filename); + } + + if (kvm->cfg.firmware_filename) { + if (!kvm__load_firmware(kvm, kvm->cfg.firmware_filename)) + die("unable to load firmware image %s: %s", kvm->cfg.firmware_filename, strerror(errno)); + } else { + ret = kvm__arch_setup_firmware(kvm); + if (ret < 0) + die("kvm__arch_setup_firmware() failed with error %d\n", ret); + } + return 0; err_vm_fd: