[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2 1/3] xen/arm: io: Extend write/read handler to pass private data
Some handlers may require to use private data in order to get quickly information related to the region emulated. Signed-off-by: Julien Grall <julien.grall@xxxxxxxxxx> --- Cc: shameerali.kolothum.thodi@xxxxxxxxxx This will be necessary in the follow-up in order to fix bug in the GICR emulation. Changes in v2: - Use a break rather than a goto --- xen/arch/arm/io.c | 21 +++++++++++++-------- xen/arch/arm/vgic-v2.c | 8 +++++--- xen/arch/arm/vgic-v3.c | 17 +++++++++++------ xen/arch/arm/vuart.c | 11 ++++++----- xen/include/asm-arm/mmio.h | 7 ++++--- 5 files changed, 39 insertions(+), 25 deletions(-) diff --git a/xen/arch/arm/io.c b/xen/arch/arm/io.c index 8e55d49..b8f4a18 100644 --- a/xen/arch/arm/io.c +++ b/xen/arch/arm/io.c @@ -27,7 +27,7 @@ int handle_mmio(mmio_info_t *info) { struct vcpu *v = current; int i; - const struct mmio_handler *mmio_handler; + const struct mmio_handler *mmio_handler = NULL; const struct io_handler *io_handlers = &v->domain->arch.io_handlers; for ( i = 0; i < io_handlers->num_entries; i++ ) @@ -36,19 +36,23 @@ int handle_mmio(mmio_info_t *info) if ( (info->gpa >= mmio_handler->addr) && (info->gpa < (mmio_handler->addr + mmio_handler->size)) ) - { - return info->dabt.write ? - mmio_handler->mmio_handler_ops->write_handler(v, info) : - mmio_handler->mmio_handler_ops->read_handler(v, info); - } + break; } - return 0; + if ( i == io_handlers->num_entries ) + return 0; + + if ( info->dabt.write ) + return mmio_handler->mmio_handler_ops->write_handler(v, info, + mmio_handler->priv); + else + return mmio_handler->mmio_handler_ops->read_handler(v, info, + mmio_handler->priv); } void register_mmio_handler(struct domain *d, const struct mmio_handler_ops *handle, - paddr_t addr, paddr_t size) + paddr_t addr, paddr_t size, void *priv) { struct io_handler *handler = &d->arch.io_handlers; @@ -59,6 +63,7 @@ void register_mmio_handler(struct domain *d, handler->mmio_handlers[handler->num_entries].mmio_handler_ops = handle; handler->mmio_handlers[handler->num_entries].addr = addr; handler->mmio_handlers[handler->num_entries].size = size; + handler->mmio_handlers[handler->num_entries].priv = priv; dsb(ish); handler->num_entries++; diff --git a/xen/arch/arm/vgic-v2.c b/xen/arch/arm/vgic-v2.c index fa71598..8e50f22 100644 --- a/xen/arch/arm/vgic-v2.c +++ b/xen/arch/arm/vgic-v2.c @@ -50,7 +50,8 @@ void vgic_v2_setup_hw(paddr_t dbase, paddr_t cbase, paddr_t vbase) vgic_v2_hw.vbase = vbase; } -static int vgic_v2_distr_mmio_read(struct vcpu *v, mmio_info_t *info) +static int vgic_v2_distr_mmio_read(struct vcpu *v, mmio_info_t *info, + void *priv) { struct hsr_dabt dabt = info->dabt; struct cpu_user_regs *regs = guest_cpu_user_regs(); @@ -247,7 +248,8 @@ static int vgic_v2_to_sgi(struct vcpu *v, register_t sgir) return vgic_to_sgi(v, sgir, sgi_mode, virq, &target); } -static int vgic_v2_distr_mmio_write(struct vcpu *v, mmio_info_t *info) +static int vgic_v2_distr_mmio_write(struct vcpu *v, mmio_info_t *info, + void *priv) { struct hsr_dabt dabt = info->dabt; struct cpu_user_regs *regs = guest_cpu_user_regs(); @@ -590,7 +592,7 @@ static int vgic_v2_domain_init(struct domain *d) sizeof(d->arch.vgic.shared_irqs[i].v2.itargets)); register_mmio_handler(d, &vgic_v2_distr_mmio_handler, d->arch.vgic.dbase, - PAGE_SIZE); + PAGE_SIZE, NULL); return 0; } diff --git a/xen/arch/arm/vgic-v3.c b/xen/arch/arm/vgic-v3.c index f1c482d..6a4feb2 100644 --- a/xen/arch/arm/vgic-v3.c +++ b/xen/arch/arm/vgic-v3.c @@ -634,7 +634,8 @@ static inline struct vcpu *get_vcpu_from_rdist(paddr_t gpa, return d->vcpu[vcpu_id]; } -static int vgic_v3_rdistr_mmio_read(struct vcpu *v, mmio_info_t *info) +static int vgic_v3_rdistr_mmio_read(struct vcpu *v, mmio_info_t *info, + void *priv) { uint32_t offset; @@ -656,7 +657,8 @@ static int vgic_v3_rdistr_mmio_read(struct vcpu *v, mmio_info_t *info) return 0; } -static int vgic_v3_rdistr_mmio_write(struct vcpu *v, mmio_info_t *info) +static int vgic_v3_rdistr_mmio_write(struct vcpu *v, mmio_info_t *info, + void *priv) { uint32_t offset; @@ -678,7 +680,8 @@ static int vgic_v3_rdistr_mmio_write(struct vcpu *v, mmio_info_t *info) return 0; } -static int vgic_v3_distr_mmio_read(struct vcpu *v, mmio_info_t *info) +static int vgic_v3_distr_mmio_read(struct vcpu *v, mmio_info_t *info, + void *priv) { struct hsr_dabt dabt = info->dabt; struct cpu_user_regs *regs = guest_cpu_user_regs(); @@ -835,7 +838,8 @@ read_as_zero: return 1; } -static int vgic_v3_distr_mmio_write(struct vcpu *v, mmio_info_t *info) +static int vgic_v3_distr_mmio_write(struct vcpu *v, mmio_info_t *info, + void *priv) { struct hsr_dabt dabt = info->dabt; struct cpu_user_regs *regs = guest_cpu_user_regs(); @@ -1200,7 +1204,7 @@ static int vgic_v3_domain_init(struct domain *d) /* Register mmio handle for the Distributor */ register_mmio_handler(d, &vgic_distr_mmio_handler, d->arch.vgic.dbase, - SZ_64K); + SZ_64K, NULL); /* * Register mmio handler per contiguous region occupied by the @@ -1210,7 +1214,8 @@ static int vgic_v3_domain_init(struct domain *d) for ( i = 0; i < d->arch.vgic.nr_regions; i++ ) register_mmio_handler(d, &vgic_rdistr_mmio_handler, d->arch.vgic.rdist_regions[i].base, - d->arch.vgic.rdist_regions[i].size); + d->arch.vgic.rdist_regions[i].size, + NULL); d->arch.vgic.ctlr = VGICD_CTLR_DEFAULT; diff --git a/xen/arch/arm/vuart.c b/xen/arch/arm/vuart.c index d9f4249..51d0557 100644 --- a/xen/arch/arm/vuart.c +++ b/xen/arch/arm/vuart.c @@ -45,8 +45,8 @@ #define domain_has_vuart(d) ((d)->arch.vuart.info != NULL) -static int vuart_mmio_read(struct vcpu *v, mmio_info_t *info); -static int vuart_mmio_write(struct vcpu *v, mmio_info_t *info); +static int vuart_mmio_read(struct vcpu *v, mmio_info_t *info, void *priv); +static int vuart_mmio_write(struct vcpu *v, mmio_info_t *info, void *priv); static const struct mmio_handler_ops vuart_mmio_handler = { .read_handler = vuart_mmio_read, @@ -70,7 +70,8 @@ int domain_vuart_init(struct domain *d) register_mmio_handler(d, &vuart_mmio_handler, d->arch.vuart.info->base_addr, - d->arch.vuart.info->size); + d->arch.vuart.info->size, + NULL); return 0; } @@ -105,7 +106,7 @@ static void vuart_print_char(struct vcpu *v, char c) spin_unlock(&uart->lock); } -static int vuart_mmio_read(struct vcpu *v, mmio_info_t *info) +static int vuart_mmio_read(struct vcpu *v, mmio_info_t *info, void *priv) { struct domain *d = v->domain; struct hsr_dabt dabt = info->dabt; @@ -125,7 +126,7 @@ static int vuart_mmio_read(struct vcpu *v, mmio_info_t *info) return 1; } -static int vuart_mmio_write(struct vcpu *v, mmio_info_t *info) +static int vuart_mmio_write(struct vcpu *v, mmio_info_t *info, void *priv) { struct domain *d = v->domain; struct hsr_dabt dabt = info->dabt; diff --git a/xen/include/asm-arm/mmio.h b/xen/include/asm-arm/mmio.h index 0160f09..294c18b 100644 --- a/xen/include/asm-arm/mmio.h +++ b/xen/include/asm-arm/mmio.h @@ -32,8 +32,8 @@ typedef struct paddr_t gpa; } mmio_info_t; -typedef int (*mmio_read_t)(struct vcpu *v, mmio_info_t *info); -typedef int (*mmio_write_t)(struct vcpu *v, mmio_info_t *info); +typedef int (*mmio_read_t)(struct vcpu *v, mmio_info_t *info, void *priv); +typedef int (*mmio_write_t)(struct vcpu *v, mmio_info_t *info, void *priv); typedef int (*mmio_check_t)(struct vcpu *v, paddr_t addr); struct mmio_handler_ops { @@ -45,6 +45,7 @@ struct mmio_handler { paddr_t addr; paddr_t size; const struct mmio_handler_ops *mmio_handler_ops; + void *priv; }; struct io_handler { @@ -56,7 +57,7 @@ struct io_handler { extern int handle_mmio(mmio_info_t *info); void register_mmio_handler(struct domain *d, const struct mmio_handler_ops *handle, - paddr_t addr, paddr_t size); + paddr_t addr, paddr_t size, void *priv); int domain_io_init(struct domain *d); #endif /* __ASM_ARM_MMIO_H__ */ -- 2.1.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |