[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL v3 41/44] pci: Adjust PCI config limit based on bus t
From: |
Michael S. Tsirkin |
Subject: |
[Qemu-devel] [PULL v3 41/44] pci: Adjust PCI config limit based on bus topology |
Date: |
Thu, 20 Dec 2018 13:40:12 -0500 |
From: Alex Williamson <address@hidden>
A conventional PCI bus does not support config space accesses above
the standard 256 byte configuration space. PCIe-to-PCI bridges are
not permitted to forward transactions if the extended register address
field is non-zero and must handle it as an unsupported request (PCIe
bridge spec rev 1.0, 4.1.3, 4.1.4). Therefore, we should not support
extended config space if there is a conventional bus anywhere on the
path to a device.
Signed-off-by: Alex Williamson <address@hidden>
Reviewed-by: Marcel Apfelbaum <address@hidden>
Reviewed-by: Michael S. Tsirkin <address@hidden>
Signed-off-by: Michael S. Tsirkin <address@hidden>
---
hw/pci/pci_host.c | 26 ++++++++++++++++++++++++++
1 file changed, 26 insertions(+)
diff --git a/hw/pci/pci_host.c b/hw/pci/pci_host.c
index 5eaa935cb5..5f5345dbac 100644
--- a/hw/pci/pci_host.c
+++ b/hw/pci/pci_host.c
@@ -20,6 +20,7 @@
#include "qemu/osdep.h"
#include "hw/pci/pci.h"
+#include "hw/pci/pci_bridge.h"
#include "hw/pci/pci_host.h"
#include "hw/pci/pci_bus.h"
#include "trace.h"
@@ -50,9 +51,29 @@ static inline PCIDevice *pci_dev_find_by_addr(PCIBus *bus,
uint32_t addr)
return pci_find_device(bus, bus_num, devfn);
}
+static void pci_adjust_config_limit(PCIBus *bus, uint32_t *limit)
+{
+ if (*limit > PCI_CONFIG_SPACE_SIZE) {
+ if (!pci_bus_is_express(bus)) {
+ *limit = PCI_CONFIG_SPACE_SIZE;
+ return;
+ }
+
+ if (!pci_bus_is_root(bus)) {
+ PCIDevice *bridge = pci_bridge_get_device(bus);
+ pci_adjust_config_limit(pci_get_bus(bridge), limit);
+ }
+ }
+}
+
void pci_host_config_write_common(PCIDevice *pci_dev, uint32_t addr,
uint32_t limit, uint32_t val, uint32_t len)
{
+ pci_adjust_config_limit(pci_get_bus(pci_dev), &limit);
+ if (limit <= addr) {
+ return;
+ }
+
assert(len <= 4);
/* non-zero functions are only exposed when function 0 is present,
* allowing direct removal of unexposed functions.
@@ -71,6 +92,11 @@ uint32_t pci_host_config_read_common(PCIDevice *pci_dev,
uint32_t addr,
{
uint32_t ret;
+ pci_adjust_config_limit(pci_get_bus(pci_dev), &limit);
+ if (limit <= addr) {
+ return ~0x0;
+ }
+
assert(len <= 4);
/* non-zero functions are only exposed when function 0 is present,
* allowing direct removal of unexposed functions.
--
MST
- [Qemu-devel] [PULL v3 33/44] s390x/pci: rename hotplug handler callbacks, (continued)
- [Qemu-devel] [PULL v3 33/44] s390x/pci: rename hotplug handler callbacks, Michael S. Tsirkin, 2018/12/20
- [Qemu-devel] [PULL v3 26/44] hw: arm: Convert the RSDP build to the buid_append_foo() API, Michael S. Tsirkin, 2018/12/20
- [Qemu-devel] [PULL v3 37/44] pci/pcie: perform unplug via the hotplug handler, Michael S. Tsirkin, 2018/12/20
- [Qemu-devel] [PULL v3 36/44] pci/pcihp: perform unplug via the hotplug handler, Michael S. Tsirkin, 2018/12/20
- [Qemu-devel] [PULL v3 30/44] hw/i386: Remove deprecated machines pc-0.10 and pc-0.11, Michael S. Tsirkin, 2018/12/20
- [Qemu-devel] [PULL v3 35/44] pci/pcihp: overwrite hotplug handler recursively from the start, Michael S. Tsirkin, 2018/12/20
- [Qemu-devel] [PULL v3 34/44] pci/pcihp: perform check for bus capability in pre_plug handler, Michael S. Tsirkin, 2018/12/20
- [Qemu-devel] [PULL v3 39/44] pci/shpc: perform unplug via the hotplug handler, Michael S. Tsirkin, 2018/12/20
- [Qemu-devel] [PULL v3 40/44] spapr_pci: perform unplug via the hotplug handler, Michael S. Tsirkin, 2018/12/20
- [Qemu-devel] [PULL v3 38/44] pci: Reuse pci-bridge hotplug handler handlers for pcie-pci-bridge, Michael S. Tsirkin, 2018/12/20
- [Qemu-devel] [PULL v3 41/44] pci: Adjust PCI config limit based on bus topology,
Michael S. Tsirkin <=
- [Qemu-devel] [PULL v3 44/44] x86-iommu: turn on IR by default if proper, Michael S. Tsirkin, 2018/12/20
- [Qemu-devel] [PULL v3 43/44] x86-iommu: switch intr_supported to OnOffAuto type, Michael S. Tsirkin, 2018/12/20
- [Qemu-devel] [PULL v3 42/44] q35: set split kernel irqchip as default, Michael S. Tsirkin, 2018/12/20
- Re: [Qemu-devel] [PULL v3 00/44] pci, pc, virtio: fixes, features, Peter Maydell, 2018/12/21
- Re: [Qemu-devel] [PULL v3 00/44] pci, pc, virtio: fixes, features, no-reply, 2018/12/26