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)
committerMarc Zyngier <maz@kernel.org>
Sun, 19 Jan 2020 16:05:11 +0000 (16:05 +0000)
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
virt/kvm/arm/vgic/vgic-its.c

index 98c7360d9fb700703bd5f328e9e85be262ca22e3..17920d1b350a27749301f96dc5f5bb0988b0f6a4 100644 (file)
@@ -2475,7 +2475,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);