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