From patchwork Tue Oct 5 01:19:11 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ricardo Koller X-Patchwork-Id: 12535211 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id AF130C433EF for ; Tue, 5 Oct 2021 01:19:27 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 981F66152B for ; Tue, 5 Oct 2021 01:19:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230298AbhJEBVQ (ORCPT ); Mon, 4 Oct 2021 21:21:16 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60038 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230109AbhJEBVP (ORCPT ); Mon, 4 Oct 2021 21:21:15 -0400 Received: from mail-pf1-x449.google.com (mail-pf1-x449.google.com [IPv6:2607:f8b0:4864:20::449]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 047CCC061745 for ; Mon, 4 Oct 2021 18:19:26 -0700 (PDT) Received: by mail-pf1-x449.google.com with SMTP id a188-20020a627fc5000000b004446be17615so10095312pfd.7 for ; Mon, 04 Oct 2021 18:19:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=IV4bAX7aZbOWgsyTP/uC/+QKOTMTTiF20MdPsNzdqGo=; b=idVd0svEOjdLh2xDcyN/pE+oF0Uh0qm8kXmVQyvpwu/Zr1F+aV0G4HLahuFubXDPvK YBNJWaov5wPWZV0MG3S0i8lK2eA+uDo0Z2ljfSXfE4LsRsWPMp9QP1IVL4V59L1u7JaN 8lTLknOPSU5MeCVpZgGTBAxPTaz0c2d3dwbp060SiOxUCciMPzLiJ+PaYI+eCG22h9oy O6mQz8u8Cak9qIhseNWK4w86SSvKUUyUMMljKEMj/m76CG4emOwaBopYu+90Gq5uKbqO dvl7PyDrL7le6ZQm99+j9PU3OrIVvx/PRo3wcTlGc7IYkD5fWhFYy1lBr8hpSR58C6Km TPLg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=IV4bAX7aZbOWgsyTP/uC/+QKOTMTTiF20MdPsNzdqGo=; b=ukWhQgN3GP4fnr3P4Gm89VlLLsBkn9okytdANn7tR98t2XMBJt3OMRjGzh2SZJYgGO FWgBh7YObFBoWRScTnggrLyImbS6e8gdEInof+DdPmbXogbCuDXG2fAvC6O2a/UaIsog afAL5dpXQB00AtR2XVUdoITFtdKJXOKm4tGFiOuxupS12dltai+w5qctBVUV/CCnJ+Bt Xg2UifhTQASCgIVpyeMNxPfQtWNW4d8jKHHxh6xbN1dBGOox1Q5817bBPce9orDuvf+q 6i1kbh59vjZ2eCfU84jqyKLJ36nHiUH8ndSFL+B61B5Z86AZBIBY7KXnDok4daqoNYz3 0uTg== X-Gm-Message-State: AOAM530ciyAKJuw5cuOXXCMaMnE+rt44K+DzOO5KzrLWoOTrTvSmGfyU gS4wLYag2iCs2IKiIPY6BlkJTMx7491DUBzrcTGLRD1NwgemftFt4xU2EsaAf+PXiVAdBPR2XAZ 8cRCTDVAZdZN8F8QYwENb1r867x4spOr9pkoq0u5yzyqn2gckCqx+SHIbQB09lOM= X-Google-Smtp-Source: ABdhPJyB26ALWNynLvgWkZeYBngyxImps90TdSrxE5EA7kXmAsk/88jmmKB1FlcqJkxP0cDf2LNG5WFeQIoMDg== X-Received: from ricarkol2.c.googlers.com ([fda3:e722:ac3:cc00:24:72f4:c0a8:62fe]) (user=ricarkol job=sendgmr) by 2002:a17:90a:7a8b:: with SMTP id q11mr369754pjf.35.1633396765327; Mon, 04 Oct 2021 18:19:25 -0700 (PDT) Date: Mon, 4 Oct 2021 18:19:11 -0700 In-Reply-To: <20211005011921.437353-1-ricarkol@google.com> Message-Id: <20211005011921.437353-2-ricarkol@google.com> Mime-Version: 1.0 References: <20211005011921.437353-1-ricarkol@google.com> X-Mailer: git-send-email 2.33.0.800.g4c38ced690-goog Subject: [PATCH v4 01/11] kvm: arm64: vgic: Introduce vgic_check_iorange From: Ricardo Koller To: kvm@vger.kernel.org, maz@kernel.org, kvmarm@lists.cs.columbia.edu, drjones@redhat.com, eric.auger@redhat.com, alexandru.elisei@arm.com Cc: Paolo Bonzini , oupton@google.com, james.morse@arm.com, suzuki.poulose@arm.com, shuah@kernel.org, jingzhangos@google.com, pshier@google.com, rananta@google.com, reijiw@google.com, Ricardo Koller Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Add the new vgic_check_iorange helper that checks that an iorange is sane: the start address and size have valid alignments, the range is within the addressable PA range, start+size doesn't overflow, and the start wasn't already defined. No functional change. Reviewed-by: Eric Auger Signed-off-by: Ricardo Koller --- arch/arm64/kvm/vgic/vgic-kvm-device.c | 22 ++++++++++++++++++++++ arch/arm64/kvm/vgic/vgic.h | 4 ++++ 2 files changed, 26 insertions(+) diff --git a/arch/arm64/kvm/vgic/vgic-kvm-device.c b/arch/arm64/kvm/vgic/vgic-kvm-device.c index 7740995de982..cc0ad227b380 100644 --- a/arch/arm64/kvm/vgic/vgic-kvm-device.c +++ b/arch/arm64/kvm/vgic/vgic-kvm-device.c @@ -29,6 +29,28 @@ int vgic_check_ioaddr(struct kvm *kvm, phys_addr_t *ioaddr, return 0; } +int vgic_check_iorange(struct kvm *kvm, phys_addr_t ioaddr, + phys_addr_t addr, phys_addr_t alignment, + phys_addr_t size) +{ + int ret; + + ret = vgic_check_ioaddr(kvm, &ioaddr, addr, alignment); + if (ret) + return ret; + + if (!IS_ALIGNED(size, alignment)) + return -EINVAL; + + if (addr + size < addr) + return -EINVAL; + + if (addr + size > kvm_phys_size(kvm)) + return -E2BIG; + + return 0; +} + static int vgic_check_type(struct kvm *kvm, int type_needed) { if (kvm->arch.vgic.vgic_model != type_needed) diff --git a/arch/arm64/kvm/vgic/vgic.h b/arch/arm64/kvm/vgic/vgic.h index 14a9218641f5..4be01c38e8f1 100644 --- a/arch/arm64/kvm/vgic/vgic.h +++ b/arch/arm64/kvm/vgic/vgic.h @@ -175,6 +175,10 @@ void vgic_irq_handle_resampling(struct vgic_irq *irq, int vgic_check_ioaddr(struct kvm *kvm, phys_addr_t *ioaddr, phys_addr_t addr, phys_addr_t alignment); +int vgic_check_iorange(struct kvm *kvm, phys_addr_t ioaddr, + phys_addr_t addr, phys_addr_t alignment, + phys_addr_t size); + void vgic_v2_fold_lr_state(struct kvm_vcpu *vcpu); void vgic_v2_populate_lr(struct kvm_vcpu *vcpu, struct vgic_irq *irq, int lr); void vgic_v2_clear_lr(struct kvm_vcpu *vcpu, int lr); From patchwork Tue Oct 5 01:19:12 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ricardo Koller X-Patchwork-Id: 12535213 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9ACE5C433EF for ; Tue, 5 Oct 2021 01:19:29 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 75FFE6152B for ; Tue, 5 Oct 2021 01:19:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230447AbhJEBVS (ORCPT ); Mon, 4 Oct 2021 21:21:18 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60050 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230087AbhJEBVR (ORCPT ); Mon, 4 Oct 2021 21:21:17 -0400 Received: from mail-pf1-x449.google.com (mail-pf1-x449.google.com [IPv6:2607:f8b0:4864:20::449]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7B718C061745 for ; Mon, 4 Oct 2021 18:19:27 -0700 (PDT) Received: by mail-pf1-x449.google.com with SMTP id t4-20020a62ea04000000b0044b333f5d1bso10063190pfh.20 for ; Mon, 04 Oct 2021 18:19:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=s3xltIzsYJNvc5KBWR9SiqSnE8fIX4FxYbfqcY5QUX0=; b=I6/r3MzMU5CFY876x0aTrbmKMG/j/+Or+zP8y0iMwj6fg+wx7+vRtBMR4dw1KGMecs z35IocNtSKNOsk1oS3cmsjDvUWYcg8e8onvzb8nA4LX9HNLuWBjwAV/q8EVjYsNvnR5l YTUrHF0r07TOWN3T0iobAIGMCA/PN8RUXhLRxQW3XczLErvUxgawV/tKuze1yAqIWR1k PXSc7igTVU/Eu4bs3AOMjO4OcR3ErJCzTt25DFyvNqAYPul/PkqZKuqPuqwGZWEBobux 8gCdhhbVjl6+YzQzHKntOkni8Msvq2vYwItGq6ks6IOeRvhyo2MH6sZWqtuR4/eyuG+2 pOwA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=s3xltIzsYJNvc5KBWR9SiqSnE8fIX4FxYbfqcY5QUX0=; b=DsdggwV88mbU8EY7j5MevaTuxl5OyVyyaEWmODP3i5NcXtE2u312F7v9lF0vse9MxS pDs88e7x0RSgssRGPrEntTng7uhXnXonhIafM2fwxQ8NNypU7nEU7PMeQ4nD7WiqjUVb pQqylJRnd40r07FAo/g3REX6QTfZFes/cANyhZJ8owjWiUFYSpGnK/xEoQs6TkXZOTPw PoMb3AKMMTxiTtrhiaP1mUvcf6z8SFctNab1NLCI7/NdYH+WvEZOkkr6HA8ZKs0pZKqU Tdhwrt33uqpx10uH0jWevYJ9fD54dEQnvgVLQN5IVqT13+rLw1JIL+AAUJBVBez7elMj /asg== X-Gm-Message-State: AOAM532TcrRW+EXcaWOWLVA3GO6LedKTfleFm/Cd1u4+1dKx2KeUBLwr eUqgWDOZBogLh20p66T7dhk36f6oiI2I2CPHkqYXPLNyhupvdqL+2uCnsAhpfbJkeCCe7BUlMsD pUmxKEtgQ5k0nE03SSQAd1Po958wNNOW3ocrCjiB9K1GWidf6XV2xLalDOd5mavs= X-Google-Smtp-Source: ABdhPJx0XFoNulJXBdAqxqOjZ6ph+wHgisGlOL9U1ysYd2LTNOvevol0FO9yBpx4Sppw6M5H7GCXXsB2v0HUHQ== X-Received: from ricarkol2.c.googlers.com ([fda3:e722:ac3:cc00:24:72f4:c0a8:62fe]) (user=ricarkol job=sendgmr) by 2002:a17:902:bd45:b0:13d:b4d1:eb39 with SMTP id b5-20020a170902bd4500b0013db4d1eb39mr2550140plx.53.1633396766782; Mon, 04 Oct 2021 18:19:26 -0700 (PDT) Date: Mon, 4 Oct 2021 18:19:12 -0700 In-Reply-To: <20211005011921.437353-1-ricarkol@google.com> Message-Id: <20211005011921.437353-3-ricarkol@google.com> Mime-Version: 1.0 References: <20211005011921.437353-1-ricarkol@google.com> X-Mailer: git-send-email 2.33.0.800.g4c38ced690-goog Subject: [PATCH v4 02/11] KVM: arm64: vgic-v3: Check redist region is not above the VM IPA size From: Ricardo Koller To: kvm@vger.kernel.org, maz@kernel.org, kvmarm@lists.cs.columbia.edu, drjones@redhat.com, eric.auger@redhat.com, alexandru.elisei@arm.com Cc: Paolo Bonzini , oupton@google.com, james.morse@arm.com, suzuki.poulose@arm.com, shuah@kernel.org, jingzhangos@google.com, pshier@google.com, rananta@google.com, reijiw@google.com, Ricardo Koller Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Verify that the redistributor regions do not extend beyond the VM-specified IPA range (phys_size). This can happen when using KVM_VGIC_V3_ADDR_TYPE_REDIST or KVM_VGIC_V3_ADDR_TYPE_REDIST_REGIONS with: base + size > phys_size AND base < phys_size Add the missing check into vgic_v3_alloc_redist_region() which is called when setting the regions, and into vgic_v3_check_base() which is called when attempting the first vcpu-run. The vcpu-run check does not apply to KVM_VGIC_V3_ADDR_TYPE_REDIST_REGIONS because the regions size is known before the first vcpu-run. Note that using the REDIST_REGIONS API results in a different check, which already exists, at first vcpu run: that the number of redist regions is enough for all vcpus. Finally, this patch also enables some extra tests in vgic_v3_alloc_redist_region() by calculating "size" early for the legacy redist api: like checking that the REDIST region can fit all the already created vcpus. Reviewed-by: Eric Auger Signed-off-by: Ricardo Koller --- arch/arm64/kvm/vgic/vgic-mmio-v3.c | 6 ++++-- arch/arm64/kvm/vgic/vgic-v3.c | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/arch/arm64/kvm/vgic/vgic-mmio-v3.c b/arch/arm64/kvm/vgic/vgic-mmio-v3.c index a09cdc0b953c..a9642fc71fdf 100644 --- a/arch/arm64/kvm/vgic/vgic-mmio-v3.c +++ b/arch/arm64/kvm/vgic/vgic-mmio-v3.c @@ -796,7 +796,9 @@ static int vgic_v3_alloc_redist_region(struct kvm *kvm, uint32_t index, struct vgic_dist *d = &kvm->arch.vgic; struct vgic_redist_region *rdreg; struct list_head *rd_regions = &d->rd_regions; - size_t size = count * KVM_VGIC_V3_REDIST_SIZE; + int nr_vcpus = atomic_read(&kvm->online_vcpus); + size_t size = count ? count * KVM_VGIC_V3_REDIST_SIZE + : nr_vcpus * KVM_VGIC_V3_REDIST_SIZE; int ret; /* cross the end of memory ? */ @@ -840,7 +842,7 @@ static int vgic_v3_alloc_redist_region(struct kvm *kvm, uint32_t index, rdreg->base = VGIC_ADDR_UNDEF; - ret = vgic_check_ioaddr(kvm, &rdreg->base, base, SZ_64K); + ret = vgic_check_iorange(kvm, rdreg->base, base, SZ_64K, size); if (ret) goto free; diff --git a/arch/arm64/kvm/vgic/vgic-v3.c b/arch/arm64/kvm/vgic/vgic-v3.c index 21a6207fb2ee..960f51a8691f 100644 --- a/arch/arm64/kvm/vgic/vgic-v3.c +++ b/arch/arm64/kvm/vgic/vgic-v3.c @@ -483,8 +483,10 @@ bool vgic_v3_check_base(struct kvm *kvm) return false; list_for_each_entry(rdreg, &d->rd_regions, list) { - if (rdreg->base + vgic_v3_rd_region_size(kvm, rdreg) < - rdreg->base) + size_t sz = vgic_v3_rd_region_size(kvm, rdreg); + + if (vgic_check_iorange(kvm, VGIC_ADDR_UNDEF, + rdreg->base, SZ_64K, sz)) return false; } From patchwork Tue Oct 5 01:19:13 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ricardo Koller X-Patchwork-Id: 12535215 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1365AC433FE for ; Tue, 5 Oct 2021 01:19:31 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id F172861507 for ; Tue, 5 Oct 2021 01:19:30 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230514AbhJEBVT (ORCPT ); Mon, 4 Oct 2021 21:21:19 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60058 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230372AbhJEBVT (ORCPT ); Mon, 4 Oct 2021 21:21:19 -0400 Received: from mail-qk1-x74a.google.com (mail-qk1-x74a.google.com [IPv6:2607:f8b0:4864:20::74a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5FB75C061749 for ; Mon, 4 Oct 2021 18:19:29 -0700 (PDT) Received: by mail-qk1-x74a.google.com with SMTP id h8-20020a05620a284800b0045ec745583cso3191815qkp.6 for ; Mon, 04 Oct 2021 18:19:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=modZ4Z9L3oEO9aqybHoesg/sa8IbbaN9vhBoj4nUzK0=; b=bgOdRvGy03wHhuqC9IIWVXjHgLq8ER1bPqdM1eoyXmXxE5CTK7haSaS4mfh/hFn9q4 FxjgPFxCEJ1rzeLtbTrxE1cTleYeu++bEADbAMjp7zprbkOOnMc9ZvfaCcxQXojsV8y1 I+aEzmFUySG1t/PpYK4H2Z99PTMG/HHRRUGzmOlIDY7oKn3c5FcGo14NVlAl/tx+kMuW 1vR3br3ecMYhOd+n2ZAa+EatFnDPUicWKaUBq5eTJGWrRU7vs05BT2Vvi0zCSC5qv29K XyHXwpoBbsC8l8mLdjuqfQyju7XswglWVz/fUv08P/x+ouQka4yadX/J/xKLLWZ5MQe1 RfCg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=modZ4Z9L3oEO9aqybHoesg/sa8IbbaN9vhBoj4nUzK0=; b=rTnREsMrUkLLluMPjf582acM7LTKi28Iu68XuixECQtn0SapviQ6Ntsvml2mWF8Fr6 zEPhIygP3depBgb53+6RBYa4/ZY9QsmS0/L65GFTQi2DlpIAWyxjy9jaUn/8u3zuQSbx LWaSp5sZU8fhK4KPZSA9rWkjNpVwSzN7Elx4LDEmYkZ52FL/jbvUpOTZLcxnBbybckKg c8UAK+8n3EYGMIvYOu/OHDSNAT3Cm89bCv1oRGwvhS+Js6wLunlx+0Ac0/9RWkNw7iM5 lz4X46VJebg1XbBx59IhxFiANSWAVcuQqVpBomMuO8Bj/P2zLqoYx9iT4bHX7K8VVGfT C/7g== X-Gm-Message-State: AOAM5333SHVg0k0WPWRIWBZm+KWox+AR8NlCKQfGeCSC+6RJXKY9Pu+L QOd1a5Z/OvG0mRFkhFPuODEME577DqAzrLJimlBXTtV2k2nPoNNeDn81NCfqZwLx1vs1fZRWWC9 cCWQq5WR7i9R4DXzNFGePwXrbtfCTkHGPDHVpu/016ZwH/JMiXTAlDxzkymR7uHA= X-Google-Smtp-Source: ABdhPJx9MR9eKbMFUs47zy96xYIn215NokaRZrbiaxTy5wQJPpw7gxng1q29efocogl6eAoijKwKJfRIvzZmlA== X-Received: from ricarkol2.c.googlers.com ([fda3:e722:ac3:cc00:24:72f4:c0a8:62fe]) (user=ricarkol job=sendgmr) by 2002:ad4:476a:: with SMTP id d10mr2875568qvx.20.1633396768417; Mon, 04 Oct 2021 18:19:28 -0700 (PDT) Date: Mon, 4 Oct 2021 18:19:13 -0700 In-Reply-To: <20211005011921.437353-1-ricarkol@google.com> Message-Id: <20211005011921.437353-4-ricarkol@google.com> Mime-Version: 1.0 References: <20211005011921.437353-1-ricarkol@google.com> X-Mailer: git-send-email 2.33.0.800.g4c38ced690-goog Subject: [PATCH v4 03/11] KVM: arm64: vgic-v2: Check cpu interface region is not above the VM IPA size From: Ricardo Koller To: kvm@vger.kernel.org, maz@kernel.org, kvmarm@lists.cs.columbia.edu, drjones@redhat.com, eric.auger@redhat.com, alexandru.elisei@arm.com Cc: Paolo Bonzini , oupton@google.com, james.morse@arm.com, suzuki.poulose@arm.com, shuah@kernel.org, jingzhangos@google.com, pshier@google.com, rananta@google.com, reijiw@google.com, Ricardo Koller Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org 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). Reviewed-by: Eric Auger Signed-off-by: Ricardo Koller --- 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 cc0ad227b380..08ae34b1a986 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 { From patchwork Tue Oct 5 01:19:14 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ricardo Koller X-Patchwork-Id: 12535217 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 89915C433FE for ; Tue, 5 Oct 2021 01:19:32 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 7167361401 for ; Tue, 5 Oct 2021 01:19:32 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230372AbhJEBVV (ORCPT ); Mon, 4 Oct 2021 21:21:21 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60068 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230516AbhJEBVU (ORCPT ); Mon, 4 Oct 2021 21:21:20 -0400 Received: from mail-yb1-xb49.google.com (mail-yb1-xb49.google.com [IPv6:2607:f8b0:4864:20::b49]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id AF236C061749 for ; Mon, 4 Oct 2021 18:19:30 -0700 (PDT) Received: by mail-yb1-xb49.google.com with SMTP id i21-20020a253b15000000b005b9c0fbba45so8852254yba.20 for ; Mon, 04 Oct 2021 18:19:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=xl+JM51DQgbfallo08wfmsOs83iQ7ZmJKM3bqS9Rg80=; b=ACyxOvGJNJ/NV7aFVA2v8u3c9Hf+IHSFlCixQBLv4NGV5jGHsoIUVkvmuoZDIa6hwF ptuGSBXeCteSoDg8JLQ5z+Hm5rgxwYGdOjgOyyG6PxyWwrbSHSz/otcscd3V4akBVAeH zDa/YosAJcnG3ZoWIX5UH501yW5u4Jq0lVTDuExVgXcOrO1sgmJ8O79J7x/wi6FPLWkZ VJDqnsN8IpppfcrVeBCk8R04m0GWyYH5qC22UxYo/iQiSs0BmXMtrXmTymovuJ5yIHf8 c70QcNdMAlNuVLLAf6zcmfOhd0nF+0YsjAsND+4WEmiqRu4FShbvseHuuAm8xa4HRqaE s2GA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=xl+JM51DQgbfallo08wfmsOs83iQ7ZmJKM3bqS9Rg80=; b=Vg0SbQArb6f+8cABn3D4AsarJrV+NVDmAoK5bgYbA3al3D1sbGpUBNf5BlSx6F0UNg oId2G5w3qxm9ZNLH3/jr9zH5DAO+OY9Wdmw7Hfg/SGFqNcQIDqs7BKPLGOfs49QaOBgs 4yHJgXIAoll2N/yuSd/ZQLL7wMbdmIZmjSaBxA4SVUrlp+Dk9Tp3OlWYBccJGsy7OAtC KqLa6EegNKt4Y7lQWxYqh3yrV5J3rLnIiUUvyEHRTKBPrER0F2UrcfVOzEzQFhinEeyr E91sttNIXqhWKUBtgLDsEZxFyQLQWnhKkbLoJ8Mn9f9keGCgZ0N6rDZokiWwnfyTz9qf r+zw== X-Gm-Message-State: AOAM530Wyti1j2xnZUJyWlUPT/SPg5P/T2/HgDiKzzuljdKfB8uiu1r1 jmWG6E8GiE4KddLsNCKUB+4GPCJRTfTWVYEJ3VuJfGb08WpQxH/cYDs4fQi080mxOGZev3VhRMa E4VnJN1Stc9ysWsVh586fSRceSL4oOjndp9Kh2mt8PmBHtt+TmxY5dpbIRA8lAzI= X-Google-Smtp-Source: ABdhPJxq8mn6fuMbbdu1h5R7+zyV5d25xOeWf4zul6b0LU+hwH25JEt9XvBSD8OaMKnqhafSgAtnacns6f3GUQ== X-Received: from ricarkol2.c.googlers.com ([fda3:e722:ac3:cc00:24:72f4:c0a8:62fe]) (user=ricarkol job=sendgmr) by 2002:a25:afcf:: with SMTP id d15mr18248796ybj.320.1633396769892; Mon, 04 Oct 2021 18:19:29 -0700 (PDT) Date: Mon, 4 Oct 2021 18:19:14 -0700 In-Reply-To: <20211005011921.437353-1-ricarkol@google.com> Message-Id: <20211005011921.437353-5-ricarkol@google.com> Mime-Version: 1.0 References: <20211005011921.437353-1-ricarkol@google.com> X-Mailer: git-send-email 2.33.0.800.g4c38ced690-goog Subject: [PATCH v4 04/11] KVM: arm64: vgic-v3: Check ITS region is not above the VM IPA size From: Ricardo Koller To: kvm@vger.kernel.org, maz@kernel.org, kvmarm@lists.cs.columbia.edu, drjones@redhat.com, eric.auger@redhat.com, alexandru.elisei@arm.com Cc: Paolo Bonzini , oupton@google.com, james.morse@arm.com, suzuki.poulose@arm.com, shuah@kernel.org, jingzhangos@google.com, pshier@google.com, rananta@google.com, reijiw@google.com, Ricardo Koller Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Verify that the ITS region does not extend beyond the VM-specified IPA range (phys_size). base + size > phys_size AND base < phys_size Add the missing check into vgic_its_set_attr() which is called when setting the region. Reviewed-by: Eric Auger Signed-off-by: Ricardo Koller --- arch/arm64/kvm/vgic/vgic-its.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/arm64/kvm/vgic/vgic-its.c b/arch/arm64/kvm/vgic/vgic-its.c index 61728c543eb9..ad55bb8cd30f 100644 --- a/arch/arm64/kvm/vgic/vgic-its.c +++ b/arch/arm64/kvm/vgic/vgic-its.c @@ -2710,8 +2710,8 @@ static int vgic_its_set_attr(struct kvm_device *dev, if (copy_from_user(&addr, uaddr, sizeof(addr))) return -EFAULT; - ret = vgic_check_ioaddr(dev->kvm, &its->vgic_its_base, - addr, SZ_64K); + ret = vgic_check_iorange(dev->kvm, its->vgic_its_base, + addr, SZ_64K, KVM_VGIC_V3_ITS_SIZE); if (ret) return ret; From patchwork Tue Oct 5 01:19:15 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ricardo Koller X-Patchwork-Id: 12535219 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 50395C433F5 for ; Tue, 5 Oct 2021 01:19:34 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 245CC61401 for ; Tue, 5 Oct 2021 01:19:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231144AbhJEBVW (ORCPT ); Mon, 4 Oct 2021 21:21:22 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60074 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230109AbhJEBVV (ORCPT ); Mon, 4 Oct 2021 21:21:21 -0400 Received: from mail-pg1-x549.google.com (mail-pg1-x549.google.com [IPv6:2607:f8b0:4864:20::549]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1E657C061745 for ; Mon, 4 Oct 2021 18:19:32 -0700 (PDT) Received: by mail-pg1-x549.google.com with SMTP id a16-20020a63d410000000b00268ebc7f4faso11558581pgh.17 for ; Mon, 04 Oct 2021 18:19:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=Lp8fppr199NgsT/j3g+xAZeLiIny0nlTRqLnRB6Lf9o=; b=r8cy36ekkCRU7CK9x39r2ehmczVM4WYvdrpVCxCMQAGmXL8lkvN+gv5F/Exoy/06Jp JeiEZCbkC4yHKPpHZuSMjruHBOEd07wX7IDbnFhQR5LJn03nXb34CcbZYsKjscKUtC+i 0/Q0JF1cimpivptb5ERCkMpjEgebxrP2Jsp3kMFn7iXl9wTn7i2MdsU5zQrZp8d8pCMH 8kK9jnMmsQKQ250QGfK4a4X5fPLWM54G7FLRxs9KamWRjBkNx2OmUdO5h63bDHBZmKcx 2YnypWDrfiIB+dDb96K3QMvLJ0/pykxn7g0tDqzvhtcRfBc7hZD1lQhWbBgAIOuTnY5P mkPw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=Lp8fppr199NgsT/j3g+xAZeLiIny0nlTRqLnRB6Lf9o=; b=VVCkBLt/FECKI7Z1XB+XIvRXLmDMYTFw3r52HHNpYxUjQWsPbCn3Y7+CnoCqNSShch bpJUgE38J4xf+PbxyTRgyh5NqbYfeT6jbGYRCYzsXJ5JdozRKjK4xERysuilEQr8pYjy Xp8Rwx8eNwswE9Doum+FRICEBEjL39n5us95L0a/m6Y4q2oKHh4AbKMoYO9Jb6j+9AxX ldzedZOWL4sFnFh86sKEakX7LOZ9LBRi1Ozirw/KNd7GR1U9jmJDQXTyFV4Cc2UeZ2+8 BlRzzfeIUStjMg5PN8y/DgVOV2MVPKPX/g3D6myEgNyjFYqFbFLMwlupQcFP97d8Tag5 HdLg== X-Gm-Message-State: AOAM530fZj5U2I+0HowMV0WPQPNP7UO0mN35L5N60f5FmE1heiqLEpwt pVDsOTad1GtHDolD5Dlr2V+s+GqT5EYvU1U10GDAJqRmHJaqi+yf14ny0S0O2JgABLQ52x15z53 mtyoK4PYs9lQQFh2X2R5PhCWMgrCHY6cSqNoHXxcEm5NnipNOudwL09fFVFbMMuQ= X-Google-Smtp-Source: ABdhPJxwdP9If/0J3kUi563HWaeI3qySO00OZJr5uPRW0Ggk3kGihGSs8tskW+HQKj1LI4MQKFwZS9DN0Mb7Mg== X-Received: from ricarkol2.c.googlers.com ([fda3:e722:ac3:cc00:24:72f4:c0a8:62fe]) (user=ricarkol job=sendgmr) by 2002:a62:9242:0:b0:446:5771:7901 with SMTP id o63-20020a629242000000b0044657717901mr27569603pfd.81.1633396771443; Mon, 04 Oct 2021 18:19:31 -0700 (PDT) Date: Mon, 4 Oct 2021 18:19:15 -0700 In-Reply-To: <20211005011921.437353-1-ricarkol@google.com> Message-Id: <20211005011921.437353-6-ricarkol@google.com> Mime-Version: 1.0 References: <20211005011921.437353-1-ricarkol@google.com> X-Mailer: git-send-email 2.33.0.800.g4c38ced690-goog Subject: [PATCH v4 05/11] KVM: arm64: vgic: Drop vgic_check_ioaddr() From: Ricardo Koller To: kvm@vger.kernel.org, maz@kernel.org, kvmarm@lists.cs.columbia.edu, drjones@redhat.com, eric.auger@redhat.com, alexandru.elisei@arm.com Cc: Paolo Bonzini , oupton@google.com, james.morse@arm.com, suzuki.poulose@arm.com, shuah@kernel.org, jingzhangos@google.com, pshier@google.com, rananta@google.com, reijiw@google.com, Ricardo Koller Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org There are no more users of vgic_check_ioaddr(). Move its checks to vgic_check_iorange() and then remove it. Signed-off-by: Ricardo Koller Reviewed-by: Eric Auger --- arch/arm64/kvm/vgic/vgic-kvm-device.c | 26 ++++---------------------- arch/arm64/kvm/vgic/vgic.h | 3 --- 2 files changed, 4 insertions(+), 25 deletions(-) diff --git a/arch/arm64/kvm/vgic/vgic-kvm-device.c b/arch/arm64/kvm/vgic/vgic-kvm-device.c index 08ae34b1a986..0d000d2fe8d2 100644 --- a/arch/arm64/kvm/vgic/vgic-kvm-device.c +++ b/arch/arm64/kvm/vgic/vgic-kvm-device.c @@ -14,38 +14,20 @@ /* common helpers */ -int vgic_check_ioaddr(struct kvm *kvm, phys_addr_t *ioaddr, - phys_addr_t addr, phys_addr_t alignment) -{ - if (addr & ~kvm_phys_mask(kvm)) - return -E2BIG; - - if (!IS_ALIGNED(addr, alignment)) - return -EINVAL; - - if (!IS_VGIC_ADDR_UNDEF(*ioaddr)) - return -EEXIST; - - return 0; -} - int vgic_check_iorange(struct kvm *kvm, phys_addr_t ioaddr, phys_addr_t addr, phys_addr_t alignment, phys_addr_t size) { - int ret; - - ret = vgic_check_ioaddr(kvm, &ioaddr, addr, alignment); - if (ret) - return ret; + if (!IS_VGIC_ADDR_UNDEF(ioaddr)) + return -EEXIST; - if (!IS_ALIGNED(size, alignment)) + if (!IS_ALIGNED(addr, alignment) || !IS_ALIGNED(size, alignment)) return -EINVAL; if (addr + size < addr) return -EINVAL; - if (addr + size > kvm_phys_size(kvm)) + if (addr & ~kvm_phys_mask(kvm) || addr + size > kvm_phys_size(kvm)) return -E2BIG; return 0; diff --git a/arch/arm64/kvm/vgic/vgic.h b/arch/arm64/kvm/vgic/vgic.h index 4be01c38e8f1..3fd6c86a7ef3 100644 --- a/arch/arm64/kvm/vgic/vgic.h +++ b/arch/arm64/kvm/vgic/vgic.h @@ -172,9 +172,6 @@ void vgic_kick_vcpus(struct kvm *kvm); void vgic_irq_handle_resampling(struct vgic_irq *irq, bool lr_deactivated, bool lr_pending); -int vgic_check_ioaddr(struct kvm *kvm, phys_addr_t *ioaddr, - phys_addr_t addr, phys_addr_t alignment); - int vgic_check_iorange(struct kvm *kvm, phys_addr_t ioaddr, phys_addr_t addr, phys_addr_t alignment, phys_addr_t size); From patchwork Tue Oct 5 01:19:16 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ricardo Koller X-Patchwork-Id: 12535221 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 40A4AC433F5 for ; Tue, 5 Oct 2021 01:19:36 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 2ACFB615A3 for ; Tue, 5 Oct 2021 01:19:36 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231214AbhJEBVY (ORCPT ); Mon, 4 Oct 2021 21:21:24 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60084 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230510AbhJEBVX (ORCPT ); Mon, 4 Oct 2021 21:21:23 -0400 Received: from mail-yb1-xb4a.google.com (mail-yb1-xb4a.google.com [IPv6:2607:f8b0:4864:20::b4a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 02DD1C061745 for ; Mon, 4 Oct 2021 18:19:34 -0700 (PDT) Received: by mail-yb1-xb4a.google.com with SMTP id d1-20020a056902060100b005b9c7c04351so8185931ybt.14 for ; Mon, 04 Oct 2021 18:19:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=9eram93ljMwsqb7jsk2L6oZKCRfve8Gk2Irw1aKvfII=; b=HbSl19hLJ4SkgqGT2gzqmgBNx+DRJUk2+wGUDBQhyLYOjU+1cUcCUnSeSLnWDES7YE fEvXFu3/aAg2ORn2L9tPbH+UGBtMZ4vcH4RdMATaj/FhyJfcJLFdEiQrDtwqtIx2D4YM Fl3USo4YN+FdqzzTNwiz6WDIm/7UqTKiilYZppa7P5tzjIDnlNdO9FgakvluDfMFEqZA Y6+FaTXQV4un2QTI7nhSaJ/7LSshR04d1JRSaatalNX5dBdghqBjCahGJU8oBhihlYqV OlSkebLUjY4+Mj8iybEm2Jkhzmjd+uwFhHEBsr6Ff6YvMSrqi3UlLtAMwTm6a060tsCk GXVA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=9eram93ljMwsqb7jsk2L6oZKCRfve8Gk2Irw1aKvfII=; b=luBUrBUV1fFqqyO2KhpWpT32ssEG2+mqybH849d6ex+lp/KnFp9GiL3i3bPQq7CTHj VrSrZcrsxMNn6rcaPs1wCtjO8xtMQ+7RUwmRDD808jZCx3If3kl+1yH+reymnBuh+ehu MRS5LPgplncyvcFMej/JLbsukix6wlz2zhLsF/qeQgH6xpnnPQTS0qw4WCMLhr11GKgz 9G/6G6VwVz9+Jzty0ydNbNoOBYvNpGZEUBaQqsuxsK3jTfbJ0f7pPLAX71hHKQBHNlkI y66ClFzUO9LkP7Z0OPGD7tACHvz4plLedxyaxX1pVOefr8SIyFqkUTq6VljLr8hpDqMf O26Q== X-Gm-Message-State: AOAM5329ZNcFvHdvGyI49wO5oBxsgeQBO7qk69avf6HOYENGB+tYii+f FWcJLRHr/njWdlPoVZBlvItm4Ek38EYUQ5h3Y5drv9S0A6EpNw3WpSOB6L31MoAvC3fqjKHUFd6 7fHqUWrhP4RHx40ZUz7l1pWC96wOVZ8EXWHi1dnutvX9qtoQywOOxrRJDQib2VTs= X-Google-Smtp-Source: ABdhPJyOwHwgjEh7E0BFPgyYUqTAnbHWWC1AI//3kHQVSLc+P8hFanOZnjiRrISF/kxYvZdmrYhYe9d+RgJYBA== X-Received: from ricarkol2.c.googlers.com ([fda3:e722:ac3:cc00:24:72f4:c0a8:62fe]) (user=ricarkol job=sendgmr) by 2002:a25:d251:: with SMTP id j78mr18340344ybg.185.1633396773123; Mon, 04 Oct 2021 18:19:33 -0700 (PDT) Date: Mon, 4 Oct 2021 18:19:16 -0700 In-Reply-To: <20211005011921.437353-1-ricarkol@google.com> Message-Id: <20211005011921.437353-7-ricarkol@google.com> Mime-Version: 1.0 References: <20211005011921.437353-1-ricarkol@google.com> X-Mailer: git-send-email 2.33.0.800.g4c38ced690-goog Subject: [PATCH v4 06/11] KVM: arm64: selftests: Make vgic_init gic version agnostic From: Ricardo Koller To: kvm@vger.kernel.org, maz@kernel.org, kvmarm@lists.cs.columbia.edu, drjones@redhat.com, eric.auger@redhat.com, alexandru.elisei@arm.com Cc: Paolo Bonzini , oupton@google.com, james.morse@arm.com, suzuki.poulose@arm.com, shuah@kernel.org, jingzhangos@google.com, pshier@google.com, rananta@google.com, reijiw@google.com, Ricardo Koller Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org As a preparation for the next commits which will add some tests for GICv2, make aarch64/vgic_init GIC version agnostic. Add a new generic run_tests function(gic_dev_type) that starts all applicable tests using GICv3 or GICv2. GICv2 tests are attempted if GICv3 is not available in the system. There are currently no GICv2 tests, but the test passes now in GICv2 systems. Reviewed-by: Eric Auger Signed-off-by: Ricardo Koller Reviewed-by: Andrew Jones --- .../testing/selftests/kvm/aarch64/vgic_init.c | 156 +++++++++++------- 1 file changed, 95 insertions(+), 61 deletions(-) diff --git a/tools/testing/selftests/kvm/aarch64/vgic_init.c b/tools/testing/selftests/kvm/aarch64/vgic_init.c index 623f31a14326..896a29f2503d 100644 --- a/tools/testing/selftests/kvm/aarch64/vgic_init.c +++ b/tools/testing/selftests/kvm/aarch64/vgic_init.c @@ -22,6 +22,9 @@ #define GICR_TYPER 0x8 +#define VGIC_DEV_IS_V2(_d) ((_d) == KVM_DEV_TYPE_ARM_VGIC_V2) +#define VGIC_DEV_IS_V3(_d) ((_d) == KVM_DEV_TYPE_ARM_VGIC_V3) + struct vm_gic { struct kvm_vm *vm; int gic_fd; @@ -30,8 +33,8 @@ struct vm_gic { static int max_ipa_bits; /* helper to access a redistributor register */ -static int access_redist_reg(int gicv3_fd, int vcpu, int offset, - uint32_t *val, bool write) +static int access_v3_redist_reg(int gicv3_fd, int vcpu, int offset, + uint32_t *val, bool write) { uint64_t attr = REG_OFFSET(vcpu, offset); @@ -58,7 +61,7 @@ static int run_vcpu(struct kvm_vm *vm, uint32_t vcpuid) return 0; } -static struct vm_gic vm_gic_create(void) +static struct vm_gic vm_gic_v3_create(void) { struct vm_gic v; @@ -80,7 +83,7 @@ static void vm_gic_destroy(struct vm_gic *v) * device gets created, a legacy RDIST region is set at @0x0 * and a DIST region is set @0x60000 */ -static void subtest_dist_rdist(struct vm_gic *v) +static void subtest_v3_dist_rdist(struct vm_gic *v) { int ret; uint64_t addr; @@ -145,7 +148,7 @@ static void subtest_dist_rdist(struct vm_gic *v) } /* Test the new REDIST region API */ -static void subtest_redist_regions(struct vm_gic *v) +static void subtest_v3_redist_regions(struct vm_gic *v) { uint64_t addr, expected_addr; int ret; @@ -249,7 +252,7 @@ static void subtest_redist_regions(struct vm_gic *v) * VGIC KVM device is created and initialized before the secondary CPUs * get created */ -static void test_vgic_then_vcpus(void) +static void test_v3_vgic_then_vcpus(uint32_t gic_dev_type) { struct vm_gic v; int ret, i; @@ -257,7 +260,7 @@ static void test_vgic_then_vcpus(void) v.vm = vm_create_default(0, 0, guest_code); v.gic_fd = kvm_create_device(v.vm, KVM_DEV_TYPE_ARM_VGIC_V3, false); - subtest_dist_rdist(&v); + subtest_v3_dist_rdist(&v); /* Add the rest of the VCPUs */ for (i = 1; i < NR_VCPUS; ++i) @@ -270,14 +273,14 @@ static void test_vgic_then_vcpus(void) } /* All the VCPUs are created before the VGIC KVM device gets initialized */ -static void test_vcpus_then_vgic(void) +static void test_v3_vcpus_then_vgic(uint32_t gic_dev_type) { struct vm_gic v; int ret; - v = vm_gic_create(); + v = vm_gic_v3_create(); - subtest_dist_rdist(&v); + subtest_v3_dist_rdist(&v); ret = run_vcpu(v.vm, 3); TEST_ASSERT(ret == -EINVAL, "dist/rdist overlap detected on 1st vcpu run"); @@ -285,15 +288,15 @@ static void test_vcpus_then_vgic(void) vm_gic_destroy(&v); } -static void test_new_redist_regions(void) +static void test_v3_new_redist_regions(void) { void *dummy = NULL; struct vm_gic v; uint64_t addr; int ret; - v = vm_gic_create(); - subtest_redist_regions(&v); + v = vm_gic_v3_create(); + subtest_v3_redist_regions(&v); kvm_device_access(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_CTRL, KVM_DEV_ARM_VGIC_CTRL_INIT, NULL, true); @@ -303,8 +306,8 @@ static void test_new_redist_regions(void) /* step2 */ - v = vm_gic_create(); - subtest_redist_regions(&v); + v = vm_gic_v3_create(); + subtest_v3_redist_regions(&v); addr = REDIST_REGION_ATTR_ADDR(1, 0x280000, 0, 2); kvm_device_access(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, @@ -317,8 +320,8 @@ static void test_new_redist_regions(void) /* step 3 */ - v = vm_gic_create(); - subtest_redist_regions(&v); + v = vm_gic_v3_create(); + subtest_v3_redist_regions(&v); _kvm_device_access(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, dummy, true); @@ -338,7 +341,7 @@ static void test_new_redist_regions(void) vm_gic_destroy(&v); } -static void test_typer_accesses(void) +static void test_v3_typer_accesses(void) { struct vm_gic v; uint64_t addr; @@ -351,12 +354,12 @@ static void test_typer_accesses(void) vm_vcpu_add_default(v.vm, 3, guest_code); - ret = access_redist_reg(v.gic_fd, 1, GICR_TYPER, &val, false); + ret = access_v3_redist_reg(v.gic_fd, 1, GICR_TYPER, &val, false); TEST_ASSERT(ret && errno == EINVAL, "attempting to read GICR_TYPER of non created vcpu"); vm_vcpu_add_default(v.vm, 1, guest_code); - ret = access_redist_reg(v.gic_fd, 1, GICR_TYPER, &val, false); + ret = access_v3_redist_reg(v.gic_fd, 1, GICR_TYPER, &val, false); TEST_ASSERT(ret && errno == EBUSY, "read GICR_TYPER before GIC initialized"); vm_vcpu_add_default(v.vm, 2, guest_code); @@ -365,7 +368,7 @@ static void test_typer_accesses(void) KVM_DEV_ARM_VGIC_CTRL_INIT, NULL, true); for (i = 0; i < NR_VCPUS ; i++) { - ret = access_redist_reg(v.gic_fd, 0, GICR_TYPER, &val, false); + ret = access_v3_redist_reg(v.gic_fd, 0, GICR_TYPER, &val, false); TEST_ASSERT(!ret && !val, "read GICR_TYPER before rdist region setting"); } @@ -374,10 +377,10 @@ static void test_typer_accesses(void) KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr, true); /* The 2 first rdists should be put there (vcpu 0 and 3) */ - ret = access_redist_reg(v.gic_fd, 0, GICR_TYPER, &val, false); + ret = access_v3_redist_reg(v.gic_fd, 0, GICR_TYPER, &val, false); TEST_ASSERT(!ret && !val, "read typer of rdist #0"); - ret = access_redist_reg(v.gic_fd, 3, GICR_TYPER, &val, false); + ret = access_v3_redist_reg(v.gic_fd, 3, GICR_TYPER, &val, false); TEST_ASSERT(!ret && val == 0x310, "read typer of rdist #1"); addr = REDIST_REGION_ATTR_ADDR(10, 0x100000, 0, 1); @@ -385,11 +388,11 @@ static void test_typer_accesses(void) KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr, true); TEST_ASSERT(ret && errno == EINVAL, "collision with previous rdist region"); - ret = access_redist_reg(v.gic_fd, 1, GICR_TYPER, &val, false); + ret = access_v3_redist_reg(v.gic_fd, 1, GICR_TYPER, &val, false); TEST_ASSERT(!ret && val == 0x100, "no redist region attached to vcpu #1 yet, last cannot be returned"); - ret = access_redist_reg(v.gic_fd, 2, GICR_TYPER, &val, false); + ret = access_v3_redist_reg(v.gic_fd, 2, GICR_TYPER, &val, false); TEST_ASSERT(!ret && val == 0x200, "no redist region attached to vcpu #2, last cannot be returned"); @@ -397,10 +400,10 @@ static void test_typer_accesses(void) kvm_device_access(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr, true); - ret = access_redist_reg(v.gic_fd, 1, GICR_TYPER, &val, false); + ret = access_v3_redist_reg(v.gic_fd, 1, GICR_TYPER, &val, false); TEST_ASSERT(!ret && val == 0x100, "read typer of rdist #1"); - ret = access_redist_reg(v.gic_fd, 2, GICR_TYPER, &val, false); + ret = access_v3_redist_reg(v.gic_fd, 2, GICR_TYPER, &val, false); TEST_ASSERT(!ret && val == 0x210, "read typer of rdist #1, last properly returned"); @@ -417,7 +420,7 @@ static void test_typer_accesses(void) * rdist region #2 @0x200000 2 rdist capacity * rdists: 1, 2 */ -static void test_last_bit_redist_regions(void) +static void test_v3_last_bit_redist_regions(void) { uint32_t vcpuids[] = { 0, 3, 5, 4, 1, 2 }; struct vm_gic v; @@ -444,29 +447,29 @@ static void test_last_bit_redist_regions(void) kvm_device_access(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr, true); - ret = access_redist_reg(v.gic_fd, 0, GICR_TYPER, &val, false); + ret = access_v3_redist_reg(v.gic_fd, 0, GICR_TYPER, &val, false); TEST_ASSERT(!ret && val == 0x000, "read typer of rdist #0"); - ret = access_redist_reg(v.gic_fd, 1, GICR_TYPER, &val, false); + ret = access_v3_redist_reg(v.gic_fd, 1, GICR_TYPER, &val, false); TEST_ASSERT(!ret && val == 0x100, "read typer of rdist #1"); - ret = access_redist_reg(v.gic_fd, 2, GICR_TYPER, &val, false); + ret = access_v3_redist_reg(v.gic_fd, 2, GICR_TYPER, &val, false); TEST_ASSERT(!ret && val == 0x200, "read typer of rdist #2"); - ret = access_redist_reg(v.gic_fd, 3, GICR_TYPER, &val, false); + ret = access_v3_redist_reg(v.gic_fd, 3, GICR_TYPER, &val, false); TEST_ASSERT(!ret && val == 0x310, "read typer of rdist #3"); - ret = access_redist_reg(v.gic_fd, 5, GICR_TYPER, &val, false); + ret = access_v3_redist_reg(v.gic_fd, 5, GICR_TYPER, &val, false); TEST_ASSERT(!ret && val == 0x500, "read typer of rdist #5"); - ret = access_redist_reg(v.gic_fd, 4, GICR_TYPER, &val, false); + ret = access_v3_redist_reg(v.gic_fd, 4, GICR_TYPER, &val, false); TEST_ASSERT(!ret && val == 0x410, "read typer of rdist #4"); vm_gic_destroy(&v); } /* Test last bit with legacy region */ -static void test_last_bit_single_rdist(void) +static void test_v3_last_bit_single_rdist(void) { uint32_t vcpuids[] = { 0, 3, 5, 4, 1, 2 }; struct vm_gic v; @@ -485,28 +488,32 @@ static void test_last_bit_single_rdist(void) kvm_device_access(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, KVM_VGIC_V3_ADDR_TYPE_REDIST, &addr, true); - ret = access_redist_reg(v.gic_fd, 0, GICR_TYPER, &val, false); + ret = access_v3_redist_reg(v.gic_fd, 0, GICR_TYPER, &val, false); TEST_ASSERT(!ret && val == 0x000, "read typer of rdist #0"); - ret = access_redist_reg(v.gic_fd, 3, GICR_TYPER, &val, false); + ret = access_v3_redist_reg(v.gic_fd, 3, GICR_TYPER, &val, false); TEST_ASSERT(!ret && val == 0x300, "read typer of rdist #1"); - ret = access_redist_reg(v.gic_fd, 5, GICR_TYPER, &val, false); + ret = access_v3_redist_reg(v.gic_fd, 5, GICR_TYPER, &val, false); TEST_ASSERT(!ret && val == 0x500, "read typer of rdist #2"); - ret = access_redist_reg(v.gic_fd, 1, GICR_TYPER, &val, false); + ret = access_v3_redist_reg(v.gic_fd, 1, GICR_TYPER, &val, false); TEST_ASSERT(!ret && val == 0x100, "read typer of rdist #3"); - ret = access_redist_reg(v.gic_fd, 2, GICR_TYPER, &val, false); + ret = access_v3_redist_reg(v.gic_fd, 2, GICR_TYPER, &val, false); TEST_ASSERT(!ret && val == 0x210, "read typer of rdist #3"); vm_gic_destroy(&v); } -void test_kvm_device(void) +/* + * Returns 0 if it's possible to create GIC device of a given type (V2 or V3). + */ +int test_kvm_device(uint32_t gic_dev_type) { struct vm_gic v; int ret, fd; + uint32_t other; v.vm = vm_create_default_with_vcpus(NR_VCPUS, 0, 0, guest_code, NULL); @@ -514,38 +521,65 @@ void test_kvm_device(void) ret = _kvm_create_device(v.vm, 0, true, &fd); TEST_ASSERT(ret && errno == ENODEV, "unsupported device"); - /* trial mode with VGIC_V3 device */ - ret = _kvm_create_device(v.vm, KVM_DEV_TYPE_ARM_VGIC_V3, true, &fd); - if (ret) { - print_skip("GICv3 not supported"); - exit(KSFT_SKIP); - } - v.gic_fd = kvm_create_device(v.vm, KVM_DEV_TYPE_ARM_VGIC_V3, false); + /* trial mode */ + ret = _kvm_create_device(v.vm, gic_dev_type, true, &fd); + if (ret) + return ret; + v.gic_fd = kvm_create_device(v.vm, gic_dev_type, false); + + ret = _kvm_create_device(v.vm, gic_dev_type, false, &fd); + TEST_ASSERT(ret && errno == EEXIST, "create GIC device twice"); - ret = _kvm_create_device(v.vm, KVM_DEV_TYPE_ARM_VGIC_V3, false, &fd); - TEST_ASSERT(ret && errno == EEXIST, "create GICv3 device twice"); + kvm_create_device(v.vm, gic_dev_type, true); - kvm_create_device(v.vm, KVM_DEV_TYPE_ARM_VGIC_V3, true); + /* try to create the other gic_dev_type */ + other = VGIC_DEV_IS_V2(gic_dev_type) ? KVM_DEV_TYPE_ARM_VGIC_V3 + : KVM_DEV_TYPE_ARM_VGIC_V2; - if (!_kvm_create_device(v.vm, KVM_DEV_TYPE_ARM_VGIC_V2, true, &fd)) { - ret = _kvm_create_device(v.vm, KVM_DEV_TYPE_ARM_VGIC_V2, false, &fd); - TEST_ASSERT(ret && errno == EINVAL, "create GICv2 while v3 exists"); + if (!_kvm_create_device(v.vm, other, true, &fd)) { + ret = _kvm_create_device(v.vm, other, false, &fd); + TEST_ASSERT(ret && errno == EINVAL, + "create GIC device while other version exists"); } vm_gic_destroy(&v); + + return 0; +} + +void run_tests(uint32_t gic_dev_type) +{ + if (VGIC_DEV_IS_V3(gic_dev_type)) { + test_v3_vcpus_then_vgic(gic_dev_type); + test_v3_vgic_then_vcpus(gic_dev_type); + test_v3_new_redist_regions(); + test_v3_typer_accesses(); + test_v3_last_bit_redist_regions(); + test_v3_last_bit_single_rdist(); + } } int main(int ac, char **av) { + int ret; + max_ipa_bits = kvm_check_cap(KVM_CAP_ARM_VM_IPA_SIZE); - test_kvm_device(); - test_vcpus_then_vgic(); - test_vgic_then_vcpus(); - test_new_redist_regions(); - test_typer_accesses(); - test_last_bit_redist_regions(); - test_last_bit_single_rdist(); + ret = test_kvm_device(KVM_DEV_TYPE_ARM_VGIC_V3); + if (!ret) { + pr_info("Running GIC_v3 tests.\n"); + run_tests(KVM_DEV_TYPE_ARM_VGIC_V3); + return 0; + } + + ret = test_kvm_device(KVM_DEV_TYPE_ARM_VGIC_V2); + if (!ret) { + pr_info("Running GIC_v2 tests.\n"); + run_tests(KVM_DEV_TYPE_ARM_VGIC_V2); + return 0; + } + print_skip("No GICv2 nor GICv3 support"); + exit(KSFT_SKIP); return 0; } From patchwork Tue Oct 5 01:19:17 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ricardo Koller X-Patchwork-Id: 12535223 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 46627C433FE for ; Tue, 5 Oct 2021 01:19:37 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 3419561401 for ; Tue, 5 Oct 2021 01:19:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231137AbhJEBV0 (ORCPT ); Mon, 4 Oct 2021 21:21:26 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60098 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230510AbhJEBVZ (ORCPT ); Mon, 4 Oct 2021 21:21:25 -0400 Received: from mail-qt1-x84a.google.com (mail-qt1-x84a.google.com [IPv6:2607:f8b0:4864:20::84a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 965C1C061745 for ; Mon, 4 Oct 2021 18:19:35 -0700 (PDT) Received: by mail-qt1-x84a.google.com with SMTP id h10-20020ac8584a000000b002a712bc435fso14172756qth.20 for ; Mon, 04 Oct 2021 18:19:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=rCtk0QZvGtJNNX968ZJI39G337e0fJGVp+XxoDUDdkE=; b=SXQnZ9JXeCK/1KvyKnaXPDby0VXKeDZEHG83sFNEnLHoS6OcJX0esOtEx5UMCaWA3J zem2hpT8tL7nMrmUE/AHs/Ca7QgecZZMCnQQM14JF8pvPu/A2gzcZpEUYXp1KTIFnFrB +KSWoCZHwa1ncWJ4jU9hGJFAXRg+hrXPJmAh5F9TwV2YCJiGgtFfqYpLav8FQQvNjgOW v4GkOJ2G48Iz8fIQHrzjM6TGFdZtUMX2bTzWzZih+UfpYlxcZDPKE5o7cyu/Z2gOfVnV /JvM8dLQzXMoCoqCg38MR2rOTpe+3CWa4yc7GCKWtTYQ5himxyksTSdxZnaGFjkjtgla oWlQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=rCtk0QZvGtJNNX968ZJI39G337e0fJGVp+XxoDUDdkE=; b=VPCqjl++inwi1ujZabdT144f745V0+wXUmTSKeQgBd2Wdlg+R53ZhrpNG2piZDS0Ck E7aK7EPsIkG/DVTqWVJaOOAe4xPYh8vIRF5IwYiZ7Mv48ep9YuWosSuRoG8qCTlufuRu +Cfhy41E6KTvXvn0bdomoG203qVHT1vjVxSzDQS/r8Lie0W7KAPeNSM2GWM12JNoDl/i luJkGNQPY3FmOG7Wx8cmA2yUXKEdRZoGMopGCkEYrpphP3yP7/XYGf5kAjd1mRmuCSzz V4O6s9zgXp+NIK91fLAB/SNjk4KOPsvxDvKUarJXK99h/YqIeOENLG+RgdKjfSp32SDZ Ljiw== X-Gm-Message-State: AOAM5339Lql8/cOcmScXhKaM4dopzCQWSHTqFRpnM/zDzPUwlbLaR43P dvS6RFX59uNYvpXTB0CfOHt3QUMcqmLfHxIxT8hyoXlq5izhw0Avk60HBVrXfYBRbpkh3UaVNv6 olVADiCRwgoZeejwWlgwmLx6bFiXKtQQSg/bU4PYwxKqpdbc7bI75K0AHsFn0c3U= X-Google-Smtp-Source: ABdhPJyCZCbvLGaSOMLBNe3BbAg0ASeNDo4wRQXjlyaPDuVIvUAXFBLjEBfIfBt3sWnzogbCLGnR6iAx5B0baQ== X-Received: from ricarkol2.c.googlers.com ([fda3:e722:ac3:cc00:24:72f4:c0a8:62fe]) (user=ricarkol job=sendgmr) by 2002:a05:6214:528:: with SMTP id x8mr24810755qvw.30.1633396774726; Mon, 04 Oct 2021 18:19:34 -0700 (PDT) Date: Mon, 4 Oct 2021 18:19:17 -0700 In-Reply-To: <20211005011921.437353-1-ricarkol@google.com> Message-Id: <20211005011921.437353-8-ricarkol@google.com> Mime-Version: 1.0 References: <20211005011921.437353-1-ricarkol@google.com> X-Mailer: git-send-email 2.33.0.800.g4c38ced690-goog Subject: [PATCH v4 07/11] KVM: arm64: selftests: Make vgic_init/vm_gic_create version agnostic From: Ricardo Koller To: kvm@vger.kernel.org, maz@kernel.org, kvmarm@lists.cs.columbia.edu, drjones@redhat.com, eric.auger@redhat.com, alexandru.elisei@arm.com Cc: Paolo Bonzini , oupton@google.com, james.morse@arm.com, suzuki.poulose@arm.com, shuah@kernel.org, jingzhangos@google.com, pshier@google.com, rananta@google.com, reijiw@google.com, Ricardo Koller Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Make vm_gic_create GIC version agnostic in the vgic_init test. Also add a nr_vcpus arg into it instead of defaulting to NR_VCPUS. No functional change. Reviewed-by: Eric Auger Signed-off-by: Ricardo Koller Reviewed-by: Andrew Jones --- .../testing/selftests/kvm/aarch64/vgic_init.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/tools/testing/selftests/kvm/aarch64/vgic_init.c b/tools/testing/selftests/kvm/aarch64/vgic_init.c index 896a29f2503d..7521dc80cf23 100644 --- a/tools/testing/selftests/kvm/aarch64/vgic_init.c +++ b/tools/testing/selftests/kvm/aarch64/vgic_init.c @@ -28,6 +28,7 @@ struct vm_gic { struct kvm_vm *vm; int gic_fd; + uint32_t gic_dev_type; }; static int max_ipa_bits; @@ -61,12 +62,13 @@ static int run_vcpu(struct kvm_vm *vm, uint32_t vcpuid) return 0; } -static struct vm_gic vm_gic_v3_create(void) +static struct vm_gic vm_gic_create_with_vcpus(uint32_t gic_dev_type, uint32_t nr_vcpus) { struct vm_gic v; - v.vm = vm_create_default_with_vcpus(NR_VCPUS, 0, 0, guest_code, NULL); - v.gic_fd = kvm_create_device(v.vm, KVM_DEV_TYPE_ARM_VGIC_V3, false); + v.gic_dev_type = gic_dev_type; + v.vm = vm_create_default_with_vcpus(nr_vcpus, 0, 0, guest_code, NULL); + v.gic_fd = kvm_create_device(v.vm, gic_dev_type, false); return v; } @@ -257,8 +259,7 @@ static void test_v3_vgic_then_vcpus(uint32_t gic_dev_type) struct vm_gic v; int ret, i; - v.vm = vm_create_default(0, 0, guest_code); - v.gic_fd = kvm_create_device(v.vm, KVM_DEV_TYPE_ARM_VGIC_V3, false); + v = vm_gic_create_with_vcpus(gic_dev_type, 1); subtest_v3_dist_rdist(&v); @@ -278,7 +279,7 @@ static void test_v3_vcpus_then_vgic(uint32_t gic_dev_type) struct vm_gic v; int ret; - v = vm_gic_v3_create(); + v = vm_gic_create_with_vcpus(gic_dev_type, NR_VCPUS); subtest_v3_dist_rdist(&v); @@ -295,7 +296,7 @@ static void test_v3_new_redist_regions(void) uint64_t addr; int ret; - v = vm_gic_v3_create(); + v = vm_gic_create_with_vcpus(KVM_DEV_TYPE_ARM_VGIC_V3, NR_VCPUS); subtest_v3_redist_regions(&v); kvm_device_access(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_CTRL, KVM_DEV_ARM_VGIC_CTRL_INIT, NULL, true); @@ -306,7 +307,7 @@ static void test_v3_new_redist_regions(void) /* step2 */ - v = vm_gic_v3_create(); + v = vm_gic_create_with_vcpus(KVM_DEV_TYPE_ARM_VGIC_V3, NR_VCPUS); subtest_v3_redist_regions(&v); addr = REDIST_REGION_ATTR_ADDR(1, 0x280000, 0, 2); @@ -320,7 +321,7 @@ static void test_v3_new_redist_regions(void) /* step 3 */ - v = vm_gic_v3_create(); + v = vm_gic_create_with_vcpus(KVM_DEV_TYPE_ARM_VGIC_V3, NR_VCPUS); subtest_v3_redist_regions(&v); _kvm_device_access(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, From patchwork Tue Oct 5 01:19:18 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ricardo Koller X-Patchwork-Id: 12535225 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 010E8C433F5 for ; Tue, 5 Oct 2021 01:19:39 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id DD81761406 for ; Tue, 5 Oct 2021 01:19:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231216AbhJEBV1 (ORCPT ); Mon, 4 Oct 2021 21:21:27 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60104 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230109AbhJEBV0 (ORCPT ); Mon, 4 Oct 2021 21:21:26 -0400 Received: from mail-yb1-xb4a.google.com (mail-yb1-xb4a.google.com [IPv6:2607:f8b0:4864:20::b4a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0D919C061745 for ; Mon, 4 Oct 2021 18:19:37 -0700 (PDT) Received: by mail-yb1-xb4a.google.com with SMTP id f8-20020a2585480000b02905937897e3daso26176987ybn.2 for ; Mon, 04 Oct 2021 18:19:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=xZ3lpAQvqvEeyK874ekrhdyFJaFrtuodkxZuQJWmclc=; b=jgZT1Lggck69qe6woDJ0WTw1urdpeGjzK3yYEYJULq1ZsKqtfYNe0hkSjvtjFxy3JV aAiL9OZTv2WA0JaITcIu3c4MU807tUIb9ZG0YiVzcNCWJU/ZZJDZZmoAEvWQqru8kGqV zQ6SMe80Ds841k7BSsck/jrTNXbKce3qabnTwZKBb7FES3n+N2kivohi2luqh+2E45DW IXsCEkuZ4iKC8GYxwUedf9DpSzHosJzi8inbjq0rG8PIPaH1S9CG549Qq1epj05z2D8P NhkEE1sB7ekIjDtwhKUhG6OjKngT1kACs72kX2ACpuYIlxIVFiGjcoNDBEV0Y/YMydwU BeDg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=xZ3lpAQvqvEeyK874ekrhdyFJaFrtuodkxZuQJWmclc=; b=drgFpinDv3mpwkfm/X4fDSZElEXv+NfcEsZ0PN67DZ3HmK4gAlCivYlkEm+knNJQ5M EUeM5gvAIjjrniv0UMg/y2jANBB8zVaq6/kL/a1tzPl76L2oyR+8p8LbUppu4N7o6m5H n92q64/OGjF3Z5AwXFP4xCuov/+desFSlStLpF71so4RumzPQm6a6Z+bWdVHYRuxSEQi x6cC5AjRk0LAhVX1K9DDnSOot97eBT6qDV8AqXz+/vil3MdRxMECC2aLlvYI6zkPu7Tb LizJQvntOh7Enc66YIGquVmLD3CDJjAsCymw5Ul50WOAkmp+IKxb5eOrzlQNFoGaHHZN ywag== X-Gm-Message-State: AOAM533YIKE5IbWZcjtbxdZNbpMCgRV+DztfEjqhLLjW8D99+7t0fblr /dVcnm4OHjiw3a+1UAdQKKpe+M3r8NMPv+h+5AiWmTVjljbDnVjgCG87SAsFbqm4TGMBJ99uSjl 3SCtws6voPlzcmzz3UVksSCP44A149RQ9VnaKW+PwsiPfiee1mtE+zvhvjT+eG6w= X-Google-Smtp-Source: ABdhPJxQzuNxg9iNW+ZJGfZqm2MUI5dcNt8rKxttbtIEU4oUWm8qSH7TZUi5okLbCXgyrCgYEoxcL227cXvoYA== X-Received: from ricarkol2.c.googlers.com ([fda3:e722:ac3:cc00:24:72f4:c0a8:62fe]) (user=ricarkol job=sendgmr) by 2002:a25:7ec4:: with SMTP id z187mr18936928ybc.35.1633396776240; Mon, 04 Oct 2021 18:19:36 -0700 (PDT) Date: Mon, 4 Oct 2021 18:19:18 -0700 In-Reply-To: <20211005011921.437353-1-ricarkol@google.com> Message-Id: <20211005011921.437353-9-ricarkol@google.com> Mime-Version: 1.0 References: <20211005011921.437353-1-ricarkol@google.com> X-Mailer: git-send-email 2.33.0.800.g4c38ced690-goog Subject: [PATCH v4 08/11] KVM: arm64: selftests: Add some tests for GICv2 in vgic_init From: Ricardo Koller To: kvm@vger.kernel.org, maz@kernel.org, kvmarm@lists.cs.columbia.edu, drjones@redhat.com, eric.auger@redhat.com, alexandru.elisei@arm.com Cc: Paolo Bonzini , oupton@google.com, james.morse@arm.com, suzuki.poulose@arm.com, shuah@kernel.org, jingzhangos@google.com, pshier@google.com, rananta@google.com, reijiw@google.com, Ricardo Koller Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Add some GICv2 tests: general KVM device tests and DIST/CPUIF overlap tests. Do this by making test_vcpus_then_vgic and test_vgic_then_vcpus in vgic_init GIC version agnostic. Signed-off-by: Ricardo Koller Reviewed-by: Eric Auger Reviewed-by: Andrew Jones --- .../testing/selftests/kvm/aarch64/vgic_init.c | 111 +++++++++++++----- 1 file changed, 79 insertions(+), 32 deletions(-) diff --git a/tools/testing/selftests/kvm/aarch64/vgic_init.c b/tools/testing/selftests/kvm/aarch64/vgic_init.c index 7521dc80cf23..cb69e195ad1d 100644 --- a/tools/testing/selftests/kvm/aarch64/vgic_init.c +++ b/tools/testing/selftests/kvm/aarch64/vgic_init.c @@ -79,74 +79,120 @@ static void vm_gic_destroy(struct vm_gic *v) kvm_vm_free(v->vm); } +struct vgic_region_attr { + uint64_t attr; + uint64_t size; + uint64_t alignment; +}; + +struct vgic_region_attr gic_v3_dist_region = { + .attr = KVM_VGIC_V3_ADDR_TYPE_DIST, + .size = 0x10000, + .alignment = 0x10000, +}; + +struct vgic_region_attr gic_v3_redist_region = { + .attr = KVM_VGIC_V3_ADDR_TYPE_REDIST, + .size = NR_VCPUS * 0x20000, + .alignment = 0x10000, +}; + +struct vgic_region_attr gic_v2_dist_region = { + .attr = KVM_VGIC_V2_ADDR_TYPE_DIST, + .size = 0x1000, + .alignment = 0x1000, +}; + +struct vgic_region_attr gic_v2_cpu_region = { + .attr = KVM_VGIC_V2_ADDR_TYPE_CPU, + .size = 0x2000, + .alignment = 0x1000, +}; + /** - * Helper routine that performs KVM device tests in general and - * especially ARM_VGIC_V3 ones. Eventually the ARM_VGIC_V3 - * device gets created, a legacy RDIST region is set at @0x0 - * and a DIST region is set @0x60000 + * Helper routine that performs KVM device tests in general. Eventually the + * ARM_VGIC (GICv2 or GICv3) device gets created with an overlapping + * DIST/REDIST (or DIST/CPUIF for GICv2). Assumption is 4 vcpus are going to be + * used hence the overlap. In the case of GICv3, A RDIST region is set at @0x0 + * and a DIST region is set @0x70000. The GICv2 case sets a CPUIF @0x0 and a + * DIST region @0x1000. */ -static void subtest_v3_dist_rdist(struct vm_gic *v) +static void subtest_dist_rdist(struct vm_gic *v) { int ret; uint64_t addr; + struct vgic_region_attr rdist; /* CPU interface in GICv2*/ + struct vgic_region_attr dist; + + rdist = VGIC_DEV_IS_V3(v->gic_dev_type) ? gic_v3_redist_region + : gic_v2_cpu_region; + dist = VGIC_DEV_IS_V3(v->gic_dev_type) ? gic_v3_dist_region + : gic_v2_dist_region; /* Check existing group/attributes */ kvm_device_check_attr(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, - KVM_VGIC_V3_ADDR_TYPE_DIST); + dist.attr); kvm_device_check_attr(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, - KVM_VGIC_V3_ADDR_TYPE_REDIST); + rdist.attr); /* check non existing attribute */ - ret = _kvm_device_check_attr(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, 0); + ret = _kvm_device_check_attr(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, -1); TEST_ASSERT(ret && errno == ENXIO, "attribute not supported"); /* misaligned DIST and REDIST address settings */ - addr = 0x1000; + addr = dist.alignment / 0x10; ret = _kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, - KVM_VGIC_V3_ADDR_TYPE_DIST, &addr, true); - TEST_ASSERT(ret && errno == EINVAL, "GICv3 dist base not 64kB aligned"); + dist.attr, &addr, true); + TEST_ASSERT(ret && errno == EINVAL, "GIC dist base not aligned"); + addr = rdist.alignment / 0x10; ret = _kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, - KVM_VGIC_V3_ADDR_TYPE_REDIST, &addr, true); - TEST_ASSERT(ret && errno == EINVAL, "GICv3 redist base not 64kB aligned"); + rdist.attr, &addr, true); + TEST_ASSERT(ret && errno == EINVAL, "GIC redist/cpu base not aligned"); /* out of range address */ if (max_ipa_bits) { addr = 1ULL << max_ipa_bits; ret = _kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, - KVM_VGIC_V3_ADDR_TYPE_DIST, &addr, true); + dist.attr, &addr, true); TEST_ASSERT(ret && errno == E2BIG, "dist address beyond IPA limit"); ret = _kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, - KVM_VGIC_V3_ADDR_TYPE_REDIST, &addr, true); + rdist.attr, &addr, true); TEST_ASSERT(ret && errno == E2BIG, "redist address beyond IPA limit"); } /* set REDIST base address @0x0*/ addr = 0x00000; kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, - KVM_VGIC_V3_ADDR_TYPE_REDIST, &addr, true); + rdist.attr, &addr, true); /* Attempt to create a second legacy redistributor region */ addr = 0xE0000; ret = _kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, - KVM_VGIC_V3_ADDR_TYPE_REDIST, &addr, true); - TEST_ASSERT(ret && errno == EEXIST, "GICv3 redist base set again"); + rdist.attr, &addr, true); + TEST_ASSERT(ret && errno == EEXIST, "GIC redist base set again"); - /* Attempt to mix legacy and new redistributor regions */ - addr = REDIST_REGION_ATTR_ADDR(NR_VCPUS, 0x100000, 0, 0); - ret = _kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, - KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr, true); - TEST_ASSERT(ret && errno == EINVAL, "attempt to mix GICv3 REDIST and REDIST_REGION"); + ret = _kvm_device_check_attr(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, + KVM_VGIC_V3_ADDR_TYPE_REDIST); + if (!ret) { + /* Attempt to mix legacy and new redistributor regions */ + addr = REDIST_REGION_ATTR_ADDR(NR_VCPUS, 0x100000, 0, 0); + ret = _kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, + KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, + &addr, true); + TEST_ASSERT(ret && errno == EINVAL, + "attempt to mix GICv3 REDIST and REDIST_REGION"); + } /* * Set overlapping DIST / REDIST, cannot be detected here. Will be detected * on first vcpu run instead. */ - addr = 3 * 2 * 0x10000; - kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, KVM_VGIC_V3_ADDR_TYPE_DIST, - &addr, true); + addr = rdist.size - rdist.alignment; + kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, + dist.attr, &addr, true); } /* Test the new REDIST region API */ @@ -254,14 +300,14 @@ static void subtest_v3_redist_regions(struct vm_gic *v) * VGIC KVM device is created and initialized before the secondary CPUs * get created */ -static void test_v3_vgic_then_vcpus(uint32_t gic_dev_type) +static void test_vgic_then_vcpus(uint32_t gic_dev_type) { struct vm_gic v; int ret, i; v = vm_gic_create_with_vcpus(gic_dev_type, 1); - subtest_v3_dist_rdist(&v); + subtest_dist_rdist(&v); /* Add the rest of the VCPUs */ for (i = 1; i < NR_VCPUS; ++i) @@ -274,14 +320,14 @@ static void test_v3_vgic_then_vcpus(uint32_t gic_dev_type) } /* All the VCPUs are created before the VGIC KVM device gets initialized */ -static void test_v3_vcpus_then_vgic(uint32_t gic_dev_type) +static void test_vcpus_then_vgic(uint32_t gic_dev_type) { struct vm_gic v; int ret; v = vm_gic_create_with_vcpus(gic_dev_type, NR_VCPUS); - subtest_v3_dist_rdist(&v); + subtest_dist_rdist(&v); ret = run_vcpu(v.vm, 3); TEST_ASSERT(ret == -EINVAL, "dist/rdist overlap detected on 1st vcpu run"); @@ -550,9 +596,10 @@ int test_kvm_device(uint32_t gic_dev_type) void run_tests(uint32_t gic_dev_type) { + test_vcpus_then_vgic(gic_dev_type); + test_vgic_then_vcpus(gic_dev_type); + if (VGIC_DEV_IS_V3(gic_dev_type)) { - test_v3_vcpus_then_vgic(gic_dev_type); - test_v3_vgic_then_vcpus(gic_dev_type); test_v3_new_redist_regions(); test_v3_typer_accesses(); test_v3_last_bit_redist_regions(); From patchwork Tue Oct 5 01:19:19 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ricardo Koller X-Patchwork-Id: 12535227 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D1259C433F5 for ; Tue, 5 Oct 2021 01:19:40 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id BD5E4613AC for ; Tue, 5 Oct 2021 01:19:40 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231222AbhJEBV3 (ORCPT ); Mon, 4 Oct 2021 21:21:29 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60120 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231229AbhJEBV2 (ORCPT ); Mon, 4 Oct 2021 21:21:28 -0400 Received: from mail-yb1-xb49.google.com (mail-yb1-xb49.google.com [IPv6:2607:f8b0:4864:20::b49]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B3B7DC061745 for ; Mon, 4 Oct 2021 18:19:38 -0700 (PDT) Received: by mail-yb1-xb49.google.com with SMTP id z2-20020a254c02000000b005b68ef4fe24so26047131yba.11 for ; Mon, 04 Oct 2021 18:19:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=S76O3ETAe3yQxXAd2JJTjNgxqbnnjrbVIsMmqpzrAMM=; b=Yc3iAwJ1KU0xk6PUvDOO1DgsqmjfDLUcct/Cp5cplfLvtPICb0rCsFcEtIZJ9bDna8 sHiNe5RXDfTtL+rUhKyj+lG76BwPPVCrwx+UtBvtwuE6fXeahv+aXLtwaWZJ5PBHu57X Nx9xldr7H4lvuoW4dVJBA5Isg4HZBYdy1v6SMtTUYSyq18GDlrpJ7aLRpD10wT8xPuAB a8CCrcDx2rNjjS+MZqWj9pDWVA8zsMR/GVMiIHk04n3ot2qLt+9UIH/41ihcMMym5Azx +jfxBWE4kq2KdkjtjIun9W/bXWcx5xp0zbkXPdCum3IT+RqqUXDU8Ny0fVk59eWHjWSn +v9w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=S76O3ETAe3yQxXAd2JJTjNgxqbnnjrbVIsMmqpzrAMM=; b=Pjg7R16KmOsGXWgK29SjDOloSQmD6aESu4Ht7Rm7F5YyBwX7r/utCVjxRbCmd5BNsO PgosDbTa02UR89SGsr29JBb56ICqzlY22EpYb163Duu2EBNop12cnMIYatu7IvOOSMOu kIpEcrYC42n6y47PfVzrJakBFbLZMoSIzTtLkiIhYfDA10CTfXbOcE9ssSoOWaMYtZUL J5e/YT4m8nm9GVKKBnXIfeE5xThw2e+jYStKT2VgiR/OBylvaaeB/udOHm8nX9I6RPEy 9SVduhRwVSsRcdUbbD1So9jnLuun9uWd4u/XczOD0/ZGe+MbIVoB6aAQAPr8Sohq8Jar nZkg== X-Gm-Message-State: AOAM532gBPR8S5DAYr3N/dYcsJbMsJ01WuauEGhE+SWO3kY8on6kYNIW toE2Me1chrdzIe4+/OdBvw96rDFJTWN5ad0MaXMLkIggPWvVUsMyXKlnGlp38oKTYERgOXkWDP3 gBv9flDwl//xK/y6skETVYsvHWuurpu8gCuzXCbWlbLwAPKH9IuRR3XNR03YX2M4= X-Google-Smtp-Source: ABdhPJzLLpKp+6FIvPQvjCg8Ehu7YXxwucVWSZhjf1W55UmsjljX4QCwDd3o5as7VVh3HZvvAVWVG523KA8lWA== X-Received: from ricarkol2.c.googlers.com ([fda3:e722:ac3:cc00:24:72f4:c0a8:62fe]) (user=ricarkol job=sendgmr) by 2002:a25:c183:: with SMTP id r125mr17844375ybf.37.1633396777861; Mon, 04 Oct 2021 18:19:37 -0700 (PDT) Date: Mon, 4 Oct 2021 18:19:19 -0700 In-Reply-To: <20211005011921.437353-1-ricarkol@google.com> Message-Id: <20211005011921.437353-10-ricarkol@google.com> Mime-Version: 1.0 References: <20211005011921.437353-1-ricarkol@google.com> X-Mailer: git-send-email 2.33.0.800.g4c38ced690-goog Subject: [PATCH v4 09/11] KVM: arm64: selftests: Add tests for GIC redist/cpuif partially above IPA range From: Ricardo Koller To: kvm@vger.kernel.org, maz@kernel.org, kvmarm@lists.cs.columbia.edu, drjones@redhat.com, eric.auger@redhat.com, alexandru.elisei@arm.com Cc: Paolo Bonzini , oupton@google.com, james.morse@arm.com, suzuki.poulose@arm.com, shuah@kernel.org, jingzhangos@google.com, pshier@google.com, rananta@google.com, reijiw@google.com, Ricardo Koller Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Add tests for checking that KVM returns the right error when trying to set GICv2 CPU interfaces or GICv3 Redistributors partially above the addressable IPA range. Also tighten the IPA range by replacing KVM_CAP_ARM_VM_IPA_SIZE with the IPA range currently configured for the guest (i.e., the default). The check for the GICv3 redistributor created using the REDIST legacy API is not sufficient as this new test only checks the check done using vcpus already created when setting the base. The next commit will add the missing test which verifies that the KVM check is done at first vcpu run. Signed-off-by: Ricardo Koller Reviewed-by: Eric Auger Reviewed-by: Andrew Jones --- .../testing/selftests/kvm/aarch64/vgic_init.c | 38 +++++++++++++------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/tools/testing/selftests/kvm/aarch64/vgic_init.c b/tools/testing/selftests/kvm/aarch64/vgic_init.c index cb69e195ad1d..eadd448b3a96 100644 --- a/tools/testing/selftests/kvm/aarch64/vgic_init.c +++ b/tools/testing/selftests/kvm/aarch64/vgic_init.c @@ -31,7 +31,7 @@ struct vm_gic { uint32_t gic_dev_type; }; -static int max_ipa_bits; +static uint64_t max_phys_size; /* helper to access a redistributor register */ static int access_v3_redist_reg(int gicv3_fd, int vcpu, int offset, @@ -152,16 +152,21 @@ static void subtest_dist_rdist(struct vm_gic *v) TEST_ASSERT(ret && errno == EINVAL, "GIC redist/cpu base not aligned"); /* out of range address */ - if (max_ipa_bits) { - addr = 1ULL << max_ipa_bits; - ret = _kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, - dist.attr, &addr, true); - TEST_ASSERT(ret && errno == E2BIG, "dist address beyond IPA limit"); + addr = max_phys_size; + ret = _kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, + dist.attr, &addr, true); + TEST_ASSERT(ret && errno == E2BIG, "dist address beyond IPA limit"); - ret = _kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, - rdist.attr, &addr, true); - TEST_ASSERT(ret && errno == E2BIG, "redist address beyond IPA limit"); - } + ret = _kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, + rdist.attr, &addr, true); + TEST_ASSERT(ret && errno == E2BIG, "redist address beyond IPA limit"); + + /* Space for half a rdist (a rdist is: 2 * rdist.alignment). */ + addr = max_phys_size - dist.alignment; + ret = _kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, + rdist.attr, &addr, true); + TEST_ASSERT(ret && errno == E2BIG, + "half of the redist is beyond IPA limit"); /* set REDIST base address @0x0*/ addr = 0x00000; @@ -250,12 +255,19 @@ static void subtest_v3_redist_regions(struct vm_gic *v) kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr, true); - addr = REDIST_REGION_ATTR_ADDR(1, 1ULL << max_ipa_bits, 0, 2); + addr = REDIST_REGION_ATTR_ADDR(1, max_phys_size, 0, 2); ret = _kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr, true); TEST_ASSERT(ret && errno == E2BIG, "register redist region with base address beyond IPA range"); + /* The last redist is above the pa range. */ + addr = REDIST_REGION_ATTR_ADDR(2, max_phys_size - 0x30000, 0, 2); + ret = _kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, + KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr, true); + TEST_ASSERT(ret && errno == E2BIG, + "register redist region with top address beyond IPA range"); + addr = 0x260000; ret = _kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, KVM_VGIC_V3_ADDR_TYPE_REDIST, &addr, true); @@ -610,8 +622,10 @@ void run_tests(uint32_t gic_dev_type) int main(int ac, char **av) { int ret; + int pa_bits; - max_ipa_bits = kvm_check_cap(KVM_CAP_ARM_VM_IPA_SIZE); + pa_bits = vm_guest_mode_params[VM_MODE_DEFAULT].pa_bits; + max_phys_size = 1ULL << pa_bits; ret = test_kvm_device(KVM_DEV_TYPE_ARM_VGIC_V3); if (!ret) { From patchwork Tue Oct 5 01:19:20 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ricardo Koller X-Patchwork-Id: 12535229 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7B518C433F5 for ; Tue, 5 Oct 2021 01:19:42 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 658C761507 for ; Tue, 5 Oct 2021 01:19:42 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231297AbhJEBVa (ORCPT ); Mon, 4 Oct 2021 21:21:30 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60128 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231229AbhJEBV3 (ORCPT ); Mon, 4 Oct 2021 21:21:29 -0400 Received: from mail-pg1-x54a.google.com (mail-pg1-x54a.google.com [IPv6:2607:f8b0:4864:20::54a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E725DC061745 for ; Mon, 4 Oct 2021 18:19:39 -0700 (PDT) Received: by mail-pg1-x54a.google.com with SMTP id p19-20020a634f53000000b002877a03b293so11560853pgl.10 for ; Mon, 04 Oct 2021 18:19:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=LALo9JihRPRBkG1fYYMRtr74GhwkziudPmPUGtI9Fw4=; b=hLp0tj96F1OWP6HZwu3DGIrMazfL6bcOfnvTYKxYCIBaSh7ob8veeFJ1cVziBgXiNu bqDrG6sf6VCe/KsbjSR1p681zdh/F+klgPr6dB1bTJk/a4PtAI6cijGq+E9agkE4aFia Cz7Eh7XfwNv1k3E3mcPqWnhYUmyBjKyzPC1NH5IRoVCNFnkLS09HpMcftjRF+Yi8698c YrHRxITfEQOixXsbTKe7pNCA/4goHDQf2kL5LCTSXPQKvj61JXw5DWKR+L4y0qXYfaoL qk6JF+TDk4oO40MLI0Zjx2Ls1zHqiuP21PrRPIgk/+99jerLdZ4m2+nKG/47fiu8X3t3 C0Pg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=LALo9JihRPRBkG1fYYMRtr74GhwkziudPmPUGtI9Fw4=; b=xdWxiWYrf14fK8cpjT6lFx7lltk9KrJQ1Pzp5w+Wt87f8W+fDetC0qq8PI1MOoheQ/ pICUKu/xstV98oLfO0tOPC0uTOg2Yncn3riKsC/R+PlDp3R0kN82VcgPYHBLB/roL/bC d56nNYukrxQnIiPrQnJ7tutblISFs6GoMTHew9N4+iegybZl47LOC2+FbiqSIUUabr1O plMZnjQaoZnNtKbbVSdt/fqoGWJY/upYEj0ABai6ZvG3ztcDIboUuVMVnZaHIJjstb3A nFtKKBtaVCWDT1CgV+US5YDc+4p0cfSK8W3V75D+g9/McD9uTHfpLYjgeF1fD377xVcT VQWQ== X-Gm-Message-State: AOAM530rqDY/XPQFsK5AoxeM6w5sdnPWzoMV+TirXTy+4DsZEacE7aiF a6jNErWKxJSWqpH8c7GKRulYyZoe3R0dItqE7sVvFgZ3F8vuWAYA8dYfNswfZqlJASDN4yQVWgR fOkN7Cocl2HkH13x4vFh1s4WPIKp8Pdl7S2Gi7oKUh28VZlwjFDhkMHrci4UIJWE= X-Google-Smtp-Source: ABdhPJzUUkZEXh0YtKOvuw4kldQta6Fk0jXOVYU6rXgMHyhp34IKvaz+CMANxBajmBBPTWnz+esVVsUyc0CDoQ== X-Received: from ricarkol2.c.googlers.com ([fda3:e722:ac3:cc00:24:72f4:c0a8:62fe]) (user=ricarkol job=sendgmr) by 2002:a17:90b:1804:: with SMTP id lw4mr383225pjb.174.1633396779303; Mon, 04 Oct 2021 18:19:39 -0700 (PDT) Date: Mon, 4 Oct 2021 18:19:20 -0700 In-Reply-To: <20211005011921.437353-1-ricarkol@google.com> Message-Id: <20211005011921.437353-11-ricarkol@google.com> Mime-Version: 1.0 References: <20211005011921.437353-1-ricarkol@google.com> X-Mailer: git-send-email 2.33.0.800.g4c38ced690-goog Subject: [PATCH v4 10/11] KVM: arm64: selftests: Add test for legacy GICv3 REDIST base partially above IPA range From: Ricardo Koller To: kvm@vger.kernel.org, maz@kernel.org, kvmarm@lists.cs.columbia.edu, drjones@redhat.com, eric.auger@redhat.com, alexandru.elisei@arm.com Cc: Paolo Bonzini , oupton@google.com, james.morse@arm.com, suzuki.poulose@arm.com, shuah@kernel.org, jingzhangos@google.com, pshier@google.com, rananta@google.com, reijiw@google.com, Ricardo Koller Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Add a new test into vgic_init which checks that the first vcpu fails to run if there is not sufficient REDIST space below the addressable IPA range. This only applies to the KVM_VGIC_V3_ADDR_TYPE_REDIST legacy API as the required REDIST space is not know when setting the DIST region. Note that using the REDIST_REGION API results in a different check at first vcpu run: that the number of redist regions is enough for all vcpus. And there is already a test for that case in, the first step of test_v3_new_redist_regions. Reviewed-by: Eric Auger Signed-off-by: Ricardo Koller Reviewed-by: Andrew Jones --- .../testing/selftests/kvm/aarch64/vgic_init.c | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/tools/testing/selftests/kvm/aarch64/vgic_init.c b/tools/testing/selftests/kvm/aarch64/vgic_init.c index eadd448b3a96..80be1940d2ad 100644 --- a/tools/testing/selftests/kvm/aarch64/vgic_init.c +++ b/tools/testing/selftests/kvm/aarch64/vgic_init.c @@ -565,6 +565,39 @@ static void test_v3_last_bit_single_rdist(void) vm_gic_destroy(&v); } +/* Uses the legacy REDIST region API. */ +static void test_v3_redist_ipa_range_check_at_vcpu_run(void) +{ + struct vm_gic v; + int ret, i; + uint64_t addr; + + v = vm_gic_create_with_vcpus(KVM_DEV_TYPE_ARM_VGIC_V3, 1); + + /* Set space for 3 redists, we have 1 vcpu, so this succeeds. */ + addr = max_phys_size - (3 * 2 * 0x10000); + kvm_device_access(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, + KVM_VGIC_V3_ADDR_TYPE_REDIST, &addr, true); + + addr = 0x00000; + kvm_device_access(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, + KVM_VGIC_V3_ADDR_TYPE_DIST, &addr, true); + + /* Add the rest of the VCPUs */ + for (i = 1; i < NR_VCPUS; ++i) + vm_vcpu_add_default(v.vm, i, guest_code); + + kvm_device_access(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_CTRL, + KVM_DEV_ARM_VGIC_CTRL_INIT, NULL, true); + + /* Attempt to run a vcpu without enough redist space. */ + ret = run_vcpu(v.vm, 2); + TEST_ASSERT(ret && errno == EINVAL, + "redist base+size above PA range detected on 1st vcpu run"); + + vm_gic_destroy(&v); +} + /* * Returns 0 if it's possible to create GIC device of a given type (V2 or V3). */ @@ -616,6 +649,7 @@ void run_tests(uint32_t gic_dev_type) test_v3_typer_accesses(); test_v3_last_bit_redist_regions(); test_v3_last_bit_single_rdist(); + test_v3_redist_ipa_range_check_at_vcpu_run(); } } From patchwork Tue Oct 5 01:19:21 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ricardo Koller X-Patchwork-Id: 12535231 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5EBBFC433FE for ; Tue, 5 Oct 2021 01:19:45 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 477F661406 for ; Tue, 5 Oct 2021 01:19:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231363AbhJEBVc (ORCPT ); Mon, 4 Oct 2021 21:21:32 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60138 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231311AbhJEBVb (ORCPT ); Mon, 4 Oct 2021 21:21:31 -0400 Received: from mail-pl1-x64a.google.com (mail-pl1-x64a.google.com [IPv6:2607:f8b0:4864:20::64a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 635EBC061753 for ; Mon, 4 Oct 2021 18:19:41 -0700 (PDT) Received: by mail-pl1-x64a.google.com with SMTP id l12-20020a170903120c00b0013eb930584fso812200plh.22 for ; Mon, 04 Oct 2021 18:19:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=ebBYyYb0auVU2YwhpjKMMCWgRzY2PJI9/2w5/quPrGs=; b=nnff9YiUi6n1ZXyRJwhfFa6RWAeI0wcpnPssLqmBzAlrRBcjFTQuzDYAjwhxx0tlOq e+S5uaB88ivXuMxCX8mLqcIxGLvJF0V0OgaJn+sutt6n3gSl0AMpkFhY5mvQYmX5ew+D WI5qVOypc6GBHMoJ6nmlJlq3ZzygfPXlMg/tlTJA1W3D9pghl6JYJB8QCS8actNnmxEH gpEXsFZyynm2ozl0zbOPO6kP0yJ+/Dd4eq1ppv3Z4wAoJhWULYv6Ab7hmS6ncnX9p3JE ETbTYxijY0mT28Xuh1/n2HOfAvYiMaaq70PB0zVzfsXQ57Q6XK+yfungcx56nOHn9I0/ XKTg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=ebBYyYb0auVU2YwhpjKMMCWgRzY2PJI9/2w5/quPrGs=; b=giAvg4XdFDx1OfK4ovUFnXuTFn8KIFLFHA7h5ur12WRsObiD2iXr534IgNruTFwKvg UR2m6m+D9Jpw7wR2dVg/GEwxKtS/7BSHhZnzc+1xhVctE/h3iBiv3bi+K7mwSInU5jy0 QCLyKbQREYDeq4IZShJo1O3G7v0TheCk4C1kyA9XuXeUqXa7zIJACc/NLaJ/n7NtQzYy 1bzrHLWcPxN35QuuTfBaKIu7N5USOtTrp74b/AAuBls43UEfBEpgrWdYZZ0GJu7aKjVz mAOFpHRQapskWKDdvPeQm4OXKfkafdDwoam06pOwYzr0DaxpDbGIzcREIIaW0GcuLzwV ak1Q== X-Gm-Message-State: AOAM532WtLR1lrmYJkrmuMnyzXtxPc4++uutFvbAAbbCNfYJNPUZXdR2 mLmXWFuN6olAOl0//2xgjtyU9pEw4o6+RfnyARArvALdvEmpvyy0xVijBRSX3S3DS4AiRpXWeAR 4Sy5wL+5iBRssfgTlwMwI4uR43+By9mm+yjOlZG+dKsEmvX8OLHPMiJjJkY9OPeg= X-Google-Smtp-Source: ABdhPJxSvUsBKjgUTRIyeKoK/lGVqGBvu8uO5Dr1jcgTFqQndyorWtPI9bFQSzNvrMxfbls15hUJ0mio4/S5Vg== X-Received: from ricarkol2.c.googlers.com ([fda3:e722:ac3:cc00:24:72f4:c0a8:62fe]) (user=ricarkol job=sendgmr) by 2002:a17:902:7e88:b0:13e:91ec:4114 with SMTP id z8-20020a1709027e8800b0013e91ec4114mr2606928pla.30.1633396780779; Mon, 04 Oct 2021 18:19:40 -0700 (PDT) Date: Mon, 4 Oct 2021 18:19:21 -0700 In-Reply-To: <20211005011921.437353-1-ricarkol@google.com> Message-Id: <20211005011921.437353-12-ricarkol@google.com> Mime-Version: 1.0 References: <20211005011921.437353-1-ricarkol@google.com> X-Mailer: git-send-email 2.33.0.800.g4c38ced690-goog Subject: [PATCH v4 11/11] KVM: arm64: selftests: Add init ITS device test From: Ricardo Koller To: kvm@vger.kernel.org, maz@kernel.org, kvmarm@lists.cs.columbia.edu, drjones@redhat.com, eric.auger@redhat.com, alexandru.elisei@arm.com Cc: Paolo Bonzini , oupton@google.com, james.morse@arm.com, suzuki.poulose@arm.com, shuah@kernel.org, jingzhangos@google.com, pshier@google.com, rananta@google.com, reijiw@google.com, Ricardo Koller Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Add some ITS device init tests: general KVM device tests (address not defined already, address aligned) and tests for the ITS region being within the addressable IPA range. Signed-off-by: Ricardo Koller Reviewed-by: Eric Auger Reviewed-by: Andrew Jones --- .../testing/selftests/kvm/aarch64/vgic_init.c | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/tools/testing/selftests/kvm/aarch64/vgic_init.c b/tools/testing/selftests/kvm/aarch64/vgic_init.c index 80be1940d2ad..c563489ff760 100644 --- a/tools/testing/selftests/kvm/aarch64/vgic_init.c +++ b/tools/testing/selftests/kvm/aarch64/vgic_init.c @@ -598,6 +598,47 @@ static void test_v3_redist_ipa_range_check_at_vcpu_run(void) vm_gic_destroy(&v); } +static void test_v3_its_region(void) +{ + struct vm_gic v; + uint64_t addr; + int its_fd, ret; + + v = vm_gic_create_with_vcpus(KVM_DEV_TYPE_ARM_VGIC_V3, NR_VCPUS); + its_fd = kvm_create_device(v.vm, KVM_DEV_TYPE_ARM_VGIC_ITS, false); + + addr = 0x401000; + ret = _kvm_device_access(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, + KVM_VGIC_ITS_ADDR_TYPE, &addr, true); + TEST_ASSERT(ret && errno == EINVAL, + "ITS region with misaligned address"); + + addr = max_phys_size; + ret = _kvm_device_access(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, + KVM_VGIC_ITS_ADDR_TYPE, &addr, true); + TEST_ASSERT(ret && errno == E2BIG, + "register ITS region with base address beyond IPA range"); + + addr = max_phys_size - 0x10000; + ret = _kvm_device_access(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, + KVM_VGIC_ITS_ADDR_TYPE, &addr, true); + TEST_ASSERT(ret && errno == E2BIG, + "Half of ITS region is beyond IPA range"); + + /* This one succeeds setting the ITS base */ + addr = 0x400000; + kvm_device_access(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, + KVM_VGIC_ITS_ADDR_TYPE, &addr, true); + + addr = 0x300000; + ret = _kvm_device_access(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, + KVM_VGIC_ITS_ADDR_TYPE, &addr, true); + TEST_ASSERT(ret && errno == EEXIST, "ITS base set again"); + + close(its_fd); + vm_gic_destroy(&v); +} + /* * Returns 0 if it's possible to create GIC device of a given type (V2 or V3). */ @@ -650,6 +691,7 @@ void run_tests(uint32_t gic_dev_type) test_v3_last_bit_redist_regions(); test_v3_last_bit_single_rdist(); test_v3_redist_ipa_range_check_at_vcpu_run(); + test_v3_its_region(); } }