[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v1 4/6] xen/arm: io: Add support for mmio background regions
On Tue, 24 Sep 2024, Edgar E. Iglesias wrote: > From: "Edgar E. Iglesias" <edgar.iglesias@xxxxxxx> > > Add support for mmio background regions. These regions > can be overlayed by IOREQ handlers and thus act as > fallback handlers while IOREQ clients haven't registered. > > Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xxxxxxx> Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx> > --- > xen/arch/arm/include/asm/mmio.h | 11 ++++++++++- > xen/arch/arm/io.c | 18 ++++++++++++------ > 2 files changed, 22 insertions(+), 7 deletions(-) > > diff --git a/xen/arch/arm/include/asm/mmio.h b/xen/arch/arm/include/asm/mmio.h > index b22cfdac5b..7da542cd79 100644 > --- a/xen/arch/arm/include/asm/mmio.h > +++ b/xen/arch/arm/include/asm/mmio.h > @@ -70,6 +70,7 @@ struct mmio_handler_ops { > struct mmio_handler { > paddr_t addr; > paddr_t size; > + bool background; > const struct mmio_handler_ops *ops; > void *priv; > }; > @@ -83,9 +84,17 @@ struct vmmio { > > enum io_state try_handle_mmio(struct cpu_user_regs *regs, > mmio_info_t *info); > +void register_mmio_bg_handler(struct domain *d, > + bool background, > + const struct mmio_handler_ops *ops, > + paddr_t addr, paddr_t size, void *priv); > +static inline > void register_mmio_handler(struct domain *d, > const struct mmio_handler_ops *ops, > - paddr_t addr, paddr_t size, void *priv); > + paddr_t addr, paddr_t size, void *priv) > +{ > + register_mmio_bg_handler(d, false, ops, addr, size, priv); > +} > int domain_io_init(struct domain *d, unsigned int max_count); > void domain_io_free(struct domain *d); > > diff --git a/xen/arch/arm/io.c b/xen/arch/arm/io.c > index 96c740d563..934a2ad2b9 100644 > --- a/xen/arch/arm/io.c > +++ b/xen/arch/arm/io.c > @@ -159,6 +159,7 @@ enum io_state try_handle_mmio(struct cpu_user_regs *regs, > { > struct vcpu *v = current; > const struct mmio_handler *handler = NULL; > + bool has_background; > int rc; > > ASSERT(info->dabt.ec == HSR_EC_DATA_ABORT_LOWER_EL); > @@ -170,13 +171,16 @@ enum io_state try_handle_mmio(struct cpu_user_regs > *regs, > } > > handler = find_mmio_handler(v->domain, info->gpa); > - if ( !handler ) > + has_background = handler && handler->background; > + if ( !handler || has_background ) > { > rc = try_fwd_ioserv(regs, v, info); > if ( rc == IO_HANDLED ) > return handle_ioserv(regs, v); > - > - return rc; > + else if ( !(rc == IO_UNHANDLED && has_background) ) { > + /* Only return failure if there's no background handler. */ > + return rc; > + } > } > > /* > @@ -197,9 +201,10 @@ enum io_state try_handle_mmio(struct cpu_user_regs *regs, > return handle_read(handler, v, info); > } > > -void register_mmio_handler(struct domain *d, > - const struct mmio_handler_ops *ops, > - paddr_t addr, paddr_t size, void *priv) > +void register_mmio_bg_handler(struct domain *d, > + bool background, > + const struct mmio_handler_ops *ops, > + paddr_t addr, paddr_t size, void *priv) > { > struct vmmio *vmmio = &d->arch.vmmio; > struct mmio_handler *handler; > @@ -213,6 +218,7 @@ void register_mmio_handler(struct domain *d, > handler->ops = ops; > handler->addr = addr; > handler->size = size; > + handler->background = background; > handler->priv = priv; > > vmmio->num_entries++; > -- > 2.43.0 >
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |