aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarcel Apfelbaum <marcel.a@redhat.com>2013-11-10 11:49:57 +0200
committerMichael S. Tsirkin <mst@redhat.com>2013-11-10 14:30:00 +0200
commit0fbf50b6ec126600dca115adb1563c657cc27695 (patch)
treeeb5729dbe3d29ad830bf1aeeca6481c4200fe565
parentfe1479aa251971abd3842dee4a783d4ebace8fb8 (diff)
downloadqemu-0fbf50b6ec126600dca115adb1563c657cc27695.tar.gz
Revert "hw/pci: partially handle pci master abort"
This reverts commit a53ae8e934cd54686875b5bcfc2f434244ee55d6. The patch being reverted introduced a low-priority memory region covering all 64 bit pci address space. This exposed the following bugs elsewhere in the code: 1. Some memory regions have INT64_MAX size, where the intent was all 64 bit address space. This results in a sub-page region, should be UINT64_MAX. 2. page table rendering in exec.c ignores physical address bits above TARGET_PHYS_ADDR_SPACE_BITS. Access outside this range (e.g. from device DMA, or gdb stub) ends up with a wrong region. Registering a region outside this range leads to page table corruption. 3. Some regions overlap PCI hole and have same priority. This only works as long as no device uses the overlapping address. It doesn't look like we can resolve all issues in time for 1.7. Let's fix the bugs first and apply afterwards for 1.8. Signed-off-by: Marcel Apfelbaum <marcel.a@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
-rw-r--r--hw/pci/pci.c26
-rw-r--r--include/hw/pci/pci_bus.h1
2 files changed, 0 insertions, 27 deletions
diff --git a/hw/pci/pci.c b/hw/pci/pci.c
index a98c8a05804..ed32059bf83 100644
--- a/hw/pci/pci.c
+++ b/hw/pci/pci.c
@@ -283,24 +283,6 @@ const char *pci_root_bus_path(PCIDevice *dev)
return rootbus->qbus.name;
}
-static uint64_t master_abort_mem_read(void *opaque, hwaddr addr, unsigned size)
-{
- return -1ULL;
-}
-
-static void master_abort_mem_write(void *opaque, hwaddr addr, uint64_t val,
- unsigned size)
-{
-}
-
-static const MemoryRegionOps master_abort_mem_ops = {
- .read = master_abort_mem_read,
- .write = master_abort_mem_write,
- .endianness = DEVICE_LITTLE_ENDIAN,
-};
-
-#define MASTER_ABORT_MEM_PRIORITY INT_MIN
-
static void pci_bus_init(PCIBus *bus, DeviceState *parent,
const char *name,
MemoryRegion *address_space_mem,
@@ -312,14 +294,6 @@ static void pci_bus_init(PCIBus *bus, DeviceState *parent,
bus->address_space_mem = address_space_mem;
bus->address_space_io = address_space_io;
-
- memory_region_init_io(&bus->master_abort_mem, OBJECT(bus),
- &master_abort_mem_ops, bus, "pci-master-abort",
- memory_region_size(bus->address_space_mem));
- memory_region_add_subregion_overlap(bus->address_space_mem,
- 0, &bus->master_abort_mem,
- MASTER_ABORT_MEM_PRIORITY);
-
/* host bridge */
QLIST_INIT(&bus->child);
diff --git a/include/hw/pci/pci_bus.h b/include/hw/pci/pci_bus.h
index 2ad5edbde9c..9df17885eca 100644
--- a/include/hw/pci/pci_bus.h
+++ b/include/hw/pci/pci_bus.h
@@ -23,7 +23,6 @@ struct PCIBus {
PCIDevice *parent_dev;
MemoryRegion *address_space_mem;
MemoryRegion *address_space_io;
- MemoryRegion master_abort_mem;
QLIST_HEAD(, PCIBus) child; /* this will be replaced by qdev later */
QLIST_ENTRY(PCIBus) sibling;/* this will be replaced by qdev later */