From nobody Mon Jun 15 03:56:44 2026 Received: from desiato.infradead.org (desiato.infradead.org [90.155.92.199]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EFBDD379EF5; Tue, 7 Apr 2026 21:11:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=90.155.92.199 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775596286; cv=none; b=s5IfMtRJcRs5trUGUGu4CsVQXczr3JskfOOOCFyyU76cDkh5i/EqM9w++ICSluAr10u+qcJL10BzNlvyps/IYaMIbOZPbnq/KnwqEvcdeAS2hJ2vD/swIfFU2UDZnLrKpggOVG+nexO2qpNflBpIgrMjdtUsCuBqRYqOICOtGfM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775596286; c=relaxed/simple; bh=Ajuzsjg/Cf2qcXgx5GwQHeA+SfOmkYob0TtKDg9ZQLA=; h=From:To:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=sRESqImPFEPIWC1laiKJm263GibeYg75Ym6A4kQua8TVsZh7pzYkQYcK29wxtLFUA9HQUimy4ORHRT0FVZtoUtDqLaK5KxJ/NoiWnbMPyfXIe8MHo4dxILhdiODqA5NzdGG2ewm2uk1KITPrEahw65wYfMJ8/Iljhd9ihPcBv84= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=infradead.org; spf=none smtp.mailfrom=desiato.srs.infradead.org; dkim=pass (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b=S7FdKYm8; arc=none smtp.client-ip=90.155.92.199 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=infradead.org Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=desiato.srs.infradead.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="S7FdKYm8" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=desiato.20200630; h=Sender:Content-Transfer-Encoding: Content-Type:MIME-Version:References:In-Reply-To:Message-ID:Date:Subject:To: From:Reply-To:Cc:Content-ID:Content-Description; bh=1kforik9uy69TfUQgLYXH+zurjDPH+VKlQTBhGCuRn0=; b=S7FdKYm8m8Q6E5F+w87Sob5wkq vNN6qfRacRcwgItvVypsDsOqO7ppW9ciW+QRroBsS+jhc3PF+g/Hrztn9l1bge1OTLAsU0aU6hA1U 9pgE9G6JTwAQXuSTDA91olY0OiFWFhFjvUs+8Esb/i6/BCZnXIz333USLaV94feL7dopAAuHL3R/0 AoCCXQ/CJ85RBdGNSam5c+L9/1NNNlxjEW4/79LiTrD2JTntG8U2wGblM31/2ol2qH0Upm9mampfi Ek17vR8hDwWAxpoOO8lHrS/WRS3wTA6Kb2ZctpzkPQQ9zs4q31t1O8uFESP9xu83yekpj3+rL3n5b nw6iuUQg==; Received: from [2001:8b0:10b:1::425] (helo=i7.infradead.org) by desiato.infradead.org with esmtpsa (Exim 4.98.2 #2 (Red Hat Linux)) id 1wADgK-000000095Qy-051p; Tue, 07 Apr 2026 21:10:00 +0000 Received: from dwoodhou by i7.infradead.org with local (Exim 4.98.2 #2 (Red Hat Linux)) id 1wADgI-00000008iI8-1tBx; Tue, 07 Apr 2026 22:09:54 +0100 From: David Woodhouse To: Marc Zyngier , Oliver Upton , Joey Gouly , Suzuki K Poulose , Zenghui Yu , Catalin Marinas , Will Deacon , Paolo Bonzini , Shuah Khan , David Woodhouse , Raghavendra Rao Ananta , Eric Auger , Kees Cook , Arnd Bergmann , Nathan Chancellor , linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-kernel@vger.kernel.org, kvm@vger.kernel.org, linux-kselftest@vger.kernel.org Subject: [PATCH 1/3] KVM: arm64: vgic: Fix IIDR revision field extracted from wrong value Date: Tue, 7 Apr 2026 21:27:02 +0100 Message-ID: <20260407210949.2076251-2-dwmw2@infradead.org> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260407210949.2076251-1-dwmw2@infradead.org> References: <20260407210949.2076251-1-dwmw2@infradead.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Sender: David Woodhouse X-SRS-Rewrite: SMTP reverse-path rewritten from by desiato.infradead.org. See http://www.infradead.org/rpr.html From: David Woodhouse The uaccess write handlers for GICD_IIDR in both GICv2 and GICv3 extract the revision field from 'reg' (the current IIDR value read back from the emulated distributor) instead of 'val' (the value userspace is trying to write). This means userspace can never actually change the implementation revision =E2=80=94 the extracted value is always the current= one. Fix the FIELD_GET to use 'val' so that userspace can select a different revision for migration compatibility. Fixes: 49a1a2c70a7f ("KVM: arm64: vgic-v3: Advertise GICR_CTLR.{IR, CES} as= a new GICD_IIDR revision") Signed-off-by: David Woodhouse --- arch/arm64/kvm/vgic/vgic-mmio-v2.c | 2 +- arch/arm64/kvm/vgic/vgic-mmio-v3.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/arm64/kvm/vgic/vgic-mmio-v2.c b/arch/arm64/kvm/vgic/vgic-= mmio-v2.c index 406845b3117c..0643e333db35 100644 --- a/arch/arm64/kvm/vgic/vgic-mmio-v2.c +++ b/arch/arm64/kvm/vgic/vgic-mmio-v2.c @@ -91,7 +91,7 @@ static int vgic_mmio_uaccess_write_v2_misc(struct kvm_vcp= u *vcpu, * migration from old kernels to new kernels with legacy * userspace. */ - reg =3D FIELD_GET(GICD_IIDR_REVISION_MASK, reg); + reg =3D FIELD_GET(GICD_IIDR_REVISION_MASK, val); switch (reg) { case KVM_VGIC_IMP_REV_2: case KVM_VGIC_IMP_REV_3: diff --git a/arch/arm64/kvm/vgic/vgic-mmio-v3.c b/arch/arm64/kvm/vgic/vgic-= mmio-v3.c index 89edb84d1ac6..5913a20d8301 100644 --- a/arch/arm64/kvm/vgic/vgic-mmio-v3.c +++ b/arch/arm64/kvm/vgic/vgic-mmio-v3.c @@ -194,7 +194,7 @@ static int vgic_mmio_uaccess_write_v3_misc(struct kvm_v= cpu *vcpu, if ((reg ^ val) & ~GICD_IIDR_REVISION_MASK) return -EINVAL; =20 - reg =3D FIELD_GET(GICD_IIDR_REVISION_MASK, reg); + reg =3D FIELD_GET(GICD_IIDR_REVISION_MASK, val); switch (reg) { case KVM_VGIC_IMP_REV_2: case KVM_VGIC_IMP_REV_3: --=20 2.51.0 From nobody Mon Jun 15 03:56:44 2026 Received: from casper.infradead.org (casper.infradead.org [90.155.50.34]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 48D9337AA82; Tue, 7 Apr 2026 21:10:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=90.155.50.34 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775596210; cv=none; b=OsSK6OAPeuiZPfPLIe5qBLm5EMDsvFefMA2z7wGGPdHo/DObHyTEVg6lVIhDw+HJozbBSgXbvzk8L3XLtNN484ony3HMjw0XXo+oyY5L6GGcgmY1gjG4uEANyDTWXWIAGQe8umwnVxN0gtwZ9xU95PyJ61+XNUnr4Z7xt5s6I2Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775596210; c=relaxed/simple; bh=lH1xONMurjI8VuImvaz/o871XJjqcEmhhoQcyh+xb88=; h=From:To:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=gRSud7o99WOwaYpRg+NiWJm5SB/aYbMB7UNT9eA7mj/kzP3etudhm3D2V5V1rktM6A/5uX6ydbbx814GrLSD2vqaVsiH6vhsGSIYKb4cQ3EvEbz9kxoMpZdA3cIcfjuxFvDacVvcQTM7kCMvkqe7JP6hGzxq3L4zSwjLIzVtBF0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=infradead.org; spf=none smtp.mailfrom=casper.srs.infradead.org; dkim=pass (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b=ZV3n1nKq; arc=none smtp.client-ip=90.155.50.34 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=infradead.org Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=casper.srs.infradead.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="ZV3n1nKq" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=Sender:Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-ID:Date:Subject:To:From:Reply-To: Cc:Content-Type:Content-ID:Content-Description; bh=1cngJlnIlPxMsTV4SXm02aZ7wJ4Q9rU8NrxN7v94io8=; b=ZV3n1nKqH48ExdKXkA56lqEqgz YX2I6uzyquwqXj1doPwXw7hRQsduWM1eTOYsrxPstKcZXPCpfLvJI9i41s6q8h33cECTzu5RgrOWM ev5nqmCozbs1FD5EGojR7Ak2Le7olTXi+PYu+OHmY3p2IsYfImaqiG2OAh9o6rcJZsbaBOCZGHnxE 8QHX/3ULjj6YBCvVCwE6YFmqskvixkpl7EPLgN5b2ZJjivA5ejp89vSi+qLABOqnfPIR9Mm32ksl0 S79ZRQIc0UGUzoM/0UDLh6Xnxggvn8CimCDiWwos4ktbCSI9VypxF2trrcLRzvtbSkLh/ZdOWIYIs 07mEiyCw==; Received: from [2001:8b0:10b:1::425] (helo=i7.infradead.org) by casper.infradead.org with esmtpsa (Exim 4.98.2 #2 (Red Hat Linux)) id 1wADgI-00000004GbA-3bHu; Tue, 07 Apr 2026 21:09:54 +0000 Received: from dwoodhou by i7.infradead.org with local (Exim 4.98.2 #2 (Red Hat Linux)) id 1wADgI-00000008iIB-20Dt; Tue, 07 Apr 2026 22:09:54 +0100 From: David Woodhouse To: Marc Zyngier , Oliver Upton , Joey Gouly , Suzuki K Poulose , Zenghui Yu , Catalin Marinas , Will Deacon , Paolo Bonzini , Shuah Khan , David Woodhouse , Raghavendra Rao Ananta , Eric Auger , Kees Cook , Arnd Bergmann , Nathan Chancellor , linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-kernel@vger.kernel.org, kvm@vger.kernel.org, linux-kselftest@vger.kernel.org Subject: [PATCH 2/3] KVM: arm64: vgic: Allow userspace to set IIDR revision 1 Date: Tue, 7 Apr 2026 21:27:03 +0100 Message-ID: <20260407210949.2076251-3-dwmw2@infradead.org> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260407210949.2076251-1-dwmw2@infradead.org> References: <20260407210949.2076251-1-dwmw2@infradead.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: David Woodhouse X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org. See http://www.infradead.org/rpr.html Content-Type: text/plain; charset="utf-8" From: David Woodhouse Allow userspace to select GICD_IIDR revision 1, which restores the original pre-d53c2c29ae0d ("KVM: arm/arm64: vgic: Allow configuration of interrupt groups") behaviour where interrupt groups are not guest-configurable. When revision 1 is selected: - GICv2: IGROUPR reads as zero (group 0), writes are ignored - GICv3: IGROUPR reads as all-ones (group 1), writes are ignored - v2_groups_user_writable is not set This is implemented by checking the implementation revision in vgic_mmio_read_group() and vgic_mmio_write_group() and returning the fixed values when the revision is below 2. Fixes: d53c2c29ae0d ("KVM: arm/arm64: vgic: Allow configuration of interrup= t groups") Signed-off-by: David Woodhouse --- arch/arm64/kvm/vgic/vgic-mmio-v2.c | 5 +++++ arch/arm64/kvm/vgic/vgic-mmio-v3.c | 4 ++++ arch/arm64/kvm/vgic/vgic-mmio.c | 15 +++++++++++++++ include/kvm/arm_vgic.h | 1 + 4 files changed, 25 insertions(+) diff --git a/arch/arm64/kvm/vgic/vgic-mmio-v2.c b/arch/arm64/kvm/vgic/vgic-= mmio-v2.c index 0643e333db35..14aa49f86f60 100644 --- a/arch/arm64/kvm/vgic/vgic-mmio-v2.c +++ b/arch/arm64/kvm/vgic/vgic-mmio-v2.c @@ -20,6 +20,8 @@ * Revision 1: Report GICv2 interrupts as group 0 instead of group 1 * Revision 2: Interrupt groups are guest-configurable and signaled using * their configured groups. + * Revision 3: GICv2 behaviour is unchanged from revision 2. + * (GICv3 gains GICR_CTLR.{IR,CES}; see vgic-mmio-v3.c) */ =20 static unsigned long vgic_mmio_read_v2_misc(struct kvm_vcpu *vcpu, @@ -93,6 +95,9 @@ static int vgic_mmio_uaccess_write_v2_misc(struct kvm_vcp= u *vcpu, */ reg =3D FIELD_GET(GICD_IIDR_REVISION_MASK, val); switch (reg) { + case KVM_VGIC_IMP_REV_1: + dist->implementation_rev =3D reg; + return 0; case KVM_VGIC_IMP_REV_2: case KVM_VGIC_IMP_REV_3: vcpu->kvm->arch.vgic.v2_groups_user_writable =3D true; diff --git a/arch/arm64/kvm/vgic/vgic-mmio-v3.c b/arch/arm64/kvm/vgic/vgic-= mmio-v3.c index 5913a20d8301..0130db71cfc9 100644 --- a/arch/arm64/kvm/vgic/vgic-mmio-v3.c +++ b/arch/arm64/kvm/vgic/vgic-mmio-v3.c @@ -74,8 +74,11 @@ bool vgic_supports_direct_sgis(struct kvm *kvm) /* * The Revision field in the IIDR have the following meanings: * + * Revision 1: Interrupt groups are not guest-configurable. + * IGROUPR reads as all-ones (group 1), writes ignored. * Revision 2: Interrupt groups are guest-configurable and signaled using * their configured groups. + * Revision 3: GICR_CTLR.{IR,CES} are advertised. */ =20 static unsigned long vgic_mmio_read_v3_misc(struct kvm_vcpu *vcpu, @@ -196,6 +199,7 @@ static int vgic_mmio_uaccess_write_v3_misc(struct kvm_v= cpu *vcpu, =20 reg =3D FIELD_GET(GICD_IIDR_REVISION_MASK, val); switch (reg) { + case KVM_VGIC_IMP_REV_1: case KVM_VGIC_IMP_REV_2: case KVM_VGIC_IMP_REV_3: dist->implementation_rev =3D reg; diff --git a/arch/arm64/kvm/vgic/vgic-mmio.c b/arch/arm64/kvm/vgic/vgic-mmi= o.c index a573b1f0c6cb..9eb95f13b9b6 100644 --- a/arch/arm64/kvm/vgic/vgic-mmio.c +++ b/arch/arm64/kvm/vgic/vgic-mmio.c @@ -48,6 +48,17 @@ unsigned long vgic_mmio_read_group(struct kvm_vcpu *vcpu, u32 value =3D 0; int i; =20 + /* + * Revision 1 and below: groups are not guest-configurable. + * GICv2 reports all interrupts as group 0 (RAZ). + * GICv3 reports all interrupts as group 1 (RAO). + */ + if (vgic_get_implementation_rev(vcpu) < KVM_VGIC_IMP_REV_2) { + if (vcpu->kvm->arch.vgic.vgic_model =3D=3D KVM_DEV_TYPE_ARM_VGIC_V3) + return -1UL; + return 0; + } + /* Loop over all IRQs affected by this read */ for (i =3D 0; i < len * 8; i++) { struct vgic_irq *irq =3D vgic_get_vcpu_irq(vcpu, intid + i); @@ -73,6 +84,10 @@ void vgic_mmio_write_group(struct kvm_vcpu *vcpu, gpa_t = addr, int i; unsigned long flags; =20 + /* Revision 1 and below: groups are not guest-configurable. */ + if (vgic_get_implementation_rev(vcpu) < KVM_VGIC_IMP_REV_2) + return; + for (i =3D 0; i < len * 8; i++) { struct vgic_irq *irq =3D vgic_get_vcpu_irq(vcpu, intid + i); =20 diff --git a/include/kvm/arm_vgic.h b/include/kvm/arm_vgic.h index f2eafc65bbf4..90fb6cd3c91c 100644 --- a/include/kvm/arm_vgic.h +++ b/include/kvm/arm_vgic.h @@ -248,6 +248,7 @@ struct vgic_dist { =20 /* Implementation revision as reported in the GICD_IIDR */ u32 implementation_rev; +#define KVM_VGIC_IMP_REV_1 1 /* GICv2 interrupts as group 0 */ #define KVM_VGIC_IMP_REV_2 2 /* GICv2 restorable groups */ #define KVM_VGIC_IMP_REV_3 3 /* GICv3 GICR_CTLR.{IW,CES,RWP} */ #define KVM_VGIC_IMP_REV_LATEST KVM_VGIC_IMP_REV_3 --=20 2.51.0 From nobody Mon Jun 15 03:56:44 2026 Received: from desiato.infradead.org (desiato.infradead.org [90.155.92.199]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EFB3E34F24A; Tue, 7 Apr 2026 21:11:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=90.155.92.199 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775596286; cv=none; b=rDAPXysWiwp5m9yO1AJv3JDrhg7WyRNRNoa3ReXPLz2S1cGCrAK86HzM4kSRZKGnaME9I/8NIrreZfsDzFy75zh2WHHt6D7VM/15h7Z8wKBv01W3UROWcJIuKQV54AhXugSfkCJCfkVXVIqB6YaDPrbpu2p+pHLo3VoJdUiFDO8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775596286; c=relaxed/simple; bh=fNRvMatvv3zy8eEuOw4NA1jpSvD+otrI4kfMqQzTZO0=; h=From:To:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=odMmYCz91INV5hY37Tb5h+24ILzTq+GkgyGYqPv/14wvR+r4ZEMzr2VOvOqNLZAK0SrOvkQBqKyylao2MDcEK3pM/o7T+0alCifHoc9fG/Fxj64NODqe5+UOBhMk3uxHJeleYitMdYw6W0TFpjVTeSTet7DWLZNABb5xGI8soeA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=infradead.org; spf=none smtp.mailfrom=desiato.srs.infradead.org; dkim=pass (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b=DSTqKZim; arc=none smtp.client-ip=90.155.92.199 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=infradead.org Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=desiato.srs.infradead.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="DSTqKZim" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=desiato.20200630; h=Sender:Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-ID:Date:Subject:To:From:Reply-To: Cc:Content-Type:Content-ID:Content-Description; bh=FZZd5vGKB2iJpJG2tZjZNV8ngAQW3v65pCjl+MTEHAY=; b=DSTqKZimK3gH7OWPSA8Kz9YXce PMpy/d6ylD4bBdYPitpSeBtm25hXFDjGdc5w9DUyGmdrwOFZHY7tBjkQvSbsONE/Jky50d87rcfyc mFYQItjW8FYcbRiTYf9D/ag8OsilRBMpFCDvjthszLO11bRwsJp9B/BZxdPT9T9FNdblA45aw1gvA InoER3eq9u5QggGV8rRGXWFZ+x+BDvIpwNVkgAZtf+doQOVjUittzwXzgPqaJTldX2kDfuJGjLGy8 mMTGcn+4JL/4hxHnkgOHQixAn8iriux/QXszdMhw+csywTJM5utuCyK19xMseSf+FRDCLM7Oyk/4t opOd4YUw==; Received: from [2001:8b0:10b:1::425] (helo=i7.infradead.org) by desiato.infradead.org with esmtpsa (Exim 4.98.2 #2 (Red Hat Linux)) id 1wADgK-000000095Qz-057l; Tue, 07 Apr 2026 21:10:01 +0000 Received: from dwoodhou by i7.infradead.org with local (Exim 4.98.2 #2 (Red Hat Linux)) id 1wADgI-00000008iIE-2739; Tue, 07 Apr 2026 22:09:54 +0100 From: David Woodhouse To: Marc Zyngier , Oliver Upton , Joey Gouly , Suzuki K Poulose , Zenghui Yu , Catalin Marinas , Will Deacon , Paolo Bonzini , Shuah Khan , David Woodhouse , Raghavendra Rao Ananta , Eric Auger , Kees Cook , Arnd Bergmann , Nathan Chancellor , linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-kernel@vger.kernel.org, kvm@vger.kernel.org, linux-kselftest@vger.kernel.org Subject: [PATCH 3/3] KVM: arm64: selftests: Add vgic IIDR revision test Date: Tue, 7 Apr 2026 21:27:04 +0100 Message-ID: <20260407210949.2076251-4-dwmw2@infradead.org> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260407210949.2076251-1-dwmw2@infradead.org> References: <20260407210949.2076251-1-dwmw2@infradead.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: David Woodhouse X-SRS-Rewrite: SMTP reverse-path rewritten from by desiato.infradead.org. See http://www.infradead.org/rpr.html Content-Type: text/plain; charset="utf-8" From: David Woodhouse Test that the GICD_IIDR implementation revision correctly controls guest-visible behaviour for GICv3: Revision 1: IGROUPR reads as all-ones (group 1), writes are ignored. GICR_CTLR.{IR,CES} not advertised. Revision 2: IGROUPR is guest-configurable (read/write). GICR_CTLR.{IR,CES} not advertised. Revision 3: IGROUPR is guest-configurable (read/write). GICR_CTLR.{IR,CES} advertised. For each revision, the test sets the IIDR via KVM_DEV_ARM_VGIC_GRP_DIST_REGS before initializing the vGIC, then runs a guest that verifies the expected IGROUPR and GICR_CTLR behaviour. Signed-off-by: David Woodhouse --- tools/testing/selftests/kvm/Makefile.kvm | 1 + .../selftests/kvm/arm64/vgic_group_iidr.c | 112 ++++++++++++++++++ 2 files changed, 113 insertions(+) create mode 100644 tools/testing/selftests/kvm/arm64/vgic_group_iidr.c diff --git a/tools/testing/selftests/kvm/Makefile.kvm b/tools/testing/selft= ests/kvm/Makefile.kvm index 6471fa214a9f..df729a70124f 100644 --- a/tools/testing/selftests/kvm/Makefile.kvm +++ b/tools/testing/selftests/kvm/Makefile.kvm @@ -177,6 +177,7 @@ TEST_GEN_PROGS_arm64 +=3D arm64/vcpu_width_config TEST_GEN_PROGS_arm64 +=3D arm64/vgic_init TEST_GEN_PROGS_arm64 +=3D arm64/vgic_irq TEST_GEN_PROGS_arm64 +=3D arm64/vgic_lpi_stress +TEST_GEN_PROGS_arm64 +=3D arm64/vgic_group_iidr TEST_GEN_PROGS_arm64 +=3D arm64/vpmu_counter_access TEST_GEN_PROGS_arm64 +=3D arm64/no-vgic-v3 TEST_GEN_PROGS_arm64 +=3D arm64/idreg-idst diff --git a/tools/testing/selftests/kvm/arm64/vgic_group_iidr.c b/tools/te= sting/selftests/kvm/arm64/vgic_group_iidr.c new file mode 100644 index 000000000000..d5c20a41162c --- /dev/null +++ b/tools/testing/selftests/kvm/arm64/vgic_group_iidr.c @@ -0,0 +1,112 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * vgic_group_iidr.c - Test IGROUPR behaviour across IIDR revisions + * + * Validate that the GICD_IIDR implementation revision controls + * IGROUPR semantics for GICv3: + * Rev 1: IGROUPR reads as all-ones (group 1), writes ignored + * Rev 2+: IGROUPR is guest-configurable (read/write) + */ +#include + +#include "test_util.h" +#include "kvm_util.h" +#include "processor.h" +#include "gic.h" +#include "gic_v3.h" +#include "vgic.h" + +#define NR_IRQS 128 +#define SPI_IGROUPR (GICD_IGROUPR + (32 / 32) * 4) /* intids 32-63 */ + +static volatile uint64_t shared_rev; + +static void guest_code(void) +{ + uint32_t val; + + val =3D readl(GICD_BASE_GVA + SPI_IGROUPR); + + if (shared_rev =3D=3D 1) { + /* Rev 1: all group 1 (RAO), writes ignored */ + GUEST_ASSERT_EQ(val, 0xffffffff); + writel(0x0, GICD_BASE_GVA + SPI_IGROUPR); + val =3D readl(GICD_BASE_GVA + SPI_IGROUPR); + GUEST_ASSERT_EQ(val, 0xffffffff); + } else { + /* Rev 2/3: writable, default 0 */ + writel(0xa5a5a5a5, GICD_BASE_GVA + SPI_IGROUPR); + val =3D readl(GICD_BASE_GVA + SPI_IGROUPR); + GUEST_ASSERT_EQ(val, 0xa5a5a5a5); + } + + /* Rev 3: GICR_CTLR advertises IR and CES. Rev 1/2: it does not. */ + val =3D readl(GICR_BASE_GVA + GICR_CTLR); + if (shared_rev >=3D 3) + GUEST_ASSERT(val & (GICR_CTLR_IR | GICR_CTLR_CES)); + else + GUEST_ASSERT(!(val & (GICR_CTLR_IR | GICR_CTLR_CES))); + + GUEST_DONE(); +} + +static void run_test(int rev) +{ + struct kvm_vcpu *vcpus[1]; + struct kvm_vm *vm; + struct ucall uc; + uint32_t iidr; + int gic_fd; + + pr_info("Testing IIDR revision %d\n", rev); + + test_disable_default_vgic(); + vm =3D vm_create_with_vcpus(1, guest_code, vcpus); + + gic_fd =3D __vgic_v3_setup(vm, 1, NR_IRQS); + TEST_ASSERT(gic_fd >=3D 0, "Failed to create vGICv3"); + + /* Set the requested IIDR revision before init. */ + kvm_device_attr_get(gic_fd, KVM_DEV_ARM_VGIC_GRP_DIST_REGS, + GICD_IIDR, &iidr); + iidr &=3D ~GICD_IIDR_REVISION_MASK; + iidr |=3D rev << GICD_IIDR_REVISION_SHIFT; + kvm_device_attr_set(gic_fd, KVM_DEV_ARM_VGIC_GRP_DIST_REGS, + GICD_IIDR, &iidr); + + __vgic_v3_init(gic_fd); + + /* Verify the revision was applied. */ + kvm_device_attr_get(gic_fd, KVM_DEV_ARM_VGIC_GRP_DIST_REGS, + GICD_IIDR, &iidr); + TEST_ASSERT(((iidr & GICD_IIDR_REVISION_MASK) >> GICD_IIDR_REVISION_SHIFT= ) =3D=3D rev, + "IIDR revision readback: expected %d, got %d", + rev, (iidr & GICD_IIDR_REVISION_MASK) >> GICD_IIDR_REVISION_SHIFT); + + /* Tell the guest which revision we set. */ + sync_global_to_guest(vm, shared_rev); + shared_rev =3D rev; + sync_global_to_guest(vm, shared_rev); + + vcpu_run(vcpus[0]); + switch (get_ucall(vcpus[0], &uc)) { + case UCALL_ABORT: + REPORT_GUEST_ASSERT(uc); + break; + case UCALL_DONE: + break; + default: + TEST_FAIL("Unexpected ucall %lu", uc.cmd); + } + + close(gic_fd); + kvm_vm_free(vm); +} + +int main(int argc, char *argv[]) +{ + run_test(1); + run_test(2); + run_test(3); + return 0; +} --=20 2.51.0