kvm: selftests: aarch64: use a tighter assert in vgic_poke_irq()
authorRicardo Koller <ricarkol@google.com>
Thu, 27 Jan 2022 03:08:58 +0000 (19:08 -0800)
committerMarc Zyngier <maz@kernel.org>
Tue, 8 Feb 2022 15:18:58 +0000 (15:18 +0000)
vgic_poke_irq() checks that the attr argument passed to the vgic device
ioctl is sane. Make this check tighter by moving it to after the last
attr update.

Signed-off-by: Ricardo Koller <ricarkol@google.com>
Reported-by: Reiji Watanabe <reijiw@google.com>
Cc: Andrew Jones <drjones@redhat.com>
Reviewed-by: Andrew Jones <drjones@redhat.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20220127030858.3269036-6-ricarkol@google.com
tools/testing/selftests/kvm/lib/aarch64/vgic.c

index 79864b9..f365c32 100644 (file)
@@ -138,9 +138,6 @@ static void vgic_poke_irq(int gic_fd, uint32_t intid,
        uint64_t val;
        bool intid_is_private = INTID_IS_SGI(intid) || INTID_IS_PPI(intid);
 
-       /* Check that the addr part of the attr is within 32 bits. */
-       assert(attr <= KVM_DEV_ARM_VGIC_OFFSET_MASK);
-
        uint32_t group = intid_is_private ? KVM_DEV_ARM_VGIC_GRP_REDIST_REGS
                                          : KVM_DEV_ARM_VGIC_GRP_DIST_REGS;
 
@@ -150,6 +147,9 @@ static void vgic_poke_irq(int gic_fd, uint32_t intid,
                attr += SZ_64K;
        }
 
+       /* Check that the addr part of the attr is within 32 bits. */
+       assert((attr & ~KVM_DEV_ARM_VGIC_OFFSET_MASK) == 0);
+
        /*
         * All calls will succeed, even with invalid intid's, as long as the
         * addr part of the attr is within 32 bits (checked above). An invalid