mirror of https://github.com/xemu-project/xemu.git
virtio-pci: only reset pm state during resetting
Fix bug imported by27ce0f3afc
("fix Power Management Control Register for PCI Express virtio devices" After this change, observe that QEMU may erroneously clear the power status of the device, or may erroneously clear non writable registers, such as NO_SOFT_RESET, etc. Only state of PM_CTRL is writable. Only when flag VIRTIO_PCI_FLAG_INIT_PM is set, need to reset state. Fixes:27ce0f3afc
("fix Power Management Control Register for PCI Express virtio devices" Signed-off-by: Jiqian Chen <Jiqian.Chen@amd.com> Message-Id: <20240515073526.17297-2-Jiqian.Chen@amd.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@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
33abfea239
commit
84b58169e4
|
@ -2306,10 +2306,16 @@ static void virtio_pci_bus_reset_hold(Object *obj, ResetType type)
|
|||
virtio_pci_reset(qdev);
|
||||
|
||||
if (pci_is_express(dev)) {
|
||||
VirtIOPCIProxy *proxy = VIRTIO_PCI(dev);
|
||||
|
||||
pcie_cap_deverr_reset(dev);
|
||||
pcie_cap_lnkctl_reset(dev);
|
||||
|
||||
pci_set_word(dev->config + dev->exp.pm_cap + PCI_PM_CTRL, 0);
|
||||
if (proxy->flags & VIRTIO_PCI_FLAG_INIT_PM) {
|
||||
pci_word_test_and_clear_mask(
|
||||
dev->config + dev->exp.pm_cap + PCI_PM_CTRL,
|
||||
PCI_PM_CTRL_STATE_MASK);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue