Commit dafb82e0 authored by Jordan Justen's avatar Jordan Justen Committed by Anthony Liguori
Browse files

pc_sysfw: allow flash (-pflash) memory to be used with KVM



When pc-sysfw.rom_only == 0, flash memory will be
usable with kvm. In order to enable flash memory mode,
a pflash device must be created. (For example, by
using the -pflash command line parameter.)

Usage of a flash memory device with kvm requires
KVM_CAP_READONLY_MEM, and kvm will abort if
a flash device is used with an older kvm which does
not support this capability.

If a flash device is not used, then qemu/kvm will
operate in the original rom-mode.

Signed-off-by: default avatarJordan Justen <jordan.l.justen@intel.com>
Reviewed-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
Message-id: 1369816047-16384-5-git-send-email-jordan.l.justen@intel.com
Signed-off-by: default avatarAnthony Liguori <aliguori@us.ibm.com>
parent 235e8982
Loading
Loading
Loading
Loading
+31 −19
Original line number Diff line number Diff line
@@ -220,29 +220,41 @@ void pc_system_firmware_init(MemoryRegion *rom_memory)

    qdev_init_nofail(DEVICE(sysfw_dev));

    if (sysfw_dev->rom_only) {
        old_pc_system_rom_init(rom_memory, sysfw_dev->isapc_ram_fw);
        return;
    }

    pflash_drv = drive_get(IF_PFLASH, 0, 0);

    /* Currently KVM cannot execute from device memory.
       Use old rom based firmware initialization for KVM. */
    if (pc_sysfw_flash_vs_rom_bug_compatible) {
        /*
         * This is a Bad Idea, because it makes enabling/disabling KVM
     * guest-visible.  Let's fix it for real in QEMU 1.6.
         * guest-visible.  Do it only in bug-compatibility mode.
         */
        if (kvm_enabled()) {
            if (pflash_drv != NULL) {
                fprintf(stderr, "qemu: pflash cannot be used with kvm enabled\n");
                exit(1);
            } else {
                /* In old pc_sysfw_flash_vs_rom_bug_compatible mode, we assume
                 * that KVM cannot execute from device memory. In this case, we
                 * use old rom based firmware initialization for KVM. But, since
                 * this is different from non-kvm mode, this behavior is
                 * undesirable */
                sysfw_dev->rom_only = 1;
            }
        }
    } else if (pflash_drv == NULL) {
        /* When a pflash drive is not found, use rom-mode */
        sysfw_dev->rom_only = 1;
    } else if (kvm_enabled() && !kvm_readonly_mem_enabled()) {
        /* Older KVM cannot execute from device memory. So, flash memory
         * cannot be used unless the readonly memory kvm capability is present. */
        fprintf(stderr, "qemu: pflash with kvm requires KVM readonly memory support\n");
        exit(1);
    }

    /* If rom-mode is active, use the old pc system rom initialization. */
    if (sysfw_dev->rom_only) {
        old_pc_system_rom_init(rom_memory, sysfw_dev->isapc_ram_fw);
        return;
    }
    }

    /* If a pflash drive is not found, then create one using
       the bios filename. */