|
|
76daa3 |
From 3e0f343e05796e009c0cf2b31cf12c59282bcd63 Mon Sep 17 00:00:00 2001
|
|
|
76daa3 |
From: Igor Mammedov <imammedo@redhat.com>
|
|
|
76daa3 |
Date: Wed, 24 May 2017 07:57:44 +0200
|
|
|
76daa3 |
Subject: [PATCH 2/6] pc/fwcfg: unbreak migration from qemu-2.5 and qemu-2.6
|
|
|
76daa3 |
during firmware boot
|
|
|
76daa3 |
|
|
|
76daa3 |
RH-Author: Igor Mammedov <imammedo@redhat.com>
|
|
|
76daa3 |
Message-id: <1495612665-46614-2-git-send-email-imammedo@redhat.com>
|
|
|
76daa3 |
Patchwork-id: 75405
|
|
|
76daa3 |
O-Subject: [RHEL7.4 qemu-kvm-rhev v2 1/2] pc/fwcfg: unbreak migration from qemu-2.5 and qemu-2.6 during firmware boot
|
|
|
76daa3 |
Bugzilla: 1441394
|
|
|
76daa3 |
RH-Acked-by: Laszlo Ersek <lersek@redhat.com>
|
|
|
76daa3 |
RH-Acked-by: Eduardo Habkost <ehabkost@redhat.com>
|
|
|
76daa3 |
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
|
76daa3 |
|
|
|
76daa3 |
Since 2.7 commit (b2a575a Add optionrom compatible with fw_cfg DMA version)
|
|
|
76daa3 |
regressed migration during firmware exection time by
|
|
|
76daa3 |
abusing fwcfg.dma_enabled property to decide loading
|
|
|
76daa3 |
dma version of option rom AND by mistake disabling DMA
|
|
|
76daa3 |
for 2.6 and earlier globally instead of only for option rom.
|
|
|
76daa3 |
|
|
|
76daa3 |
so 2.6 machine type guest is broken when it already runs
|
|
|
76daa3 |
firmware in DMA mode but migrated to qemu-2.7(pc-2.6)
|
|
|
76daa3 |
at that time;
|
|
|
76daa3 |
|
|
|
76daa3 |
a) qemu-2.6:pc2.6 (fwcfg.dma=on,firmware=dma,oprom=ioport)
|
|
|
76daa3 |
b) qemu-2.7:pc2.6 (fwcfg.dma=off,firmware=ioport,oprom=ioport)
|
|
|
76daa3 |
|
|
|
76daa3 |
to: a b
|
|
|
76daa3 |
from
|
|
|
76daa3 |
a OK FAIL
|
|
|
76daa3 |
b OK OK
|
|
|
76daa3 |
|
|
|
76daa3 |
So we currently have broken forward migration from
|
|
|
76daa3 |
qemu-2.6 to qemu-2.[789] that however could be fixed
|
|
|
76daa3 |
for 2.10 by re-enabling DMA for 2.[56] machine types
|
|
|
76daa3 |
and allowing dma capable option rom only since 2.7.
|
|
|
76daa3 |
As result qemu should end up with:
|
|
|
76daa3 |
|
|
|
76daa3 |
c) qemu-2.10:pc2.6 (fwcfg.dma=on,firmware=dma,oprom=ioport)
|
|
|
76daa3 |
|
|
|
76daa3 |
to: a b c
|
|
|
76daa3 |
from
|
|
|
76daa3 |
a OK FAIL OK
|
|
|
76daa3 |
b OK OK OK
|
|
|
76daa3 |
c OK FAIL OK
|
|
|
76daa3 |
|
|
|
76daa3 |
where forward migration from qemu-2.6 to qemu-2.10 should
|
|
|
76daa3 |
work again leaving only qemu-2.[789]:pc-2.6 broken.
|
|
|
76daa3 |
|
|
|
76daa3 |
Reported-by: Eduardo Habkost <ehabkost@redhat.com>
|
|
|
76daa3 |
Analyzed-by: Laszlo Ersek <lersek@redhat.com>
|
|
|
76daa3 |
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
|
|
|
76daa3 |
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
|
|
|
76daa3 |
Reviewed-by: Eduardo Habkost <ehabkost@redhat.com>
|
|
|
76daa3 |
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
|
|
76daa3 |
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
|
|
76daa3 |
(cherry picked from commit 98e753a6e51b255d474c4db5e7af8b01633b6a4c)
|
|
|
76daa3 |
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
|
76daa3 |
---
|
|
|
76daa3 |
hw/i386/pc.c | 9 ++++-----
|
|
|
76daa3 |
hw/i386/pc_piix.c | 1 +
|
|
|
76daa3 |
hw/i386/pc_q35.c | 1 +
|
|
|
76daa3 |
include/hw/i386/pc.h | 7 +++----
|
|
|
76daa3 |
4 files changed, 9 insertions(+), 9 deletions(-)
|
|
|
76daa3 |
|
|
|
76daa3 |
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
|
|
|
76daa3 |
index 1a0e672..3596de0 100644
|
|
|
76daa3 |
--- a/hw/i386/pc.c
|
|
|
76daa3 |
+++ b/hw/i386/pc.c
|
|
|
76daa3 |
@@ -1048,12 +1048,10 @@ static void load_linux(PCMachineState *pcms,
|
|
|
76daa3 |
fw_cfg_add_i32(fw_cfg, FW_CFG_SETUP_SIZE, setup_size);
|
|
|
76daa3 |
fw_cfg_add_bytes(fw_cfg, FW_CFG_SETUP_DATA, setup, setup_size);
|
|
|
76daa3 |
|
|
|
76daa3 |
- if (fw_cfg_dma_enabled(fw_cfg)) {
|
|
|
76daa3 |
+ option_rom[nb_option_roms].bootindex = 0;
|
|
|
76daa3 |
+ option_rom[nb_option_roms].name = "linuxboot.bin";
|
|
|
76daa3 |
+ if (pcmc->linuxboot_dma_enabled && fw_cfg_dma_enabled(fw_cfg)) {
|
|
|
76daa3 |
option_rom[nb_option_roms].name = "linuxboot_dma.bin";
|
|
|
76daa3 |
- option_rom[nb_option_roms].bootindex = 0;
|
|
|
76daa3 |
- } else {
|
|
|
76daa3 |
- option_rom[nb_option_roms].name = "linuxboot.bin";
|
|
|
76daa3 |
- option_rom[nb_option_roms].bootindex = 0;
|
|
|
76daa3 |
}
|
|
|
76daa3 |
nb_option_roms++;
|
|
|
76daa3 |
}
|
|
|
76daa3 |
@@ -2327,6 +2325,7 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
|
|
|
76daa3 |
* to be used at the moment, 32K should be enough for a while. */
|
|
|
76daa3 |
pcmc->acpi_data_size = 0x20000 + 0x8000;
|
|
|
76daa3 |
pcmc->save_tsc_khz = true;
|
|
|
76daa3 |
+ pcmc->linuxboot_dma_enabled = true;
|
|
|
76daa3 |
mc->get_hotplug_handler = pc_get_hotpug_handler;
|
|
|
76daa3 |
mc->cpu_index_to_socket_id = pc_cpu_index_to_socket_id;
|
|
|
76daa3 |
mc->possible_cpu_arch_ids = pc_possible_cpu_arch_ids;
|
|
|
76daa3 |
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
|
|
|
76daa3 |
index fa41189..bbdf2a8 100644
|
|
|
76daa3 |
--- a/hw/i386/pc_piix.c
|
|
|
76daa3 |
+++ b/hw/i386/pc_piix.c
|
|
|
76daa3 |
@@ -476,6 +476,7 @@ static void pc_i440fx_2_6_machine_options(MachineClass *m)
|
|
|
76daa3 |
PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
|
|
|
76daa3 |
pc_i440fx_2_7_machine_options(m);
|
|
|
76daa3 |
pcmc->legacy_cpu_hotplug = true;
|
|
|
76daa3 |
+ pcmc->linuxboot_dma_enabled = false;
|
|
|
76daa3 |
SET_MACHINE_COMPAT(m, PC_COMPAT_2_6);
|
|
|
76daa3 |
}
|
|
|
76daa3 |
|
|
|
76daa3 |
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
|
|
|
76daa3 |
index 23d5f6b..aad1ae7 100644
|
|
|
76daa3 |
--- a/hw/i386/pc_q35.c
|
|
|
76daa3 |
+++ b/hw/i386/pc_q35.c
|
|
|
76daa3 |
@@ -337,6 +337,7 @@ static void pc_q35_2_6_machine_options(MachineClass *m)
|
|
|
76daa3 |
PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
|
|
|
76daa3 |
pc_q35_2_7_machine_options(m);
|
|
|
76daa3 |
pcmc->legacy_cpu_hotplug = true;
|
|
|
76daa3 |
+ pcmc->linuxboot_dma_enabled = false;
|
|
|
76daa3 |
SET_MACHINE_COMPAT(m, PC_COMPAT_2_6);
|
|
|
76daa3 |
}
|
|
|
76daa3 |
|
|
|
76daa3 |
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
|
|
|
76daa3 |
index 62ac914..e05d838 100644
|
|
|
76daa3 |
--- a/include/hw/i386/pc.h
|
|
|
76daa3 |
+++ b/include/hw/i386/pc.h
|
|
|
76daa3 |
@@ -151,6 +151,9 @@ struct PCMachineClass {
|
|
|
76daa3 |
bool save_tsc_khz;
|
|
|
76daa3 |
/* generate legacy CPU hotplug AML */
|
|
|
76daa3 |
bool legacy_cpu_hotplug;
|
|
|
76daa3 |
+
|
|
|
76daa3 |
+ /* use DMA capable linuxboot option rom */
|
|
|
76daa3 |
+ bool linuxboot_dma_enabled;
|
|
|
76daa3 |
};
|
|
|
76daa3 |
|
|
|
76daa3 |
#define TYPE_PC_MACHINE "generic-pc-machine"
|
|
|
76daa3 |
@@ -432,10 +435,6 @@ bool e820_get_entry(int, uint32_t, uint64_t *, uint64_t *);
|
|
|
76daa3 |
#define PC_COMPAT_2_6 \
|
|
|
76daa3 |
HW_COMPAT_2_6 \
|
|
|
76daa3 |
{\
|
|
|
76daa3 |
- .driver = "fw_cfg_io",\
|
|
|
76daa3 |
- .property = "dma_enabled",\
|
|
|
76daa3 |
- .value = "off",\
|
|
|
76daa3 |
- },{\
|
|
|
76daa3 |
.driver = TYPE_X86_CPU,\
|
|
|
76daa3 |
.property = "cpuid-0xb",\
|
|
|
76daa3 |
.value = "off",\
|
|
|
76daa3 |
--
|
|
|
76daa3 |
1.8.3.1
|
|
|
76daa3 |
|