From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:34781) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QlQPf-0005jp-Cm for qemu-devel@nongnu.org; Mon, 25 Jul 2011 15:02:00 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QlQPe-0004rD-8V for qemu-devel@nongnu.org; Mon, 25 Jul 2011 15:01:59 -0400 Received: from mail-gw0-f45.google.com ([74.125.83.45]:38163) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QlQPe-0004r5-2L for qemu-devel@nongnu.org; Mon, 25 Jul 2011 15:01:58 -0400 Received: by gwb19 with SMTP id 19so3299757gwb.4 for ; Mon, 25 Jul 2011 12:01:57 -0700 (PDT) Message-ID: <4E2DBDA0.3050304@codemonkey.ws> Date: Mon, 25 Jul 2011 14:01:52 -0500 From: Anthony Liguori MIME-Version: 1.0 References: <1311602584-23409-1-git-send-email-avi@redhat.com> <1311602584-23409-10-git-send-email-avi@redhat.com> In-Reply-To: <1311602584-23409-10-git-send-email-avi@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH 09/23] memory: add backward compatibility for old portio registration List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Avi Kivity Cc: qemu-devel@nongnu.org, kvm@vger.kernel.org On 07/25/2011 09:02 AM, Avi Kivity wrote: > Signed-off-by: Avi Kivity Reviewed-by: Anthony Liguori Regards, Anthony Liguori > --- > memory.c | 32 ++++++++++++++++++++++++++++++++ > memory.h | 17 +++++++++++++++++ > 2 files changed, 49 insertions(+), 0 deletions(-) > > diff --git a/memory.c b/memory.c > index 62bd60b..bb04952 100644 > --- a/memory.c > +++ b/memory.c > @@ -211,6 +211,21 @@ static AddressSpace address_space_memory = { > .ops =&address_space_ops_memory, > }; > > +static const MemoryRegionPortio *find_portio(MemoryRegion *mr, uint64_t offset, > + unsigned width, bool write) > +{ > + const MemoryRegionPortio *mrp; > + > + for (mrp = mr->ops->old_portio; mrp->size; ++mrp) { > + if (offset>= mrp->offset&& offset< mrp->offset + mrp->len > +&& width == mrp->size > +&& (write ? (bool)mrp->write : (bool)mrp->read)) { > + return mrp; > + } > + } > + return NULL; > +} > + > static void memory_region_iorange_read(IORange *iorange, > uint64_t offset, > unsigned width, > @@ -218,6 +233,15 @@ static void memory_region_iorange_read(IORange *iorange, > { > MemoryRegion *mr = container_of(iorange, MemoryRegion, iorange); > > + if (mr->ops->old_portio) { > + const MemoryRegionPortio *mrp = find_portio(mr, offset, width, false); > + > + *data = ((uint64_t)1<< (width * 8)) - 1; > + if (mrp) { > + *data = mrp->read(mr->opaque, offset - mrp->offset); > + } > + return; > + } > *data = mr->ops->read(mr->opaque, offset, width); > } > > @@ -228,6 +252,14 @@ static void memory_region_iorange_write(IORange *iorange, > { > MemoryRegion *mr = container_of(iorange, MemoryRegion, iorange); > > + if (mr->ops->old_portio) { > + const MemoryRegionPortio *mrp = find_portio(mr, offset, width, true); > + > + if (mrp) { > + mrp->write(mr->opaque, offset - mrp->offset, data); > + } > + return; > + } > mr->ops->write(mr->opaque, offset, data, width); > } > > diff --git a/memory.h b/memory.h > index 2afbf13..f026eae 100644 > --- a/memory.h > +++ b/memory.h > @@ -10,9 +10,11 @@ > #include "targphys.h" > #include "qemu-queue.h" > #include "iorange.h" > +#include "ioport.h" > > typedef struct MemoryRegionOps MemoryRegionOps; > typedef struct MemoryRegion MemoryRegion; > +typedef struct MemoryRegionPortio MemoryRegionPortio; > > /* Must match *_DIRTY_FLAGS in cpu-all.h. To be replaced with dynamic > * registration. > @@ -65,6 +67,11 @@ struct MemoryRegionOps { > */ > bool unaligned; > } impl; > + > + /* If .read and .write are not present, old_portio may be used for > + * backwards compatibility with old portio registration > + */ > + const MemoryRegionPortio *old_portio; > }; > > typedef struct CoalescedMemoryRange CoalescedMemoryRange; > @@ -92,6 +99,16 @@ struct MemoryRegion { > uint8_t dirty_log_mask; > }; > > +struct MemoryRegionPortio { > + uint32_t offset; > + uint32_t len; > + unsigned size; > + IOPortReadFunc *read; > + IOPortWriteFunc *write; > +}; > + > +#define PORTIO_END { } > + > /* Initialize a memory region > * > * The region typically acts as a container for other memory regions.