From mboxrd@z Thu Jan 1 00:00:00 1970 From: Anthony Liguori Subject: Re: [Qemu-devel] [PATCH 09/23] memory: add backward compatibility for old portio registration Date: Mon, 25 Jul 2011 14:01:52 -0500 Message-ID: <4E2DBDA0.3050304@codemonkey.ws> References: <1311602584-23409-1-git-send-email-avi@redhat.com> <1311602584-23409-10-git-send-email-avi@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: qemu-devel@nongnu.org, kvm@vger.kernel.org To: Avi Kivity Return-path: Received: from mail-gw0-f46.google.com ([74.125.83.46]:46601 "EHLO mail-gw0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752033Ab1GYTB6 (ORCPT ); Mon, 25 Jul 2011 15:01:58 -0400 Received: by gwaa18 with SMTP id a18so2795646gwa.19 for ; Mon, 25 Jul 2011 12:01:57 -0700 (PDT) In-Reply-To: <1311602584-23409-10-git-send-email-avi@redhat.com> Sender: kvm-owner@vger.kernel.org List-ID: 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.