[prev in list] [next in list] [prev in thread] [next in thread]
List: android-virt
Subject: Re: [PATCH v3 03/10] KVM: arm64: vgic-v2: Check cpu interface region is not above the VM IPA size
From: Eric Auger <eric.auger () redhat ! com>
Date: 2021-09-29 16:30:01
Message-ID: 4e4248ae-234c-20cb-6428-00a0cc7de5b9 () redhat ! com
[Download RAW message or body]
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@google.com>
> ---
> 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@redhat.com>
Eric
_______________________________________________
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic