]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
KVM: arm/arm64: vgic-its: Fix restoration of unmapped collections
authorEric Auger <eric.auger@redhat.com>
Fri, 13 Dec 2019 09:42:37 +0000 (10:42 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 14 Feb 2020 21:33:26 +0000 (16:33 -0500)
commit 8c58be34494b7f1b2adb446e2d8beeb90e5de65b upstream.

Saving/restoring an unmapped collection is a valid scenario. For
example this happens if a MAPTI command was sent, featuring an
unmapped collection. At the moment the CTE fails to be restored.
Only compare against the number of online vcpus if the rdist
base is set.

Fixes: ea1ad53e1e31a ("KVM: arm64: vgic-its: Collection table save/restore")
Signed-off-by: Eric Auger <eric.auger@redhat.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
Reviewed-by: Zenghui Yu <yuzenghui@huawei.com>
Link: https://lore.kernel.org/r/20191213094237.19627-1-eric.auger@redhat.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
virt/kvm/arm/vgic/vgic-its.c

index 0dbe332eb343e3d697e57e10a9174d6f8e1c02b8..9295addea7ecf2e235e318118d4092cd83fa9dd5 100644 (file)
@@ -2292,7 +2292,8 @@ static int vgic_its_restore_cte(struct vgic_its *its, gpa_t gpa, int esz)
        target_addr = (u32)(val >> KVM_ITS_CTE_RDBASE_SHIFT);
        coll_id = val & KVM_ITS_CTE_ICID_MASK;
 
-       if (target_addr >= atomic_read(&kvm->online_vcpus))
+       if (target_addr != COLLECTION_NOT_MAPPED &&
+           target_addr >= atomic_read(&kvm->online_vcpus))
                return -EINVAL;
 
        collection = find_collection(its, coll_id);