From patchwork Tue Sep 28 18:47:55 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ricardo Koller X-Patchwork-Id: 12523553 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 014EAC433FE for ; Tue, 28 Sep 2021 18:48:13 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id E028E61209 for ; Tue, 28 Sep 2021 18:48:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242289AbhI1Stv (ORCPT ); Tue, 28 Sep 2021 14:49:51 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56300 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242237AbhI1Stt (ORCPT ); Tue, 28 Sep 2021 14:49:49 -0400 Received: from mail-qv1-xf4a.google.com (mail-qv1-xf4a.google.com [IPv6:2607:f8b0:4864:20::f4a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id AC185C06161C for ; Tue, 28 Sep 2021 11:48:09 -0700 (PDT) Received: by mail-qv1-xf4a.google.com with SMTP id v10-20020ad4554a000000b0038250b18b6dso56828463qvy.12 for ; Tue, 28 Sep 2021 11:48:09 -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=O4Pf1pw7IvGHNe4ix1iHuqBRwQM1rzQrtDbARj3VD7U=; b=mMMdCpyyOz9jvXo89g2rQ6b6Nh948to1i5C3FcPkKL21khzd0SJnqxQR4pkyDMx9wa s0O07AEGyGZovHoZMQWntxZ96N3sLH8ged8VBIMRL3FOXckb8dsewQN2qvTmew6Mg8p0 Oolh9VInTIJlL5VZaT2EXghb9fy5iK+ewpnw//GSA/9/OPPM46+sSBbZ8QpqsfcCDI0L hnzvrBsCQu6n04TqU7WBQFmmglwGBFckLdXNTpAVz4Yjxd4GOGyU9lwF+ghdGzg0WUiz iB4cEZyX1mFt8GkSsJB84Cquma2SBzV8D+IDLTJmPek45HdWNKnpiemLZlZf80Badjv/ 6dBQ== 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=O4Pf1pw7IvGHNe4ix1iHuqBRwQM1rzQrtDbARj3VD7U=; b=5NHPdyjwTFJQ8PRLC+oaEmPssAcgrTUcUavkHMSQ3RAqvYjXHlZZVKQQHXYHzf7Ndb J9qg3P/YpdF5gdh9eZiu4LZEiagzTGTCzoqYOyp1fvZqUupwNmfEYVgsKO9ztxzU8gqB w3GVZyxtrxS5x51LnEXvffy1X9c3cI50c5WxXXbpGP7IaYinzyyF1WnSThboaklECoe0 EseD23vPQRgGgezS3aoKZZTLBIaMKxAMiuE9MExXxBsgTVXmrbeDPFOcvgibw4HZyZDP ekM2goHhmpq4k0sB4nnPvVVbnilKHvvjRoPwrzDaM9w+HJs1pJghDdemWd1zUCVVqJSK EBmw== X-Gm-Message-State: AOAM533JmO+KnDMwOb0WAtFvzunKxxMCj0rUL/EkIV9UmoVUMND2ACFo 9DCsLIHkctJYoqdjxKTimgTD7GL0aO8xepKzwQirA+UcjZJh3YLnO9L0WtSKWe7xuMlAsprFExY SmUi8EKzOAJ/5IgB7gLEOx5/Xs1Poss4oAo9Riw/m1X3AgN7bbJZQJylDW0bQNwE= X-Google-Smtp-Source: ABdhPJx5jNcltOLTjTdhqpjP1Bl4mvZcRKZjKlWdl3zBsvmwrNHy7AtNptUT7fjtgYO1crNJzy1+li0z/78wjg== X-Received: from ricarkol2.c.googlers.com ([fda3:e722:ac3:cc00:24:72f4:c0a8:62fe]) (user=ricarkol job=sendgmr) by 2002:ad4:4a02:: with SMTP id m2mr164765qvz.8.1632854888735; Tue, 28 Sep 2021 11:48:08 -0700 (PDT) Date: Tue, 28 Sep 2021 11:47:55 -0700 In-Reply-To: <20210928184803.2496885-1-ricarkol@google.com> Message-Id: <20210928184803.2496885-2-ricarkol@google.com> Mime-Version: 1.0 References: <20210928184803.2496885-1-ricarkol@google.com> X-Mailer: git-send-email 2.33.0.685.g46640cef36-goog Subject: [PATCH v3 01/10] 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. Signed-off-by: Ricardo Koller Reviewed-by: Eric Auger --- 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..f714aded67b2 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..c4df4dcef31f 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 Sep 28 18:47:56 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ricardo Koller X-Patchwork-Id: 12523551 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 9B181C4332F for ; Tue, 28 Sep 2021 18:48:13 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 84AFA6135D for ; Tue, 28 Sep 2021 18:48:13 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242291AbhI1Stw (ORCPT ); Tue, 28 Sep 2021 14:49:52 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56308 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236720AbhI1Stv (ORCPT ); Tue, 28 Sep 2021 14:49:51 -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 5CF38C06161C for ; Tue, 28 Sep 2021 11:48:11 -0700 (PDT) Received: by mail-yb1-xb49.google.com with SMTP id f8-20020a2585480000b02905937897e3daso25575738ybn.2 for ; Tue, 28 Sep 2021 11:48:11 -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=WAqYgSZANBQPGrSP2/3EiNP0xOOtjEK+EoXAoDp+T4U=; b=FVBMJgpfmWUBj6QARIX+xdJjaaGUEQoe0zbBl69lT+k3AhTFlydw5VN6+1xN23pk2B mpStAxsUAY6FhRP29Lt3oKt0dKV9Y3xgQCLgO9ab9thvP0LBOLneJj7nb0WWS7nClmA2 gjFN2Y2snAfAK2vmPr8evtrvk3DOjhqZPAsvBamXsQ7SGV54WR9PEJy5V+SP4+02Vlmm klOuVWVQnFFCF/RC6DuhomYxb9MB7LC21L7KM+5sKZ6VNkbgqHjkzap//uE2sZldvL5y /CZJJVjI+NhPmEYCyL6VbCgjzukC84SPGlGfRD8MqTOpIGNQIMw22pZur/+k2P04S5Y3 4otA== 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=WAqYgSZANBQPGrSP2/3EiNP0xOOtjEK+EoXAoDp+T4U=; b=HV21Z3cDT29xDgcvcxMtNKpNdUz4bDwUobwIUY7L6cMEuL5bQ/X2vt2Cx61RZvoF0t IqPsSQB5/f+uE8t/wVaCYdpA27b3oNJKYgR9fI7RVPopPOP5nxHKB36n/KzsflnFFot5 OqSWAZZvI0GHwsEL7+GjCOBwzFwcRClEsb1fJy5rApMRw7J1hRn8XlzFKlbG9tohTQ9h K/nkFhAEnMPCi0434erJLa3Vx7n9k+JrHeoW9/KNV51dpDaVgNyk7gq6PYVKjS6NxLLg xs0oMn1JNaNnf4DhAlEhV4aCtYgm9QrK8FN7GyRGJMR2RG1hDZYmFK+DUX9lUGCe084I K/OQ== X-Gm-Message-State: AOAM533THCM7GqnP2RfHVhC5kr2Mi0vpEv5O6k54vF6WeCxvcN/cgPKr IJd9DqPZJK+4mX5EPuTrAgbOD1btRd7H6fLqIfTXmt31wNaPHiQ7kpCVO5BbXpuDd8RTfBdPs+e +gyY59t2SHyCZdzYPFxItL9LRsJCfE3QTmDzgFAi5ECHDKafPxWuZWs5r052ugwE= X-Google-Smtp-Source: ABdhPJxNlbd9xaIVWBlb06ZLVfi9me310h22AXk1NuCxq0eUX+iIm+qoIj+aT5WJbHCnDzueUzbGxNWaI4HRKg== X-Received: from ricarkol2.c.googlers.com ([fda3:e722:ac3:cc00:24:72f4:c0a8:62fe]) (user=ricarkol job=sendgmr) by 2002:a25:76c9:: with SMTP id r192mr7253464ybc.481.1632854890485; Tue, 28 Sep 2021 11:48:10 -0700 (PDT) Date: Tue, 28 Sep 2021 11:47:56 -0700 In-Reply-To: <20210928184803.2496885-1-ricarkol@google.com> Message-Id: <20210928184803.2496885-3-ricarkol@google.com> Mime-Version: 1.0 References: <20210928184803.2496885-1-ricarkol@google.com> X-Mailer: git-send-email 2.33.0.685.g46640cef36-goog Subject: [PATCH v3 02/10] 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. Signed-off-by: Ricardo Koller Reviewed-by: Eric Auger --- arch/arm64/kvm/vgic/vgic-mmio-v3.c | 6 ++++-- arch/arm64/kvm/vgic/vgic-v3.c | 4 ++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/arch/arm64/kvm/vgic/vgic-mmio-v3.c b/arch/arm64/kvm/vgic/vgic-mmio-v3.c index a09cdc0b953c..9be02bf7865e 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..27ee674631b3 100644 --- a/arch/arm64/kvm/vgic/vgic-v3.c +++ b/arch/arm64/kvm/vgic/vgic-v3.c @@ -486,6 +486,10 @@ bool vgic_v3_check_base(struct kvm *kvm) if (rdreg->base + vgic_v3_rd_region_size(kvm, rdreg) < rdreg->base) return false; + + if (rdreg->base + vgic_v3_rd_region_size(kvm, rdreg) > + kvm_phys_size(kvm)) + return false; } if (IS_VGIC_ADDR_UNDEF(d->vgic_dist_base)) From patchwork Tue Sep 28 18:47:57 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ricardo Koller X-Patchwork-Id: 12523555 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 69C1AC433EF for ; Tue, 28 Sep 2021 18:48:14 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 53AED61209 for ; Tue, 28 Sep 2021 18:48:14 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242302AbhI1Stx (ORCPT ); Tue, 28 Sep 2021 14:49:53 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56314 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242296AbhI1Stw (ORCPT ); Tue, 28 Sep 2021 14:49:52 -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 C8099C06161C for ; Tue, 28 Sep 2021 11:48:12 -0700 (PDT) Received: by mail-qt1-x84a.google.com with SMTP id w10-20020ac87e8a000000b002a68361412bso102111608qtj.7 for ; Tue, 28 Sep 2021 11:48:12 -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=SRAJJGG3Meq60fJArI5V58NqIezmfGYq9oG//j0UJy4=; b=gz2f1clVsINkVP6NIRdH73tTk/+NC1lndVFY8Ks8c/mZOEVqy7lrdZZMeNIZHOfqsR QcU3QjumkuT98r6uzQTnO1MpoK+AMep01FJUZ2WhP0Z7b+n/9k6BglSNBHT3yNJxmQyV V57QtyAImWfetwVF8+qmYsLpRQzTbqrPVIKHNbcHpvup/TAHuBFRlhMHiHgZ8T+kVapS 0P78ZcNTCt0nnTTcCRoD8dINcAfsRc+g7GtnNO5bwNDA9FqQw2KPsfnt47PfGhtKffrE wKHw0dOq7DzE1vRFmDPZX66JAxHzIgv1XdPoPiRqNhTQX+uaFCRneTxei85Dypb1QGVm AuKw== 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=SRAJJGG3Meq60fJArI5V58NqIezmfGYq9oG//j0UJy4=; b=CAzx5BMlhiSesraemq86dzsNvq3+K6ZISwxXP18TJSn//MM7SsDGMxmUZWLoIgC10H j3Jupshm/pstSahl5NkiTqBTPAoOYk1ZJsoNjwkkQURWFaoTWdj8Pk42c+iE1Ztn3UMS KeYmNpHRe8EIyaT/YiOh3JdFqckP1PtSYa1aoq6hgWogW7st7FE4cMtgsqy0exQwQs0s EOuS6yt9tDu/PzI7FYj1UEeIstR9UrNcnR+AGXfuEhhXY10J0AFTpXL6y+HjkelbMSLP 0o7kdocsxZMkpDNwAxGrIEm4VY6pHdk4XqBmsFH4uVXCJftZdSswRTEh54kHlpjW2k22 kwPA== X-Gm-Message-State: AOAM532vBtL94kLxDfVptmw5TIR1+KACpnt7xNKlypoBenz1kuFPNwKR N7J7eQpGyXnlnjwlcbXuUb0cI5e3HxBHF2Xl8Apq9tWvi7ZCrHsGxubwt5HvLVOBV6h4irhDf9j EwEoZdRv+TNFWle1Ta9txynMQtJrx3Xu/H+bfMTiY7ApEwpN8DGm3vKGMu59qWuY= X-Google-Smtp-Source: ABdhPJzP3Fh4vY9K3xp2ukBeuRRfH9cOkSP8HPXbiCcgsIo9+m8jiJA3CBwtrricg5KcU+UwN+TiqVzb93a/Uw== X-Received: from ricarkol2.c.googlers.com ([fda3:e722:ac3:cc00:24:72f4:c0a8:62fe]) (user=ricarkol job=sendgmr) by 2002:a05:6214:732:: with SMTP id c18mr7310791qvz.9.1632854891937; Tue, 28 Sep 2021 11:48:11 -0700 (PDT) Date: Tue, 28 Sep 2021 11:47:57 -0700 In-Reply-To: <20210928184803.2496885-1-ricarkol@google.com> Message-Id: <20210928184803.2496885-4-ricarkol@google.com> Mime-Version: 1.0 References: <20210928184803.2496885-1-ricarkol@google.com> X-Mailer: git-send-email 2.33.0.685.g46640cef36-goog Subject: [PATCH v3 03/10] 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). Signed-off-by: Ricardo Koller Reviewed-by: Eric Auger --- 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 { From patchwork Tue Sep 28 18:47:58 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ricardo Koller X-Patchwork-Id: 12523557 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 E5524C433F5 for ; Tue, 28 Sep 2021 18:48:15 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id C8FC16135D for ; Tue, 28 Sep 2021 18:48:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242307AbhI1Sty (ORCPT ); Tue, 28 Sep 2021 14:49:54 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56322 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236720AbhI1Stx (ORCPT ); Tue, 28 Sep 2021 14:49:53 -0400 Received: from mail-pj1-x1049.google.com (mail-pj1-x1049.google.com [IPv6:2607:f8b0:4864:20::1049]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3BA2BC061745 for ; Tue, 28 Sep 2021 11:48:14 -0700 (PDT) Received: by mail-pj1-x1049.google.com with SMTP id h9-20020a17090a470900b001791c0352aaso15050310pjg.2 for ; Tue, 28 Sep 2021 11:48:14 -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=8STNvO/W+/tH6mis7cVRJ3Dc57rX86y55WPHAXp51vA=; b=Lav0bpVUN4Oquga0REUXCMujWYzDDRnjAT62pSHmfoEUa2PIvfp5F1Kg5ACJCpAnD4 FEZ/u0KXIJBayfxa6jngfiCpFXBZUcXykEXCfoh7PXPN41Qq7vRH2/ReasumUTEaWYdI mNoM+eXzdtyivAAja4vueOaveB5fw8w7VHhOM3Kf4cSAOpQakJydLynyPsdi9C6oZkXQ TZUeOKehykE2VXamGR/qCyEXKALLGpkm17079iaWStaKFhhMpRVJX8ObbSNn5QFlPeJ9 /QQCSCi3J4lmBixTTGe30U5Geh+CA5mU4u1bEr4HzLZcvBgROIvE0+LDV/sXEEqQI7qF dNTw== 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=8STNvO/W+/tH6mis7cVRJ3Dc57rX86y55WPHAXp51vA=; b=wyAwBWuFjfuJvlklyJHGlMh5Lx18EOrZFrEVS3M+Is0ECsMQqumyyu5iNsiaZ3muBU 3vnDEtrsGQUJOILp7ZiGWKCWvQk4FR67lILWek2YNw8vUutLBaE02Vo7k3edPVcU0M5F J/Zt9Sqw+zukQsJCqKJVWhDJ+hc0XgDi4KnKbj+govEahx/gPOU74XCReQujZ02VT9dP 5PtuJ3mEJmFVYRd2nmF9hZVNskY+esNMlFBjfn/lbbjAt5qIODul4sYzAqpzpd6qYa3X +gXFMXmzvT9ql7xzZ2V/JQY6+4V6X9irfvkZ12CzIpyXl5U9X0AQUEZI9qRPDKavhfT/ kziA== X-Gm-Message-State: AOAM531ndoCBq/7/Mw4WcBL0KpQYzdjzLT7KvXsOMlpDzoaLowZnBmC+ 6ldnKkhpEsgxz6ZAnio5wI62qrScFmzr2whLwWXrJa39i8Mtuqg3rQsU85QR746d2nDXN0yZjf0 y3sI0KUproYuEoynwQVlx4J4fpDaxH0Jo8GE038UJbFQunqdRc5UkwXUfOxKDBLY= X-Google-Smtp-Source: ABdhPJxUvKbejiUbAT4D+8m44/T92Bf4fwoQkvcqyb2zCtR582bmgXPXtYeU7QXWaMMliTmrlAoIrINN/fDsIQ== X-Received: from ricarkol2.c.googlers.com ([fda3:e722:ac3:cc00:24:72f4:c0a8:62fe]) (user=ricarkol job=sendgmr) by 2002:a05:6a00:16c6:b029:32d:e190:9dd0 with SMTP id l6-20020a056a0016c6b029032de1909dd0mr7029829pfc.70.1632854893435; Tue, 28 Sep 2021 11:48:13 -0700 (PDT) Date: Tue, 28 Sep 2021 11:47:58 -0700 In-Reply-To: <20210928184803.2496885-1-ricarkol@google.com> Message-Id: <20210928184803.2496885-5-ricarkol@google.com> Mime-Version: 1.0 References: <20210928184803.2496885-1-ricarkol@google.com> X-Mailer: git-send-email 2.33.0.685.g46640cef36-goog Subject: [PATCH v3 04/10] 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. Signed-off-by: Ricardo Koller Reviewed-by: Eric Auger --- 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..321743b87002 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 Sep 28 18:47:59 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ricardo Koller X-Patchwork-Id: 12523559 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 6697BC433EF for ; Tue, 28 Sep 2021 18:48:18 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 45E2460ED7 for ; Tue, 28 Sep 2021 18:48:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242300AbhI1St5 (ORCPT ); Tue, 28 Sep 2021 14:49:57 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56336 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242311AbhI1Stz (ORCPT ); Tue, 28 Sep 2021 14:49:55 -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 464FDC06161C for ; Tue, 28 Sep 2021 11:48:16 -0700 (PDT) Received: by mail-pg1-x54a.google.com with SMTP id q185-20020a6343c2000000b00287c0b1723eso36638pga.5 for ; Tue, 28 Sep 2021 11:48:16 -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=F7aqOIEmOFV8diRfZp4dNiKd4MPkYLZp/qoxZ1VUK2U=; b=KlPS1tJZw9GoWeMpxib832vHY3m3bVqzvlJ+jzwWA/Okcl2jcAda9LpHym0WjgwhEz HLXLoYUW0guPWluWegHRMHmKUY9Wd1yR7AdOjZKbDo032cweOdAoAW0i3kdxx9XBm7TR 29jGuUCmMS2pg4yyo9Jw49VwyGml9V4860KPutHajy0x25xD8Qahe76m6/W+TYYs6JD+ C9tXvuqMlHEKzgaNKRUAgrzmXx1GIOhGLrLobbaRlrj+OiAYieHSaeHp3yeQmfVrlfk9 jwF7vJN06Eokow+PvmZ3bWSSBOUO7BPGZmqakopw02VGqP93uN7k1fr26F3++r0/jGOi Xr5g== 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=F7aqOIEmOFV8diRfZp4dNiKd4MPkYLZp/qoxZ1VUK2U=; b=32U57CUf4jcZTuqfoEz0wBHy8qafLbLpRTqkzZUSwu2SZG1gw4msBsrLdYpF2Rv3n9 JBSdQk8omc2eVn0RDk3qZLZacqXkv2lzyRw9L1GtbLB0F5AbXUMW2YIu0s3h+YizGjen kc9/Iw4OU6fi76Zu497Dr05jJUl223Uu0IN6vcdnvBUwKRwc3BNukM848fYyD3tiz6Y+ NBU8oa9UXmSD24WiL8NB460zMhYP+dO84o4/mpfwiGHI0W4rnq+/8N+5eLEh0suCr3oh G2DEevptH48VZKERWhsN/GP0zC6r7tmHD5PgtFNaRSo0Xo2tFYDLfZExWQ1wBPhZIo4K NFXg== X-Gm-Message-State: AOAM531WytY6U9ZuvQVUwgQDVFfZBkhFW0VMZHA71Vq4iyUPFuNIB+28 fQ9CWeTKceMUWXCWNfrc95To3yYs/e4v0jvrW7fgpfyIuK/XU9V+OrJtTq+dfytTTOVn7JiLAis m9KddakvQZMhqI35NpRmjUN+2F67EohMtMGJyAcSYCT/s6jDQqmDqsAHaVAuTrIk= X-Google-Smtp-Source: ABdhPJybyOlsvI4Y9Hh810B6h4bfDyVtA3FzCarDmWRVzOfE+SgT8Rm5EdcPHbXB97QInEIXyVu3X6IFFJ4Pxg== X-Received: from ricarkol2.c.googlers.com ([fda3:e722:ac3:cc00:24:72f4:c0a8:62fe]) (user=ricarkol job=sendgmr) by 2002:a17:90b:1013:: with SMTP id gm19mr142195pjb.1.1632854895088; Tue, 28 Sep 2021 11:48:15 -0700 (PDT) Date: Tue, 28 Sep 2021 11:47:59 -0700 In-Reply-To: <20210928184803.2496885-1-ricarkol@google.com> Message-Id: <20210928184803.2496885-6-ricarkol@google.com> Mime-Version: 1.0 References: <20210928184803.2496885-1-ricarkol@google.com> X-Mailer: git-send-email 2.33.0.685.g46640cef36-goog Subject: [PATCH v3 05/10] 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. Signed-off-by: Ricardo Koller Reviewed-by: Eric Auger --- .../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 Sep 28 18:48:00 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ricardo Koller X-Patchwork-Id: 12523561 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 1C0ECC433F5 for ; Tue, 28 Sep 2021 18:48:19 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 028E460ED7 for ; Tue, 28 Sep 2021 18:48:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242308AbhI1St5 (ORCPT ); Tue, 28 Sep 2021 14:49:57 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56342 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242317AbhI1St4 (ORCPT ); Tue, 28 Sep 2021 14:49:56 -0400 Received: from mail-pj1-x104a.google.com (mail-pj1-x104a.google.com [IPv6:2607:f8b0:4864:20::104a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 38007C06161C for ; Tue, 28 Sep 2021 11:48:17 -0700 (PDT) Received: by mail-pj1-x104a.google.com with SMTP id b11-20020a17090aa58b00b0019c8bfd57b8so15062698pjq.1 for ; Tue, 28 Sep 2021 11:48:17 -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=fUDvleBJkSGe8lOh3dkmzfGX4tHDQ1QKX/RO2ptqrSo=; b=Z/RQfgzZk+32gteH7i4kLw8gjtuBJ7t3NViFbhZXp8sry6tFNAHRXo5U4RgNhBY3d0 sj4AhyFVQiC83kUxXxgTV4jowAJUgQLeqdvdpMwCRQWyD1Njj6x1AQHULah81+vgUPrD Oo1VDq4SYKoXMvcKMSrM6I3kft28OzdEO9TVb3l0SX9m4evY8RzIUff7mJwbS6Tf+g1v bC14awJMU2nNgl45jjhNqJXXw0ePyq4scvCHXKWWlcJzmKfLZfr3jzNWX3QSx8Prrvko i89+gvWWvWO9bWbMa/feewXtcNDfiy5Hb49ytXAwA3incJRdyHYCbl+k3+Dk0MHPa9Ua EsFg== 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=fUDvleBJkSGe8lOh3dkmzfGX4tHDQ1QKX/RO2ptqrSo=; b=x1P13vnbB0RgoKKPnHpcU+8cJL6MZsxM/l6epuu9Am1u2s7djVU1TSAuQLp/m1hS0U HoQ4Aj14uPvhQxCz9RN5C/f7TIVNuQf7R4NU/gvzPETfrRMO0vWOBCuw2i4nhu8WQBqn mpGQxVSfWgQWdNfgLhdopGe2Y3Isx7EQRx4m5WdsQel96S6w7N14s85Pu79LH3b5ZInD AsQnYo+CjEmU8/lIUnb9pNBXGuWtSS0iadLRzHSn1cHR10LFy+SFTmusvdWpgLKrueLl IvtKWHM8eWoRSxn0ChfOYCYjWvW2+lx+vZUBFcSuK8QLzLv1YyO4z2VVP2RAisADhgDB s2dg== X-Gm-Message-State: AOAM530K2s9nuCFX3nMV4yhigKvbbRTutq0NSjiPSlBKeTBq66fj8pN8 Gjp3BBCBrGek0bfazkOKTP9k7OvWzLUnQK5v6KoUTlx9oVU9pwUXgIQuIKXqDGxNYsMGB7Ncc1N CZypFrP7p0GPARGp9hohFjWzmQQebpftvC9q+tr4QckijkLtQyWcZxqLZVPSphv8= X-Google-Smtp-Source: ABdhPJxaPCod77YHjCMJtVQ4TqKDfVDSlfTU/H6e5uSeMsoXLnWnEuutJ+cCD0WdDIinQKs7VL8KioR3BtNsZg== X-Received: from ricarkol2.c.googlers.com ([fda3:e722:ac3:cc00:24:72f4:c0a8:62fe]) (user=ricarkol job=sendgmr) by 2002:a05:6a00:1481:b0:43d:275b:7ba4 with SMTP id v1-20020a056a00148100b0043d275b7ba4mr7148929pfu.63.1632854896636; Tue, 28 Sep 2021 11:48:16 -0700 (PDT) Date: Tue, 28 Sep 2021 11:48:00 -0700 In-Reply-To: <20210928184803.2496885-1-ricarkol@google.com> Message-Id: <20210928184803.2496885-7-ricarkol@google.com> Mime-Version: 1.0 References: <20210928184803.2496885-1-ricarkol@google.com> X-Mailer: git-send-email 2.33.0.685.g46640cef36-goog Subject: [PATCH v3 06/10] 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. Signed-off-by: Ricardo Koller Reviewed-by: Eric Auger --- .../testing/selftests/kvm/aarch64/vgic_init.c | 21 +++++++++++-------- 1 file changed, 12 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..b24067dbdac0 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; } @@ -153,6 +155,8 @@ static void subtest_v3_redist_regions(struct vm_gic *v) uint64_t addr, expected_addr; int ret; + TEST_ASSERT(VGIC_DEV_IS_V3(v->gic_dev_type), "Only applies to v3"); + ret = kvm_device_check_attr(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, KVM_VGIC_V3_ADDR_TYPE_REDIST); TEST_ASSERT(!ret, "Multiple redist regions advertised"); @@ -257,8 +261,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 +281,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 +298,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 +309,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 +323,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 Sep 28 18:48:01 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ricardo Koller X-Patchwork-Id: 12523563 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 6972FC433F5 for ; Tue, 28 Sep 2021 18:48:24 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 586F56124A for ; Tue, 28 Sep 2021 18:48:24 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242320AbhI1SuC (ORCPT ); Tue, 28 Sep 2021 14:50:02 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56350 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242325AbhI1St7 (ORCPT ); Tue, 28 Sep 2021 14:49:59 -0400 Received: from mail-qt1-x849.google.com (mail-qt1-x849.google.com [IPv6:2607:f8b0:4864:20::849]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 85871C06161C for ; Tue, 28 Sep 2021 11:48:19 -0700 (PDT) Received: by mail-qt1-x849.google.com with SMTP id n19-20020ac81e13000000b0029f679691eeso101743235qtl.20 for ; Tue, 28 Sep 2021 11:48:19 -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=mHySpLUqTDg2OB2pZY1bzI1vpeSiB7OP7e6Vc0QQG+g=; b=VdvlANnvR3RqyiBGqGl3eMdfcfQH5712cpPKL1c6Zt/rfwR0XN3tcGqfT+erFk2Pq8 RynqD/nM+P0GjEdra9i0wRPNaexE8mA/Lp6sr1JFz5hJd4BvjZpaPybF7x7jSmJA9K+a kdT6bfWUVgMt02H9o9Qyq3SHi8M7uybF6kPXzkn9BGhciix4nAk5zCmToHryezn/CwpV pKXzG+rxAG2SUd2MxNx61Sp9V76W9fX5qpKCsV9vXUHGfV6z76HlS7P82sKShhl9dBtN 2g/qbLi47kJb28BaIUA0D16w4MjLnuQ6JDfdV0Fjvq2rZwuFZ5MGAHq2hDj3qpDV3hvr wGdg== 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=mHySpLUqTDg2OB2pZY1bzI1vpeSiB7OP7e6Vc0QQG+g=; b=zMXrEHrmnFXOKYkpup0eVv0MiO4HX8VYJiPS/9tHz2ffgOUKsN33i5XMVB8UrEPx4S JX9QDaBhMk3bwa9MnpcOdaIdmiWShPb9ew3LFT/FwDmHV9AdTyGdu0rrLDbSeK347Dff 3YfDQlt9z6HY8GD2d7V1XvlBmpPOKFruyvCb9eU0HK+omn4HXiPA6zYFBdV3bBSJrH3E aN6gs9gEr7YXk+UQLyMq/+CXNLiAz1EU/ddLM7OLfrGG9bGlq5UlCGV70oMlUnau0x8b eVkMTRM5EkOCJH0CXpHkSozVH4CnudYkwjZf/XIsN3OGYuOiedg/NJGj/nW+gAMk55m4 swDg== X-Gm-Message-State: AOAM530sAoNDwcj9mpbX9R7OlB5THt8JLLwjBX1FPtBsrG0vhfQ92+Ym /oLPy7jAHS+ksJeB+SQFIiRjR8sHW29QWkAhhsSSPSbVpRJoSMHXUNwqExozeq2dr03su+qq1Yg 9jppYsqkBoeVojcF8D3pmcxm1+BAI/0BvnIH5KHV4HkViKoMoZbL7atQ4T+9AuLs= X-Google-Smtp-Source: ABdhPJwQKH6fCAaEup/HmoIhJjFbFyqIH4bHW1FHY/Faj8Qt4SMle1i01LllAvPY40KlDIjaZma+5pz9qAFv4g== X-Received: from ricarkol2.c.googlers.com ([fda3:e722:ac3:cc00:24:72f4:c0a8:62fe]) (user=ricarkol job=sendgmr) by 2002:a0c:a78a:: with SMTP id v10mr7107973qva.49.1632854898150; Tue, 28 Sep 2021 11:48:18 -0700 (PDT) Date: Tue, 28 Sep 2021 11:48:01 -0700 In-Reply-To: <20210928184803.2496885-1-ricarkol@google.com> Message-Id: <20210928184803.2496885-8-ricarkol@google.com> Mime-Version: 1.0 References: <20210928184803.2496885-1-ricarkol@google.com> X-Mailer: git-send-email 2.33.0.685.g46640cef36-goog Subject: [PATCH v3 07/10] 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/REDIST 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 --- .../testing/selftests/kvm/aarch64/vgic_init.c | 107 ++++++++++++------ 1 file changed, 75 insertions(+), 32 deletions(-) diff --git a/tools/testing/selftests/kvm/aarch64/vgic_init.c b/tools/testing/selftests/kvm/aarch64/vgic_init.c index b24067dbdac0..92f5c6ca6b8b 100644 --- a/tools/testing/selftests/kvm/aarch64/vgic_init.c +++ b/tools/testing/selftests/kvm/aarch64/vgic_init.c @@ -79,74 +79,116 @@ 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. A RDIST region (legacy in the case of GICv3) is set at @0x0 and + * a DIST region is set @0x70000 for GICv3 and @0x1000 for GICv2. */ -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"); + if (VGIC_DEV_IS_V3(v->gic_dev_type)) { + /* 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 */ @@ -256,14 +298,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) @@ -276,14 +318,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"); @@ -552,9 +594,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 Sep 28 18:48:02 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ricardo Koller X-Patchwork-Id: 12523565 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 618EAC433FE for ; Tue, 28 Sep 2021 18:48:25 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 4D12360ED7 for ; Tue, 28 Sep 2021 18:48:25 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242138AbhI1SuD (ORCPT ); Tue, 28 Sep 2021 14:50:03 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56356 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242329AbhI1SuA (ORCPT ); Tue, 28 Sep 2021 14:50:00 -0400 Received: from mail-pj1-x1049.google.com (mail-pj1-x1049.google.com [IPv6:2607:f8b0:4864:20::1049]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 996EEC061745 for ; Tue, 28 Sep 2021 11:48:20 -0700 (PDT) Received: by mail-pj1-x1049.google.com with SMTP id z24-20020a17090a8b9800b0019f0a4d03d9so3084862pjn.3 for ; Tue, 28 Sep 2021 11:48:20 -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=DAIt+H09/55OKEtE9w5bih5JH14ibKqMeAyogQTb7NA=; b=V9boUQARyAIacnbUDUeErmiotuKDAaOjvI+Zyh7Jk5DyJcOgLKNUNUcZAK9+AtDYsM 5DrGTDpuf4+k7NM4GiefH0KhqJrY7VWQc6Pb/QB0EEAZvTSML9AHMANHOhl6QqjiRhr1 zf/PRkGQBSLNNkUlOyUPQV8A3F7BjQDw73jU8AHk5ZHkGb0d99YhkvmpA+QsIv0q78vj 3+S5u08Tz7CpqyUSQpecNBbb8g7V9IqJolvOU7ZXpnAnSBzpm36x37L+IDuWJahhxM0i /xJI65YMZfH9Ds+OWKK5idobadvujKpxvgt7RJZpWCVuYCZmum/9AAXyEH/EXuBzphYB 6BPw== 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=DAIt+H09/55OKEtE9w5bih5JH14ibKqMeAyogQTb7NA=; b=7yE75WpNEx5p3yD5T0qOC2AV/atGpyT4FBwg6DGIE0pjeWamPLYzJ0yJJfbg1sfo/R axq9RFIOnSa7sJl0Dgg/fcxJ3m5KhwHn1Tde9gPOjDkDryoabplzopladbYAH9YJs+De GCRuY3hrSwNpufEmOJa7RnsFLt1tmKeX2jp25EcrDh/U6Vgfu1Q/Qmg6C0CFTJ77zoAE WQnunoHwngeqGVVQc5WrWwVshKV1HWh59Spgzdkr30g6Sq8geVRs9Bim43S0+tB5zXjW 5rYYw8eMe0boG94OYzeIctNdyQYeg4/7gd8iFVyBELkmPPMtjI2nr+Wa+MMZTKI1Ikuz WLaA== X-Gm-Message-State: AOAM530SzcnnT86TJ0L8jRVmOqozHZRourL3hxMz8n+Vv8qzYXAISzLc 6XxrwPYk4nX8QIbMQm75vcH4gcj97ndkavYF2lysGljkbxDX+y8ehnk4chkYnTrM8teIunOshO9 Lx6l8K0LzqMCbZ70vf1R8Bu77iV7qCQjNEA7Rb1GV6keeYp/QOiNaTb9MaZZZDVI= X-Google-Smtp-Source: ABdhPJzBsTVis9j8OArZICNpPTg91je2dRVms+08Gd+Zw0+o9ENIltafYzAWzsGkahkSD6Zbrj6mYRkqyxOFEg== X-Received: from ricarkol2.c.googlers.com ([fda3:e722:ac3:cc00:24:72f4:c0a8:62fe]) (user=ricarkol job=sendgmr) by 2002:aa7:8f11:0:b0:44b:21bf:b76 with SMTP id x17-20020aa78f11000000b0044b21bf0b76mr6991440pfr.43.1632854899868; Tue, 28 Sep 2021 11:48:19 -0700 (PDT) Date: Tue, 28 Sep 2021 11:48:02 -0700 In-Reply-To: <20210928184803.2496885-1-ricarkol@google.com> Message-Id: <20210928184803.2496885-9-ricarkol@google.com> Mime-Version: 1.0 References: <20210928184803.2496885-1-ricarkol@google.com> X-Mailer: git-send-email 2.33.0.685.g46640cef36-goog Subject: [PATCH v3 08/10] 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 --- .../testing/selftests/kvm/aarch64/vgic_init.c | 46 ++++++++++++++----- 1 file changed, 35 insertions(+), 11 deletions(-) diff --git a/tools/testing/selftests/kvm/aarch64/vgic_init.c b/tools/testing/selftests/kvm/aarch64/vgic_init.c index 92f5c6ca6b8b..77a1941e61fa 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, @@ -150,16 +150,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; @@ -248,7 +253,21 @@ 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(1, max_phys_size - 0x10000, 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, @@ -608,8 +627,13 @@ void run_tests(uint32_t gic_dev_type) int main(int ac, char **av) { int ret; + int max_ipa_bits, 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; + TEST_ASSERT(max_ipa_bits && pa_bits <= max_ipa_bits, + "The default PA range should not be larger than the max."); + max_phys_size = 1ULL << pa_bits; ret = test_kvm_device(KVM_DEV_TYPE_ARM_VGIC_V3); if (!ret) { From patchwork Tue Sep 28 18:48:03 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ricardo Koller X-Patchwork-Id: 12523567 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 781B0C433EF for ; Tue, 28 Sep 2021 18:48:26 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 5FA276124A for ; Tue, 28 Sep 2021 18:48:26 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242321AbhI1SuE (ORCPT ); Tue, 28 Sep 2021 14:50:04 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56370 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242273AbhI1SuC (ORCPT ); Tue, 28 Sep 2021 14:50:02 -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 1D589C061753 for ; Tue, 28 Sep 2021 11:48:22 -0700 (PDT) Received: by mail-yb1-xb49.google.com with SMTP id q8-20020a056902150800b005b640f67812so19315052ybu.8 for ; Tue, 28 Sep 2021 11:48:22 -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=ZhEmB78EvpVTOsANLrCosu8pC98ZcmeaZO8tz0FwGlI=; b=YNSS8yS/z8jbHApl7mmywh0W1TLkLd6JZW49ibxi38G0CqByei3gUhtbVVxcFCqznL +eSsAuKpRCII6ctpAJcMLK326hVO9wf6Qjvb1e9jXGnbGH/7gyzCelwLv33aSk7XkPyY WIuuK9d2jFhVnU6d9niPepKKA3DMV2pipGQ7dclPi7UGDZIu+GrbJt8UKsgcUF26H9b6 o3vAZSIUZAcmLp2DDQk0w3bzO+VAD1+87XkH6BnUlPEXFWJCVeYmz60YJEBqrfk7/1qm AhEpJU+tSBBYGt+qBlpBNkVNzMtzmgVuViMRfT69EWX3K5xUUyVAZr6wQz0mUQVP5O5b 3lDQ== 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=ZhEmB78EvpVTOsANLrCosu8pC98ZcmeaZO8tz0FwGlI=; b=jC6QmlfulEqWjRRAL8LQdYNa/oMANAsEn7d1Iw7TzFX42QrIcgWQMZkzzqFWdPdQ0m ZQWOqgUW4ILjCVDrF9oGDMx7DfuPwTkL6y2ZC4MBUUGLmGy9Wi6hlUo8i+wubaJfFtW4 KADQuxA7ktZzlvpVDlaauEReWH5q7Q1OWV3JihmthP7T1kvg4Q+Oam8FpBRtJv+WzJ9J +6vGeOj/RQzUnGWKoMIzm3KQpxjsknMtUh4ZIQyKN4S82IGwOMddHh15+8tb2CNzEvbX 5BtEMBArWkwZXTlxflusup3bULjtT7tL2zvSjAwlZFXx+6PbkHEk5RWBgCWdTO9v6gvd RBQg== X-Gm-Message-State: AOAM532C7WEM/2Xdj5wMu8wlHQLo58vOC7zYXs+xBNdmIPRNCeWS9sjT RGeoX9DJPdBg2pqq7+9sEu3Gsu6oXJ1WZtCy1juwV+50in/r2fHYZA3E4S13Wz/tWaxh4tk8Mvv Y+k0zx2BeKu9J+UHBnMrLHJj/7HM+1y+ubRWViiI/imtpl0bUnDWWWg/ZzIYqgug= X-Google-Smtp-Source: ABdhPJzDRwtz5/PIS4rEfzA7iNdd+2JLcH0fuSM5FcZ6MjFSl3lzeEEHGCn8BGM6vv2p+Afxprn6T8QiiqVT3w== X-Received: from ricarkol2.c.googlers.com ([fda3:e722:ac3:cc00:24:72f4:c0a8:62fe]) (user=ricarkol job=sendgmr) by 2002:a25:22d7:: with SMTP id i206mr9011325ybi.355.1632854901316; Tue, 28 Sep 2021 11:48:21 -0700 (PDT) Date: Tue, 28 Sep 2021 11:48:03 -0700 In-Reply-To: <20210928184803.2496885-1-ricarkol@google.com> Message-Id: <20210928184803.2496885-10-ricarkol@google.com> Mime-Version: 1.0 References: <20210928184803.2496885-1-ricarkol@google.com> X-Mailer: git-send-email 2.33.0.685.g46640cef36-goog Subject: [PATCH v3 09/10] 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. Signed-off-by: Ricardo Koller Reviewed-by: Eric Auger --- .../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 77a1941e61fa..417a9a515cad 100644 --- a/tools/testing/selftests/kvm/aarch64/vgic_init.c +++ b/tools/testing/selftests/kvm/aarch64/vgic_init.c @@ -570,6 +570,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). */ @@ -621,6 +654,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 Wed Sep 29 00:10: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: 12524219 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 5D9D1C433EF for ; Wed, 29 Sep 2021 00:10:17 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 414D6613C8 for ; Wed, 29 Sep 2021 00:10:17 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S243372AbhI2AL4 (ORCPT ); Tue, 28 Sep 2021 20:11:56 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46180 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240284AbhI2ALz (ORCPT ); Tue, 28 Sep 2021 20:11:55 -0400 Received: from mail-pj1-x104a.google.com (mail-pj1-x104a.google.com [IPv6:2607:f8b0:4864:20::104a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0CADCC06161C for ; Tue, 28 Sep 2021 17:10:15 -0700 (PDT) Received: by mail-pj1-x104a.google.com with SMTP id d16-20020a17090ab31000b0019ec685f551so2766550pjr.0 for ; Tue, 28 Sep 2021 17:10:15 -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=2MtiYmsIZAKiCkiOVDptQ2jlzTFkcgsG+KFRVqe4f7g=; b=OcduwanS9+zbQtBQIsn7QLDWapwaawQ6JYaomhRYXBHwKP3XxspuKTqdNY7AHjZ8LF Mam7c87/hCgEunUPqruWzUs0W0B2vL/lnW0dDhkCDckbXOw81whQkk3s1mqsRZooDgNd aa4wWGsEiK5jw4PFOucqC9dvc8Tu7MRjkDenf6dtdNlaXrgKsh5kxuYsn54X9sAM2iY4 Veszu21OfBFfpXUYQlikUUb/Ksiw6p9HgOtBfCHH5dRihO4A+S3VGBRPld3pkvmYmojB hQ0jQzZhtUqUyDzVt5neAxmB5AnVksFqNVWTvTvgGFJOSQig230no6FXWPAggEKIPEiD ihow== 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=2MtiYmsIZAKiCkiOVDptQ2jlzTFkcgsG+KFRVqe4f7g=; b=esE6+2gjKf5ZNZu4KizQaOqyBw5yscy8arNXPQY4ycHg0tlJ5YFmuF/2aw1/dwDnIA 8opj5FSyuI597NkZI3FMWPmHgb4TyGs2kirsyTgIG1s6JtjwXMg+Jh+C95avcXAV6T+s mqKDVdiFb0Ha2XNJIArXLcPqH7hL9Ky+dQ2kw6BwJtcnxuEjaJiJmgYbLut5CYJ1P31X qgt2ACov977u0iBZzRPqSAladsHRUnwowOC9VtwWNTOdT6wqo1YS5BPdK/jvATv3MLJQ 04lUThQoEQ9SgPrCahSyNBXdOn0bN/XN8PWH0x9JuSrPbngmnE4AEbmwEXgVnSELqwDr x9kA== X-Gm-Message-State: AOAM533Lxlvo1/fULzapCzaVT94FvyhvTDjGJLMPVto8cFJO4UJATo5D 5RKddSZPcn+7HZMIUMvTeBVs0Mgjnt9bWbz7k9nuIX9ILFm40wrldUOiZhZRHWTzte0RtaGifZg 9sLH2UAJOySqIQzmBHmutaSIDjHfqR0Tc3VceFp3VM+p8dobjbBz4+n0njj5XffU= X-Google-Smtp-Source: ABdhPJzkzLjl4g92VY7arsAEzBKHD6nwmq0Y1oE1FPFvZWFUloyF1dOqEoVeAe2wWT4qPxV/MTdo5z8oskqrWg== X-Received: from ricarkol2.c.googlers.com ([fda3:e722:ac3:cc00:24:72f4:c0a8:62fe]) (user=ricarkol job=sendgmr) by 2002:a17:902:7b85:b0:13d:cdc4:9531 with SMTP id w5-20020a1709027b8500b0013dcdc49531mr7715978pll.27.1632874214400; Tue, 28 Sep 2021 17:10:14 -0700 (PDT) Date: Tue, 28 Sep 2021 17:10:12 -0700 In-Reply-To: <20210928184803.2496885-1-ricarkol@google.com> Message-Id: <20210929001012.2539461-1-ricarkol@google.com> Mime-Version: 1.0 References: <20210928184803.2496885-1-ricarkol@google.com> X-Mailer: git-send-email 2.33.0.685.g46640cef36-goog Subject: [PATCH v3 10/10] KVM: arm64: selftests: Add basic ITS device tests 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 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 --- .../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 417a9a515cad..180221ec325d 100644 --- a/tools/testing/selftests/kvm/aarch64/vgic_init.c +++ b/tools/testing/selftests/kvm/aarch64/vgic_init.c @@ -603,6 +603,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). */ @@ -655,6 +696,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(); } }