[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [RFC 1/4] xen/arm64: Map the redistributor region by max_vcpus of domU danamically
From: Chen Baozi <baozich@xxxxxxxxx> The number of redistributor is determined by the number of CPU interface. So we postpone redistributor mmio size initialization to the point when the max_vcpus is set. Signed-off-by: Chen Baozi <baozich@xxxxxxxxx> --- xen/arch/arm/vgic-v3.c | 24 +++++++++++++++++++----- xen/common/domctl.c | 10 ++++++++++ xen/include/asm-arm/vgic.h | 3 +++ 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/xen/arch/arm/vgic-v3.c b/xen/arch/arm/vgic-v3.c index 45d54a2..a0c1de9 100644 --- a/xen/arch/arm/vgic-v3.c +++ b/xen/arch/arm/vgic-v3.c @@ -1143,6 +1143,18 @@ static int vgic_v3_vcpu_init(struct vcpu *v) return 0; } +void vgic_v3_rdist_map(struct domain *d) +{ + /* The first redistributor should contain enough space for all CPUs */ + d->arch.vgic.rdist_regions[0].size = d->arch.vgic.rdist_stride * (d->max_vcpus); + + register_mmio_handler(d, &vgic_rdistr_mmio_handler, + d->arch.vgic.rdist_regions[0].base, + d->arch.vgic.rdist_regions[0].size); + + return; +} + static int vgic_v3_domain_init(struct domain *d) { int i, idx; @@ -1194,7 +1206,6 @@ static int vgic_v3_domain_init(struct domain *d) /* The first redistributor should contain enough space for all CPUs */ BUILD_BUG_ON((GUEST_GICV3_GICR0_SIZE / GUEST_GICV3_RDIST_STRIDE) < MAX_VIRT_CPUS); d->arch.vgic.rdist_regions[0].base = GUEST_GICV3_GICR0_BASE; - d->arch.vgic.rdist_regions[0].size = GUEST_GICV3_GICR0_SIZE; d->arch.vgic.rdist_regions[0].first_cpu = 0; } @@ -1214,10 +1225,13 @@ static int vgic_v3_domain_init(struct domain *d) * redistributors. The handler will take care to choose which * redistributor is targeted. */ - 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); + if ( is_hardware_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.ctlr = VGICD_CTLR_DEFAULT; diff --git a/xen/common/domctl.c b/xen/common/domctl.c index e571e76..43b9f79 100644 --- a/xen/common/domctl.c +++ b/xen/common/domctl.c @@ -33,6 +33,11 @@ #include <public/domctl.h> #include <xsm/xsm.h> +#ifdef CONFIG_ARM_64 +#include <asm/gic.h> +#include <asm/vgic.h> +#endif + static DEFINE_SPINLOCK(domctl_lock); DEFINE_SPINLOCK(vcpu_alloc_lock); @@ -680,6 +685,11 @@ long do_domctl(XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl) d->max_vcpus = max; } +#ifdef CONFIG_ARM_64 + if (!is_hardware_domain(d) && d->arch.vgic.version == GIC_V3) + vgic_v3_rdist_map(d); +#endif + for ( i = 0; i < max; i++ ) { if ( d->vcpu[i] != NULL ) diff --git a/xen/include/asm-arm/vgic.h b/xen/include/asm-arm/vgic.h index 6dcdf9f..4d7edc6 100644 --- a/xen/include/asm-arm/vgic.h +++ b/xen/include/asm-arm/vgic.h @@ -191,6 +191,9 @@ extern struct vgic_irq_rank *vgic_rank_irq(struct vcpu *v, unsigned int irq); extern int vgic_emulate(struct cpu_user_regs *regs, union hsr hsr); extern void vgic_disable_irqs(struct vcpu *v, uint32_t r, int n); extern void vgic_enable_irqs(struct vcpu *v, uint32_t r, int n); +#ifdef CONFIG_ARM_64 +extern void vgic_v3_rdist_map(struct domain *d); +#endif #define DEFINE_VGIC_OPS(version) \ extern const struct vgic_ops vgic_v##version##_ops; -- 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 |