From: Hogan Wang <hogan.wang@huawei.com>
To: <marcel.apfelbaum@gmail.com>, <dgilbert@redhat.com>,
<jusual@redhat.com>, <mst@redhat.com>, <qemu-devel@nongnu.org>
Cc: wangxinxin.wang@huawei.com, weidong.huang@huawei.com,
hogan.wang@huawei.com, Hogan Wang <king.wang@huawei.com>
Subject: [PATCH v4 1/2] hw/pci-host: save/restore pci host config register
Date: Mon, 27 Jul 2020 16:46:20 +0800 [thread overview]
Message-ID: <20200727084621.3279-1-hogan.wang@huawei.com> (raw)
From: Hogan Wang <king.wang@huawei.com>
The pci host config register is used to save PCI address for
read/write config data. If guest write a value to config register,
and then pause the vcpu to migrate, After the migration, the guest
continue to write pci config data, and the write data will be ignored
because of new qemu process lost the config register state.
Reproduction steps are:
1. guest booting in seabios.
2. guest enable the SMRAM in seabios:piix4_apmc_smm_setup, and then
expect to disable the SMRAM by pci_config_writeb.
3. after guest write the pci host config register, and then pasued vcpu
to finish migration.
4. guest write config data(0x0A) fail to disable the SMRAM becasue of
config register state lost.
5. guest continue to boot and crash in ipxe option ROM due to SMRAM in
enabled state.
Signed-off-by: Hogan Wang <hogan.wang@huawei.com>
---
hw/i386/pc.c | 4 +++-
hw/pci/pci_host.c | 33 +++++++++++++++++++++++++++++++++
include/hw/pci/pci_host.h | 1 +
3 files changed, 37 insertions(+), 1 deletion(-)
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 3d419d5991..f6ff0c5514 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -97,7 +97,9 @@
#include "fw_cfg.h"
#include "trace.h"
-GlobalProperty pc_compat_5_0[] = {};
+GlobalProperty pc_compat_5_0[] = {
+ { "pci-host-bridge", "x-config-reg-migration-enabled", "off" },
+};
const size_t pc_compat_5_0_len = G_N_ELEMENTS(pc_compat_5_0);
GlobalProperty pc_compat_4_2[] = {
diff --git a/hw/pci/pci_host.c b/hw/pci/pci_host.c
index ce7bcdb1d5..8ca5fadcbd 100644
--- a/hw/pci/pci_host.c
+++ b/hw/pci/pci_host.c
@@ -22,8 +22,10 @@
#include "hw/pci/pci.h"
#include "hw/pci/pci_bridge.h"
#include "hw/pci/pci_host.h"
+#include "hw/qdev-properties.h"
#include "qemu/module.h"
#include "hw/pci/pci_bus.h"
+#include "migration/vmstate.h"
#include "trace.h"
/* debug PCI */
@@ -200,12 +202,43 @@ const MemoryRegionOps pci_host_data_be_ops = {
.endianness = DEVICE_BIG_ENDIAN,
};
+static bool pci_host_needed(void *opaque)
+{
+ PCIHostState *s = opaque;
+ return s->mig_enabled;
+}
+
+const VMStateDescription vmstate_pcihost = {
+ .name = "PCIHost",
+ .needed = pci_host_needed,
+ .version_id = 1,
+ .minimum_version_id = 1,
+ .fields = (VMStateField[]) {
+ VMSTATE_UINT32(config_reg, PCIHostState),
+ VMSTATE_END_OF_LIST()
+ }
+};
+
+static Property pci_host_properties_common[] = {
+ DEFINE_PROP_BOOL("x-config-reg-migration-enabled", PCIHostState,
+ mig_enabled, true),
+ DEFINE_PROP_END_OF_LIST(),
+};
+
+static void pci_host_class_init(ObjectClass *klass, void *data)
+{
+ DeviceClass *dc = DEVICE_CLASS(klass);
+ device_class_set_props(dc, pci_host_properties_common);
+ dc->vmsd = &vmstate_pcihost;
+}
+
static const TypeInfo pci_host_type_info = {
.name = TYPE_PCI_HOST_BRIDGE,
.parent = TYPE_SYS_BUS_DEVICE,
.abstract = true,
.class_size = sizeof(PCIHostBridgeClass),
.instance_size = sizeof(PCIHostState),
+ .class_init = pci_host_class_init,
};
static void pci_host_register_types(void)
diff --git a/include/hw/pci/pci_host.h b/include/hw/pci/pci_host.h
index 9ce088bd13..6210a7e14d 100644
--- a/include/hw/pci/pci_host.h
+++ b/include/hw/pci/pci_host.h
@@ -45,6 +45,7 @@ struct PCIHostState {
MemoryRegion data_mem;
MemoryRegion mmcfg;
uint32_t config_reg;
+ bool mig_enabled;
PCIBus *bus;
QLIST_ENTRY(PCIHostState) next;
--
2.27.0
next reply other threads:[~2020-07-27 8:47 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-07-27 8:46 Hogan Wang [this message]
2020-07-27 8:46 ` [PATCH v4 2/2] hw/pci-host: save/restore pci host config register for old ones Hogan Wang
2020-07-27 13:08 ` Michael S. Tsirkin
2020-07-27 13:53 ` Dr. David Alan Gilbert
2020-07-27 14:08 ` Michael S. Tsirkin
2020-07-27 14:30 ` Michael S. Tsirkin
2020-07-27 15:47 ` Michael S. Tsirkin
2020-07-28 3:27 ` [PATCH v5] " Hogan Wang
2020-07-29 14:04 ` Michael S. Tsirkin
2020-07-29 18:42 ` Dr. David Alan Gilbert
2020-07-30 1:27 ` [PATCH 2/6] " Hogan Wang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200727084621.3279-1-hogan.wang@huawei.com \
--to=hogan.wang@huawei.com \
--cc=dgilbert@redhat.com \
--cc=jusual@redhat.com \
--cc=king.wang@huawei.com \
--cc=marcel.apfelbaum@gmail.com \
--cc=mst@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=wangxinxin.wang@huawei.com \
--cc=weidong.huang@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).