From 1d05047c15ca1d8e29dcb0892e449987739682b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Date: Wed, 13 Dec 2017 13:38:40 +0100 Subject: [PATCH 09/41] fw_cfg: unbreak migration compatibility MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit RH-Author: Marc-André Lureau Message-id: <20171213133912.26176-10-marcandre.lureau@redhat.com> Patchwork-id: 78359 O-Subject: [RHEL-7.5 qemu-kvm PATCH v3 09/41] fw_cfg: unbreak migration compatibility Bugzilla: 1411490 RH-Acked-by: Laszlo Ersek RH-Acked-by: Michael S. Tsirkin RH-Acked-by: Miroslav Rezanina From: Laszlo Ersek Upstream-status: RHEL only fw_cfg DMA shouldn't be enabled by default on x86, or it will break migration from new (DMA) to old (non-DMA) qemu. Thus we must maintain DMA disabled by default. Since we don't introduce a new machine, only if requested explicitely with -global fw_cfg.dma_enabled=on, or -device vmcoreinfo (see upcoming RHEL-only patch) should DMA be enabled. (this is somewhat similar to upstream commit e6915b5f3a874a467a9a65f7ec1d6ef8d251a51a, except that we can't enable DMA by default on RHEL qemu) Signed-off-by: Marc-André Lureau Signed-off-by: Miroslav Rezanina --- hw/nvram/fw_cfg.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/hw/nvram/fw_cfg.c b/hw/nvram/fw_cfg.c index 1789487..a7bc98e 100644 --- a/hw/nvram/fw_cfg.c +++ b/hw/nvram/fw_cfg.c @@ -677,13 +677,16 @@ fw_cfg_init_dma(uint32_t ctl_port, uint32_t data_port, SysBusDevice *d; FWCfgState *s; uint32_t version = FW_CFG_VERSION; - bool dma_enabled = dma_port && dma_as; + bool dma_requested = dma_port && dma_as; dev = qdev_create(NULL, "fw_cfg"); qdev_prop_set_uint32(dev, "ctl_iobase", ctl_port); qdev_prop_set_uint32(dev, "data_iobase", data_port); qdev_prop_set_uint32(dev, "dma_iobase", dma_port); - qdev_prop_set_bit(dev, "dma_enabled", dma_enabled); + + if (!dma_requested) { + qdev_prop_set_bit(dev, "dma_enabled", false); + } d = SYS_BUS_DEVICE(dev); @@ -702,7 +705,7 @@ fw_cfg_init_dma(uint32_t ctl_port, uint32_t data_port, if (data_addr) { sysbus_mmio_map(d, 1, data_addr); } - if (dma_enabled) { + if (s->dma_enabled) { /* 64 bits for the address field */ s->dma = &dma_context_memory; s->dma_addr = 0; -- 1.8.3.1