pc/fwcfg: unbreak migration from qemu-2.5 and qemu-2.6 during firmware boot
Since 2.7 commit (b2a575a Add optionrom compatible with fw_cfg DMA version) regressed migration during firmware exection time by abusing fwcfg.dma_enabled property to decide loading dma version of option rom AND by mistake disabling DMA for 2.6 and earlier globally instead of only for option rom. so 2.6 machine type guest is broken when it already runs firmware in DMA mode but migrated to qemu-2.7(pc-2.6) at that time; a) qemu-2.6:pc2.6 (fwcfg.dma=on,firmware=dma,oprom=ioport) b) qemu-2.7:pc2.6 (fwcfg.dma=off,firmware=ioport,oprom=ioport) to: a b from a OK FAIL b OK OK So we currently have broken forward migration from qemu-2.6 to qemu-2.[789] that however could be fixed for 2.10 by re-enabling DMA for 2.[56] machine types and allowing dma capable option rom only since 2.7. As result qemu should end up with: c) qemu-2.10:pc2.6 (fwcfg.dma=on,firmware=dma,oprom=ioport) to: a b c from a OK FAIL OK b OK OK OK c OK FAIL OK where forward migration from qemu-2.6 to qemu-2.10 should work again leaving only qemu-2.[789]:pc-2.6 broken. Reported-by: Eduardo Habkost <ehabkost@redhat.com> Analyzed-by: Laszlo Ersek <lersek@redhat.com> Signed-off-by: Igor Mammedov <imammedo@redhat.com> Reviewed-by: Laszlo Ersek <lersek@redhat.com> Reviewed-by: Eduardo Habkost <ehabkost@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
640601c7cb
commit
98e753a6e5
@ -1047,12 +1047,10 @@ static void load_linux(PCMachineState *pcms,
|
||||
fw_cfg_add_i32(fw_cfg, FW_CFG_SETUP_SIZE, setup_size);
|
||||
fw_cfg_add_bytes(fw_cfg, FW_CFG_SETUP_DATA, setup, setup_size);
|
||||
|
||||
if (fw_cfg_dma_enabled(fw_cfg)) {
|
||||
option_rom[nb_option_roms].bootindex = 0;
|
||||
option_rom[nb_option_roms].name = "linuxboot.bin";
|
||||
if (pcmc->linuxboot_dma_enabled && fw_cfg_dma_enabled(fw_cfg)) {
|
||||
option_rom[nb_option_roms].name = "linuxboot_dma.bin";
|
||||
option_rom[nb_option_roms].bootindex = 0;
|
||||
} else {
|
||||
option_rom[nb_option_roms].name = "linuxboot.bin";
|
||||
option_rom[nb_option_roms].bootindex = 0;
|
||||
}
|
||||
nb_option_roms++;
|
||||
}
|
||||
@ -2321,6 +2319,7 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
|
||||
* to be used at the moment, 32K should be enough for a while. */
|
||||
pcmc->acpi_data_size = 0x20000 + 0x8000;
|
||||
pcmc->save_tsc_khz = true;
|
||||
pcmc->linuxboot_dma_enabled = true;
|
||||
mc->get_hotplug_handler = pc_get_hotpug_handler;
|
||||
mc->cpu_index_to_socket_id = pc_cpu_index_to_socket_id;
|
||||
mc->possible_cpu_arch_ids = pc_possible_cpu_arch_ids;
|
||||
|
@ -474,6 +474,7 @@ static void pc_i440fx_2_6_machine_options(MachineClass *m)
|
||||
PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
|
||||
pc_i440fx_2_7_machine_options(m);
|
||||
pcmc->legacy_cpu_hotplug = true;
|
||||
pcmc->linuxboot_dma_enabled = false;
|
||||
SET_MACHINE_COMPAT(m, PC_COMPAT_2_6);
|
||||
}
|
||||
|
||||
|
@ -335,6 +335,7 @@ static void pc_q35_2_6_machine_options(MachineClass *m)
|
||||
PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
|
||||
pc_q35_2_7_machine_options(m);
|
||||
pcmc->legacy_cpu_hotplug = true;
|
||||
pcmc->linuxboot_dma_enabled = false;
|
||||
SET_MACHINE_COMPAT(m, PC_COMPAT_2_6);
|
||||
}
|
||||
|
||||
|
@ -151,6 +151,9 @@ struct PCMachineClass {
|
||||
bool save_tsc_khz;
|
||||
/* generate legacy CPU hotplug AML */
|
||||
bool legacy_cpu_hotplug;
|
||||
|
||||
/* use DMA capable linuxboot option rom */
|
||||
bool linuxboot_dma_enabled;
|
||||
};
|
||||
|
||||
#define TYPE_PC_MACHINE "generic-pc-machine"
|
||||
@ -438,10 +441,6 @@ bool e820_get_entry(int, uint32_t, uint64_t *, uint64_t *);
|
||||
#define PC_COMPAT_2_6 \
|
||||
HW_COMPAT_2_6 \
|
||||
{\
|
||||
.driver = "fw_cfg_io",\
|
||||
.property = "dma_enabled",\
|
||||
.value = "off",\
|
||||
},{\
|
||||
.driver = TYPE_X86_CPU,\
|
||||
.property = "cpuid-0xb",\
|
||||
.value = "off",\
|
||||
|
Loading…
x
Reference in New Issue
Block a user