* [Qemu-devel] [PATCH RFC v3 0/2] pci: complete master abort protocol
@ 2013-09-09 11:21 Marcel Apfelbaum
2013-09-09 11:21 ` [Qemu-devel] [PATCH RFC v3 1/2] memory: allow MemoryRegion's priority field to accept negative values Marcel Apfelbaum
2013-09-09 11:21 ` [Qemu-devel] [PATCH RFC v3 2/2] hw/pci: handle unassigned pci addresses Marcel Apfelbaum
0 siblings, 2 replies; 9+ messages in thread
From: Marcel Apfelbaum @ 2013-09-09 11:21 UTC (permalink / raw)
To: qemu-devel; +Cc: peter.maydell, pbonzini, aliguori, jan.kiszka, mst
Note: The series is incomplete, for review only
PCI spec requires that a transaction that has not been claimed
by any PCI bus devices will be terminated by the initiator
with "master abort". For read transactions -1(FFFFFFFF) is returned and
writes are silently dropped.
The series deals also with the other aspect of the master abort scenario:
Upon completion the master has to raise RECEIVED MASTER ABORT BIT in
initiator's STATUS register.
Implementation:
- Allowed the MemoryRegion priority to be negative so a subregion will be
visible on all the addresses not covered by the parent MemoryRegion
or other subregions.
- Added a memory region with negative priority that extends over all the
pci address space. This region catches all the accesses
to the unassigned pci addresses.
- The MemoryRegion's ops emulates the master abort scenario.
Note:
For the moment the code assumes that all the reads/writes to
pci address space are done by the cpu.
Changes from v2:
- minor: changed nr of patches int the title
- minor: modified series list
Changes from v1:
- "pci-unassigned-mem" MemoryRegion resides now in PCIBus and not on
various Host Bridges
- "pci-unassgined-mem" does not have a ".valid.accept" field and
implements read write methods
Marcel Apfelbaum (2):
memory: allow MemoryRegion's priority field to accept negative values
hw/pci: handle unassigned pci addresses
hw/pci/pci.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
include/exec/memory.h | 6 +++---
include/hw/pci/pci_bus.h | 1 +
memory.c | 2 +-
4 files changed, 51 insertions(+), 4 deletions(-)
--
1.8.3.1
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Qemu-devel] [PATCH RFC v3 1/2] memory: allow MemoryRegion's priority field to accept negative values
2013-09-09 11:21 [Qemu-devel] [PATCH RFC v3 0/2] pci: complete master abort protocol Marcel Apfelbaum
@ 2013-09-09 11:21 ` Marcel Apfelbaum
2013-09-09 11:41 ` Michael S. Tsirkin
2013-09-09 11:21 ` [Qemu-devel] [PATCH RFC v3 2/2] hw/pci: handle unassigned pci addresses Marcel Apfelbaum
1 sibling, 1 reply; 9+ messages in thread
From: Marcel Apfelbaum @ 2013-09-09 11:21 UTC (permalink / raw)
To: qemu-devel; +Cc: peter.maydell, pbonzini, aliguori, jan.kiszka, mst
Priority is used to make visible some subregions by obscuring
the parent MemoryRegion addresses overlapping with the subregion.
By allowing the priority to be negative the opposite can be done:
Allow a subregion to be visible on all the addresses not covered
by the parent MemoryRegion or other subregions.
Signed-off-by: Marcel Apfelbaum <marcel.a@redhat.com>
---
include/exec/memory.h | 6 +++---
memory.c | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/include/exec/memory.h b/include/exec/memory.h
index ebe0d24..6995087 100644
--- a/include/exec/memory.h
+++ b/include/exec/memory.h
@@ -153,7 +153,7 @@ struct MemoryRegion {
bool flush_coalesced_mmio;
MemoryRegion *alias;
hwaddr alias_offset;
- unsigned priority;
+ int priority;
bool may_overlap;
QTAILQ_HEAD(subregions, MemoryRegion) subregions;
QTAILQ_ENTRY(MemoryRegion) subregions_link;
@@ -193,7 +193,7 @@ struct MemoryListener {
void (*coalesced_mmio_del)(MemoryListener *listener, MemoryRegionSection *section,
hwaddr addr, hwaddr len);
/* Lower = earlier (during add), later (during del) */
- unsigned priority;
+ int priority;
AddressSpace *address_space_filter;
QTAILQ_ENTRY(MemoryListener) link;
};
@@ -779,7 +779,7 @@ void memory_region_add_subregion(MemoryRegion *mr,
void memory_region_add_subregion_overlap(MemoryRegion *mr,
hwaddr offset,
MemoryRegion *subregion,
- unsigned priority);
+ int priority);
/**
* memory_region_get_ram_addr: Get the ram address associated with a memory
diff --git a/memory.c b/memory.c
index 5a10fd0..984a3dc 100644
--- a/memory.c
+++ b/memory.c
@@ -1473,7 +1473,7 @@ void memory_region_add_subregion(MemoryRegion *mr,
void memory_region_add_subregion_overlap(MemoryRegion *mr,
hwaddr offset,
MemoryRegion *subregion,
- unsigned priority)
+ int priority)
{
subregion->may_overlap = true;
subregion->priority = priority;
--
1.8.3.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [Qemu-devel] [PATCH RFC v3 2/2] hw/pci: handle unassigned pci addresses
2013-09-09 11:21 [Qemu-devel] [PATCH RFC v3 0/2] pci: complete master abort protocol Marcel Apfelbaum
2013-09-09 11:21 ` [Qemu-devel] [PATCH RFC v3 1/2] memory: allow MemoryRegion's priority field to accept negative values Marcel Apfelbaum
@ 2013-09-09 11:21 ` Marcel Apfelbaum
2013-09-14 21:08 ` Michael S. Tsirkin
1 sibling, 1 reply; 9+ messages in thread
From: Marcel Apfelbaum @ 2013-09-09 11:21 UTC (permalink / raw)
To: qemu-devel; +Cc: peter.maydell, pbonzini, aliguori, jan.kiszka, mst
Created a MemoryRegion with negative priority that
spans over all the pci address space.
It "intercepts" the accesses to unassigned pci
address space and will follow the pci spec:
1. returns -1 on read
2. does nothing on write
3. sets the RECEIVED MASTER ABORT bit in the STATUS register
of the device that initiated the transaction
Note: This implementation assumes that all the reads/writes to
the pci address space are done by the cpu.
Signed-off-by: Marcel Apfelbaum <marcel.a@redhat.com>
---
Changes from v1:
- "pci-unassigned-mem" MemoryRegion resides now in PCIBus and not on
various Host Bridges
- "pci-unassgined-mem" does not have a ".valid.accept" field and
implements read write methods
hw/pci/pci.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
include/hw/pci/pci_bus.h | 1 +
2 files changed, 47 insertions(+)
diff --git a/hw/pci/pci.c b/hw/pci/pci.c
index d00682e..b6a8026 100644
--- a/hw/pci/pci.c
+++ b/hw/pci/pci.c
@@ -283,6 +283,43 @@ const char *pci_root_bus_path(PCIDevice *dev)
return rootbus->qbus.name;
}
+static void unassigned_mem_access(PCIBus *bus)
+{
+ /* FIXME assumption: memory access to the pci address
+ * space is always initiated by the host bridge
+ * (device 0 on the bus) */
+ PCIDevice *d = bus->devices[0];
+ if (!d) {
+ return;
+ }
+
+ pci_word_test_and_set_mask(d->config + PCI_STATUS,
+ PCI_STATUS_REC_MASTER_ABORT);
+}
+
+static uint64_t unassigned_mem_read(void *opaque, hwaddr addr, unsigned size)
+{
+ PCIBus *bus = opaque;
+ unassigned_mem_access(bus);
+
+ return -1ULL;
+}
+
+static void unassigned_mem_write(void *opaque, hwaddr addr, uint64_t val,
+ unsigned size)
+{
+ PCIBus *bus = opaque;
+ unassigned_mem_access(bus);
+}
+
+static const MemoryRegionOps unassigned_mem_ops = {
+ .read = unassigned_mem_read,
+ .write = unassigned_mem_write,
+ .endianness = DEVICE_NATIVE_ENDIAN,
+};
+
+#define UNASSIGNED_MEM_PRIORITY -1
+
static void pci_bus_init(PCIBus *bus, DeviceState *parent,
const char *name,
MemoryRegion *address_space_mem,
@@ -294,6 +331,15 @@ 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->unassigned_mem, OBJECT(bus),
+ &unassigned_mem_ops, bus, "pci-unassigned",
+ memory_region_size(bus->address_space_mem));
+ memory_region_add_subregion_overlap(bus->address_space_mem,
+ bus->address_space_mem->addr,
+ &bus->unassigned_mem,
+ UNASSIGNED_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 9df1788..4cc25a3 100644
--- a/include/hw/pci/pci_bus.h
+++ b/include/hw/pci/pci_bus.h
@@ -23,6 +23,7 @@ struct PCIBus {
PCIDevice *parent_dev;
MemoryRegion *address_space_mem;
MemoryRegion *address_space_io;
+ MemoryRegion unassigned_mem;
QLIST_HEAD(, PCIBus) child; /* this will be replaced by qdev later */
QLIST_ENTRY(PCIBus) sibling;/* this will be replaced by qdev later */
--
1.8.3.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [Qemu-devel] [PATCH RFC v3 1/2] memory: allow MemoryRegion's priority field to accept negative values
2013-09-09 11:21 ` [Qemu-devel] [PATCH RFC v3 1/2] memory: allow MemoryRegion's priority field to accept negative values Marcel Apfelbaum
@ 2013-09-09 11:41 ` Michael S. Tsirkin
2013-09-09 11:45 ` Peter Maydell
0 siblings, 1 reply; 9+ messages in thread
From: Michael S. Tsirkin @ 2013-09-09 11:41 UTC (permalink / raw)
To: Marcel Apfelbaum
Cc: pbonzini, aliguori, jan.kiszka, qemu-devel, peter.maydell
On Mon, Sep 09, 2013 at 02:21:35PM +0300, Marcel Apfelbaum wrote:
> Priority is used to make visible some subregions by obscuring
> the parent MemoryRegion addresses overlapping with the subregion.
>
> By allowing the priority to be negative the opposite can be done:
> Allow a subregion to be visible on all the addresses not covered
> by the parent MemoryRegion or other subregions.
>
> Signed-off-by: Marcel Apfelbaum <marcel.a@redhat.com>
Seems harmless enough.
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
> ---
> include/exec/memory.h | 6 +++---
> memory.c | 2 +-
> 2 files changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/include/exec/memory.h b/include/exec/memory.h
> index ebe0d24..6995087 100644
> --- a/include/exec/memory.h
> +++ b/include/exec/memory.h
> @@ -153,7 +153,7 @@ struct MemoryRegion {
> bool flush_coalesced_mmio;
> MemoryRegion *alias;
> hwaddr alias_offset;
> - unsigned priority;
> + int priority;
> bool may_overlap;
> QTAILQ_HEAD(subregions, MemoryRegion) subregions;
> QTAILQ_ENTRY(MemoryRegion) subregions_link;
> @@ -193,7 +193,7 @@ struct MemoryListener {
> void (*coalesced_mmio_del)(MemoryListener *listener, MemoryRegionSection *section,
> hwaddr addr, hwaddr len);
> /* Lower = earlier (during add), later (during del) */
> - unsigned priority;
> + int priority;
> AddressSpace *address_space_filter;
> QTAILQ_ENTRY(MemoryListener) link;
> };
> @@ -779,7 +779,7 @@ void memory_region_add_subregion(MemoryRegion *mr,
> void memory_region_add_subregion_overlap(MemoryRegion *mr,
> hwaddr offset,
> MemoryRegion *subregion,
> - unsigned priority);
> + int priority);
>
> /**
> * memory_region_get_ram_addr: Get the ram address associated with a memory
> diff --git a/memory.c b/memory.c
> index 5a10fd0..984a3dc 100644
> --- a/memory.c
> +++ b/memory.c
> @@ -1473,7 +1473,7 @@ void memory_region_add_subregion(MemoryRegion *mr,
> void memory_region_add_subregion_overlap(MemoryRegion *mr,
> hwaddr offset,
> MemoryRegion *subregion,
> - unsigned priority)
> + int priority)
> {
> subregion->may_overlap = true;
> subregion->priority = priority;
> --
> 1.8.3.1
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Qemu-devel] [PATCH RFC v3 1/2] memory: allow MemoryRegion's priority field to accept negative values
2013-09-09 11:41 ` Michael S. Tsirkin
@ 2013-09-09 11:45 ` Peter Maydell
2013-09-09 11:48 ` Michael S. Tsirkin
0 siblings, 1 reply; 9+ messages in thread
From: Peter Maydell @ 2013-09-09 11:45 UTC (permalink / raw)
To: Michael S. Tsirkin
Cc: Paolo Bonzini, Anthony Liguori, Jan Kiszka, QEMU Developers,
Marcel Apfelbaum
On 9 September 2013 12:41, Michael S. Tsirkin <mst@redhat.com> wrote:
> On Mon, Sep 09, 2013 at 02:21:35PM +0300, Marcel Apfelbaum wrote:
>> Priority is used to make visible some subregions by obscuring
>> the parent MemoryRegion addresses overlapping with the subregion.
>>
>> By allowing the priority to be negative the opposite can be done:
>> Allow a subregion to be visible on all the addresses not covered
>> by the parent MemoryRegion or other subregions.
>>
>> Signed-off-by: Marcel Apfelbaum <marcel.a@redhat.com>
>
> Seems harmless enough.
>
> Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
No, the idea is good but this version is just broken.
See the comments I made on the previous version which
Marcel ignored :-(
-- PMM
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Qemu-devel] [PATCH RFC v3 1/2] memory: allow MemoryRegion's priority field to accept negative values
2013-09-09 11:45 ` Peter Maydell
@ 2013-09-09 11:48 ` Michael S. Tsirkin
2013-09-09 11:49 ` Michael S. Tsirkin
0 siblings, 1 reply; 9+ messages in thread
From: Michael S. Tsirkin @ 2013-09-09 11:48 UTC (permalink / raw)
To: Peter Maydell
Cc: Paolo Bonzini, Anthony Liguori, Jan Kiszka, QEMU Developers,
Marcel Apfelbaum
On Mon, Sep 09, 2013 at 12:45:12PM +0100, Peter Maydell wrote:
> On 9 September 2013 12:41, Michael S. Tsirkin <mst@redhat.com> wrote:
> > On Mon, Sep 09, 2013 at 02:21:35PM +0300, Marcel Apfelbaum wrote:
> >> Priority is used to make visible some subregions by obscuring
> >> the parent MemoryRegion addresses overlapping with the subregion.
> >>
> >> By allowing the priority to be negative the opposite can be done:
> >> Allow a subregion to be visible on all the addresses not covered
> >> by the parent MemoryRegion or other subregions.
> >>
> >> Signed-off-by: Marcel Apfelbaum <marcel.a@redhat.com>
> >
> > Seems harmless enough.
> >
> > Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
>
> No, the idea is good but this version is just broken.
> See the comments I made on the previous version which
> Marcel ignored :-(
>
> -- PMM
You are right, I missed the bugs.
Good catch, thanks.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Qemu-devel] [PATCH RFC v3 1/2] memory: allow MemoryRegion's priority field to accept negative values
2013-09-09 11:48 ` Michael S. Tsirkin
@ 2013-09-09 11:49 ` Michael S. Tsirkin
0 siblings, 0 replies; 9+ messages in thread
From: Michael S. Tsirkin @ 2013-09-09 11:49 UTC (permalink / raw)
To: Peter Maydell
Cc: Paolo Bonzini, Anthony Liguori, Jan Kiszka, QEMU Developers,
Marcel Apfelbaum
On Mon, Sep 09, 2013 at 02:48:55PM +0300, Michael S. Tsirkin wrote:
> On Mon, Sep 09, 2013 at 12:45:12PM +0100, Peter Maydell wrote:
> > On 9 September 2013 12:41, Michael S. Tsirkin <mst@redhat.com> wrote:
> > > On Mon, Sep 09, 2013 at 02:21:35PM +0300, Marcel Apfelbaum wrote:
> > >> Priority is used to make visible some subregions by obscuring
> > >> the parent MemoryRegion addresses overlapping with the subregion.
> > >>
> > >> By allowing the priority to be negative the opposite can be done:
> > >> Allow a subregion to be visible on all the addresses not covered
> > >> by the parent MemoryRegion or other subregions.
> > >>
> > >> Signed-off-by: Marcel Apfelbaum <marcel.a@redhat.com>
> > >
> > > Seems harmless enough.
> > >
> > > Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
> >
> > No, the idea is good but this version is just broken.
> > See the comments I made on the previous version which
> > Marcel ignored :-(
> >
> > -- PMM
>
> You are right, I missed the bugs.
> Good catch, thanks.
>
So I guess it's only an Acked-by: Michael S. Tsirkin <mst@redhat.com>
at this point :)
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Qemu-devel] [PATCH RFC v3 2/2] hw/pci: handle unassigned pci addresses
2013-09-09 11:21 ` [Qemu-devel] [PATCH RFC v3 2/2] hw/pci: handle unassigned pci addresses Marcel Apfelbaum
@ 2013-09-14 21:08 ` Michael S. Tsirkin
2013-09-15 6:35 ` Marcel Apfelbaum
0 siblings, 1 reply; 9+ messages in thread
From: Michael S. Tsirkin @ 2013-09-14 21:08 UTC (permalink / raw)
To: Marcel Apfelbaum
Cc: pbonzini, aliguori, jan.kiszka, qemu-devel, peter.maydell
On Mon, Sep 09, 2013 at 02:21:36PM +0300, Marcel Apfelbaum wrote:
> Created a MemoryRegion with negative priority that
> spans over all the pci address space.
> It "intercepts" the accesses to unassigned pci
> address space and will follow the pci spec:
> 1. returns -1 on read
> 2. does nothing on write
> 3. sets the RECEIVED MASTER ABORT bit in the STATUS register
> of the device that initiated the transaction
>
> Note: This implementation assumes that all the reads/writes to
> the pci address space are done by the cpu.
>
> Signed-off-by: Marcel Apfelbaum <marcel.a@redhat.com>
> ---
> Changes from v1:
> - "pci-unassigned-mem" MemoryRegion resides now in PCIBus and not on
> various Host Bridges
> - "pci-unassgined-mem" does not have a ".valid.accept" field and
> implements read write methods
>
> hw/pci/pci.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
> include/hw/pci/pci_bus.h | 1 +
> 2 files changed, 47 insertions(+)
>
> diff --git a/hw/pci/pci.c b/hw/pci/pci.c
> index d00682e..b6a8026 100644
> --- a/hw/pci/pci.c
> +++ b/hw/pci/pci.c
> @@ -283,6 +283,43 @@ const char *pci_root_bus_path(PCIDevice *dev)
> return rootbus->qbus.name;
> }
>
> +static void unassigned_mem_access(PCIBus *bus)
> +{
> + /* FIXME assumption: memory access to the pci address
> + * space is always initiated by the host bridge
> + * (device 0 on the bus) */
> + PCIDevice *d = bus->devices[0];
> + if (!d) {
> + return;
> + }
> +
> + pci_word_test_and_set_mask(d->config + PCI_STATUS,
> + PCI_STATUS_REC_MASTER_ABORT);
> +}
> +
> +static uint64_t unassigned_mem_read(void *opaque, hwaddr addr, unsigned size)
> +{
> + PCIBus *bus = opaque;
> + unassigned_mem_access(bus);
> +
> + return -1ULL;
> +}
> +
> +static void unassigned_mem_write(void *opaque, hwaddr addr, uint64_t val,
> + unsigned size)
> +{
> + PCIBus *bus = opaque;
> + unassigned_mem_access(bus);
> +}
> +
> +static const MemoryRegionOps unassigned_mem_ops = {
> + .read = unassigned_mem_read,
> + .write = unassigned_mem_write,
> + .endianness = DEVICE_NATIVE_ENDIAN,
> +};
> +
> +#define UNASSIGNED_MEM_PRIORITY -1
> +
This really should be "lowest available priority" correct?
So how about making it INT_MIN then?
> static void pci_bus_init(PCIBus *bus, DeviceState *parent,
> const char *name,
> MemoryRegion *address_space_mem,
> @@ -294,6 +331,15 @@ 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->unassigned_mem, OBJECT(bus),
> + &unassigned_mem_ops, bus, "pci-unassigned",
> + memory_region_size(bus->address_space_mem));
> + memory_region_add_subregion_overlap(bus->address_space_mem,
> + bus->address_space_mem->addr,
> + &bus->unassigned_mem,
> + UNASSIGNED_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 9df1788..4cc25a3 100644
> --- a/include/hw/pci/pci_bus.h
> +++ b/include/hw/pci/pci_bus.h
> @@ -23,6 +23,7 @@ struct PCIBus {
> PCIDevice *parent_dev;
> MemoryRegion *address_space_mem;
> MemoryRegion *address_space_io;
> + MemoryRegion unassigned_mem;
>
> QLIST_HEAD(, PCIBus) child; /* this will be replaced by qdev later */
> QLIST_ENTRY(PCIBus) sibling;/* this will be replaced by qdev later */
> --
> 1.8.3.1
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Qemu-devel] [PATCH RFC v3 2/2] hw/pci: handle unassigned pci addresses
2013-09-14 21:08 ` Michael S. Tsirkin
@ 2013-09-15 6:35 ` Marcel Apfelbaum
0 siblings, 0 replies; 9+ messages in thread
From: Marcel Apfelbaum @ 2013-09-15 6:35 UTC (permalink / raw)
To: Michael S. Tsirkin
Cc: pbonzini, aliguori, jan.kiszka, qemu-devel, peter.maydell
On Sun, 2013-09-15 at 00:08 +0300, Michael S. Tsirkin wrote:
> On Mon, Sep 09, 2013 at 02:21:36PM +0300, Marcel Apfelbaum wrote:
> > Created a MemoryRegion with negative priority that
> > spans over all the pci address space.
> > It "intercepts" the accesses to unassigned pci
> > address space and will follow the pci spec:
> > 1. returns -1 on read
> > 2. does nothing on write
> > 3. sets the RECEIVED MASTER ABORT bit in the STATUS register
> > of the device that initiated the transaction
> >
> > Note: This implementation assumes that all the reads/writes to
> > the pci address space are done by the cpu.
> >
> > Signed-off-by: Marcel Apfelbaum <marcel.a@redhat.com>
> > ---
> > Changes from v1:
> > - "pci-unassigned-mem" MemoryRegion resides now in PCIBus and not on
> > various Host Bridges
> > - "pci-unassgined-mem" does not have a ".valid.accept" field and
> > implements read write methods
> >
> > hw/pci/pci.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
> > include/hw/pci/pci_bus.h | 1 +
> > 2 files changed, 47 insertions(+)
> >
> > diff --git a/hw/pci/pci.c b/hw/pci/pci.c
> > index d00682e..b6a8026 100644
> > --- a/hw/pci/pci.c
> > +++ b/hw/pci/pci.c
> > @@ -283,6 +283,43 @@ const char *pci_root_bus_path(PCIDevice *dev)
> > return rootbus->qbus.name;
> > }
> >
> > +static void unassigned_mem_access(PCIBus *bus)
> > +{
> > + /* FIXME assumption: memory access to the pci address
> > + * space is always initiated by the host bridge
> > + * (device 0 on the bus) */
> > + PCIDevice *d = bus->devices[0];
> > + if (!d) {
> > + return;
> > + }
> > +
> > + pci_word_test_and_set_mask(d->config + PCI_STATUS,
> > + PCI_STATUS_REC_MASTER_ABORT);
> > +}
> > +
> > +static uint64_t unassigned_mem_read(void *opaque, hwaddr addr, unsigned size)
> > +{
> > + PCIBus *bus = opaque;
> > + unassigned_mem_access(bus);
> > +
> > + return -1ULL;
> > +}
> > +
> > +static void unassigned_mem_write(void *opaque, hwaddr addr, uint64_t val,
> > + unsigned size)
> > +{
> > + PCIBus *bus = opaque;
> > + unassigned_mem_access(bus);
> > +}
> > +
> > +static const MemoryRegionOps unassigned_mem_ops = {
> > + .read = unassigned_mem_read,
> > + .write = unassigned_mem_write,
> > + .endianness = DEVICE_NATIVE_ENDIAN,
> > +};
> > +
> > +#define UNASSIGNED_MEM_PRIORITY -1
> > +
>
> This really should be "lowest available priority" correct?
Yes, it should
>
> So how about making it INT_MIN then?
Seems right, thanks
Marcel
>
> > static void pci_bus_init(PCIBus *bus, DeviceState *parent,
> > const char *name,
> > MemoryRegion *address_space_mem,
> > @@ -294,6 +331,15 @@ 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->unassigned_mem, OBJECT(bus),
> > + &unassigned_mem_ops, bus, "pci-unassigned",
> > + memory_region_size(bus->address_space_mem));
> > + memory_region_add_subregion_overlap(bus->address_space_mem,
> > + bus->address_space_mem->addr,
> > + &bus->unassigned_mem,
> > + UNASSIGNED_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 9df1788..4cc25a3 100644
> > --- a/include/hw/pci/pci_bus.h
> > +++ b/include/hw/pci/pci_bus.h
> > @@ -23,6 +23,7 @@ struct PCIBus {
> > PCIDevice *parent_dev;
> > MemoryRegion *address_space_mem;
> > MemoryRegion *address_space_io;
> > + MemoryRegion unassigned_mem;
> >
> > QLIST_HEAD(, PCIBus) child; /* this will be replaced by qdev later */
> > QLIST_ENTRY(PCIBus) sibling;/* this will be replaced by qdev later */
> > --
> > 1.8.3.1
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2013-09-15 6:35 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-09-09 11:21 [Qemu-devel] [PATCH RFC v3 0/2] pci: complete master abort protocol Marcel Apfelbaum
2013-09-09 11:21 ` [Qemu-devel] [PATCH RFC v3 1/2] memory: allow MemoryRegion's priority field to accept negative values Marcel Apfelbaum
2013-09-09 11:41 ` Michael S. Tsirkin
2013-09-09 11:45 ` Peter Maydell
2013-09-09 11:48 ` Michael S. Tsirkin
2013-09-09 11:49 ` Michael S. Tsirkin
2013-09-09 11:21 ` [Qemu-devel] [PATCH RFC v3 2/2] hw/pci: handle unassigned pci addresses Marcel Apfelbaum
2013-09-14 21:08 ` Michael S. Tsirkin
2013-09-15 6:35 ` Marcel Apfelbaum
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).