paddr_t gpa, uint32_t *offset)
{
struct vcpu *v;
- uint32_t stride = d->arch.vgic.rdist_stride;
unsigned int vcpu_id;
- vcpu_id = region->first_cpu + ((gpa - region->base) / stride);
+ vcpu_id = region->first_cpu + ((gpa - region->base) / GICV3_GICR_SIZE);
if ( unlikely(vcpu_id >= d->max_vcpus) )
return NULL;
/* Convenient alias */
struct domain *d = v->domain;
- uint32_t rdist_stride = d->arch.vgic.rdist_stride;
/*
* Find the region where the re-distributor lives. For this purpose,
/* Get the base address of the redistributor */
rdist_base = region->base;
- rdist_base += (v->vcpu_id - region->first_cpu) * rdist_stride;
+ rdist_base += (v->vcpu_id - region->first_cpu) * GICV3_GICR_SIZE;
/* Check if a valid region was found for the re-distributor */
if ( (rdist_base < region->base) ||
- ((rdist_base + rdist_stride) > (region->base + region->size)) )
+ ((rdist_base + GICV3_GICR_SIZE) > (region->base + region->size)) )
{
dprintk(XENLOG_ERR,
"d%u: Unable to find a re-distributor for VCPU %u\n",
* VGIC_V3_RDIST_LAST flags.
* Note that we are assuming max_vcpus will never change.
*/
- last_cpu = (region->size / rdist_stride) + region->first_cpu - 1;
+ last_cpu = (region->size / GICV3_GICR_SIZE) + region->first_cpu - 1;
if ( v->vcpu_id == last_cpu || (v->vcpu_id == (d->max_vcpus - 1)) )
v->arch.vgic.flags |= VGIC_V3_RDIST_LAST;
/* Set the first CPU handled by this region */
d->arch.vgic.rdist_regions[i].first_cpu = first_cpu;
- first_cpu += size / d->arch.vgic.rdist_stride;
+ first_cpu += size / GICV3_GICR_SIZE;
}
d->arch.vgic.intid_bits = vgic_v3_hw.intid_bits;
d->arch.vgic.rdist_stride = GUEST_GICV3_RDIST_STRIDE;
/* The first redistributor should contain enough space for all CPUs */
- BUILD_BUG_ON((GUEST_GICV3_GICR0_SIZE / GUEST_GICV3_RDIST_STRIDE) < MAX_VIRT_CPUS);
+ BUILD_BUG_ON((GUEST_GICV3_GICR0_SIZE / GICV3_GICR_SIZE) < 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;
#ifndef __ASM_ARM_GIC_V3_DEFS_H__
#define __ASM_ARM_GIC_V3_DEFS_H__
+#include <xen/sizes.h>
+
/*
* Additional registers defined in GIC v3.
* Common GICD registers are defined in gic.h
#define GICV3_GICD_IIDR_VAL 0x34c
#define GICV3_GICR_IIDR_VAL GICV3_GICD_IIDR_VAL
+/* Two pages for the RD_base and SGI_base register frame. */
+#define GICV3_GICR_SIZE (2 * SZ_64K)
+
#define GICR_CTLR (0x0000)
#define GICR_IIDR (0x0004)
#define GICR_TYPER (0x0008)