Hi Ricardo, On 9/28/21 8:47 PM, Ricardo Koller wrote: > Verify that the GICv2 CPU interface does not extend beyond the > VM-specified IPA range (phys_size). > > base + size > phys_size AND base < phys_size > > Add the missing check into kvm_vgic_addr() which is called when setting > the region. This patch also enables some superfluous checks for the > distributor (vgic_check_ioaddr was enough as alignment == size for the > distributors). > > Signed-off-by: Ricardo Koller <ricarkol@xxxxxxxxxx> > --- > arch/arm64/kvm/vgic/vgic-kvm-device.c | 7 +++++-- > 1 file changed, 5 insertions(+), 2 deletions(-) > > diff --git a/arch/arm64/kvm/vgic/vgic-kvm-device.c b/arch/arm64/kvm/vgic/vgic-kvm-device.c > index f714aded67b2..b379eb81fddb 100644 > --- a/arch/arm64/kvm/vgic/vgic-kvm-device.c > +++ b/arch/arm64/kvm/vgic/vgic-kvm-device.c > @@ -79,7 +79,7 @@ int kvm_vgic_addr(struct kvm *kvm, unsigned long type, u64 *addr, bool write) > { > int r = 0; > struct vgic_dist *vgic = &kvm->arch.vgic; > - phys_addr_t *addr_ptr, alignment; > + phys_addr_t *addr_ptr, alignment, size; > u64 undef_value = VGIC_ADDR_UNDEF; > > mutex_lock(&kvm->lock); > @@ -88,16 +88,19 @@ int kvm_vgic_addr(struct kvm *kvm, unsigned long type, u64 *addr, bool write) > r = vgic_check_type(kvm, KVM_DEV_TYPE_ARM_VGIC_V2); > addr_ptr = &vgic->vgic_dist_base; > alignment = SZ_4K; > + size = KVM_VGIC_V2_DIST_SIZE; > break; > case KVM_VGIC_V2_ADDR_TYPE_CPU: > r = vgic_check_type(kvm, KVM_DEV_TYPE_ARM_VGIC_V2); > addr_ptr = &vgic->vgic_cpu_base; > alignment = SZ_4K; > + size = KVM_VGIC_V2_CPU_SIZE; > break; > case KVM_VGIC_V3_ADDR_TYPE_DIST: > r = vgic_check_type(kvm, KVM_DEV_TYPE_ARM_VGIC_V3); > addr_ptr = &vgic->vgic_dist_base; > alignment = SZ_64K; > + size = KVM_VGIC_V3_DIST_SIZE; > break; > case KVM_VGIC_V3_ADDR_TYPE_REDIST: { > struct vgic_redist_region *rdreg; > @@ -162,7 +165,7 @@ int kvm_vgic_addr(struct kvm *kvm, unsigned long type, u64 *addr, bool write) > goto out; > > if (write) { > - r = vgic_check_ioaddr(kvm, addr_ptr, *addr, alignment); > + r = vgic_check_iorange(kvm, addr_ptr, *addr, alignment, size); > if (!r) > *addr_ptr = *addr; > } else { Looks god to me Reviewed-by: Eric Auger <eric.auger@xxxxxxxxxx> Eric