When switching the memory decoding bit in the command register the rest of the changes where dropped, leading to only the memory decoding bit being updated.
Fix this by unconditionally writing the guest-requested command except for the memory decoding bit, which will be updated once the p2m changes are performed. Signed-off-by: Roger Pau Monné <[email protected]> --- Cc: Andrew Cooper <[email protected]> Cc: George Dunlap <[email protected]> Cc: Ian Jackson <[email protected]> Cc: Jan Beulich <[email protected]> Cc: Julien Grall <[email protected]> Cc: Konrad Rzeszutek Wilk <[email protected]> Cc: Stefano Stabellini <[email protected]> Cc: Tim Deegan <[email protected]> Cc: Wei Liu <[email protected]> --- xen/drivers/vpci/header.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/xen/drivers/vpci/header.c b/xen/drivers/vpci/header.c index 0ec4c082a6..9234de9b26 100644 --- a/xen/drivers/vpci/header.c +++ b/xen/drivers/vpci/header.c @@ -333,8 +333,10 @@ static void cmd_write(const struct pci_dev *pdev, unsigned int reg, * hoping the guest will realize and try again. */ modify_bars(pdev, cmd & PCI_COMMAND_MEMORY, false); - else - pci_conf_write16(pdev->seg, pdev->bus, slot, func, reg, cmd); + + /* Write the new command without updating the memory decoding bit. */ + cmd = (cmd & ~PCI_COMMAND_MEMORY) | (current_cmd & PCI_COMMAND_MEMORY); + pci_conf_write16(pdev->seg, pdev->bus, slot, func, reg, cmd); } static void bar_write(const struct pci_dev *pdev, unsigned int reg, -- 2.19.0 _______________________________________________ Xen-devel mailing list [email protected] https://lists.xenproject.org/mailman/listinfo/xen-devel
