diff options
| author | Alexey Kardashevskiy | 2014-08-13 09:20:53 +0200 |
|---|---|---|
| committer | Alexander Graf | 2014-09-08 12:50:52 +0200 |
| commit | 32420522482ffc20f8e9423af4f41f4e05ce3a56 (patch) | |
| tree | 3291a2756ec895fd4e1f919573e359cdba2d3853 | |
| parent | PPC: Cuda: Use cuda timer to expose tbfreq to guest (diff) | |
| download | qemu-32420522482ffc20f8e9423af4f41f4e05ce3a56.tar.gz qemu-32420522482ffc20f8e9423af4f41f4e05ce3a56.tar.xz qemu-32420522482ffc20f8e9423af4f41f4e05ce3a56.zip | |
spapr_pci: Fix config space corruption
When disabling MSI/MSIX via "ibm,change-msi" RTAS call, no check was made
if MSI or MSIX is actually supported and the MSI message was reset
unconditionally. If this happened on a device which does not support MSI
(but does support MSIX, otherwise "ibm,change-msi" would not be called),
this device would have PCIDevice::msi_cap field (MSI capability offset)
set to zero and writing a vector would actually clear PCI status.
This clears MSI message only if MSI or MSIX is present on a device.
Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Signed-off-by: Alexander Graf <agraf@suse.de>
| -rw-r--r-- | hw/ppc/spapr_pci.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c index 9ed39a93b7..e894f07f84 100644 --- a/hw/ppc/spapr_pci.c +++ b/hw/ppc/spapr_pci.c @@ -262,7 +262,6 @@ static void rtas_ibm_change_msi(PowerPCCPU *cpu, sPAPREnvironment *spapr, unsigned int irq, max_irqs = 0, num = 0; sPAPRPHBState *phb = NULL; PCIDevice *pdev = NULL; - bool msix = false; spapr_pci_msi *msi; int *config_addr_key; @@ -300,7 +299,12 @@ static void rtas_ibm_change_msi(PowerPCCPU *cpu, sPAPREnvironment *spapr, } xics_free(spapr->icp, msi->first_irq, msi->num); - spapr_msi_setmsg(pdev, 0, msix, 0, num); + if (msi_present(pdev)) { + spapr_msi_setmsg(pdev, 0, false, 0, num); + } + if (msix_present(pdev)) { + spapr_msi_setmsg(pdev, 0, true, 0, num); + } g_hash_table_remove(phb->msi, &config_addr); trace_spapr_pci_msi("Released MSIs", config_addr); |
