From: Oliver Upton <oliver.upton@linux.dev>
To: kvmarm@lists.linux.dev
Cc: Marc Zyngier <maz@kernel.org>, Joey Gouly <joey.gouly@arm.com>,
Suzuki K Poulose <suzuki.poulose@arm.com>,
Zenghui Yu <yuzenghui@huawei.com>,
Jinqian Yang <yangjinqian1@huawei.com>,
Oliver Upton <oliver.upton@linux.dev>
Subject: [PATCH 02/11] KVM: arm64: nv: Don't erroneously claim FEAT_DoubleLock for NV VMs
Date: Fri, 12 Sep 2025 14:22:49 -0700 [thread overview]
Message-ID: <20250912212258.407350-3-oliver.upton@linux.dev> (raw)
In-Reply-To: <20250912212258.407350-1-oliver.upton@linux.dev>
ID_AA64DFR0_EL1.DoubleLock is one of those annoying signed feature
fields where a non-negative value implies that a feature is implemented
and a negative value implies that it is not. While the intention of
masking this field was likely to hide the feature, KVM actually
advertises it, even on unsupporting hardware.
Remove FEAT_DoubleLock from the mask, making the NI value visible to the
VM. Take care to accept the old, incorrect values for this field as
we've lied to userspace.
Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
---
arch/arm64/kvm/nested.c | 1 -
arch/arm64/kvm/sys_regs.c | 25 +++++++++++++++++++++++++
2 files changed, 25 insertions(+), 1 deletion(-)
diff --git a/arch/arm64/kvm/nested.c b/arch/arm64/kvm/nested.c
index 53c57d105c93..4044dc66fa39 100644
--- a/arch/arm64/kvm/nested.c
+++ b/arch/arm64/kvm/nested.c
@@ -1582,7 +1582,6 @@ u64 limit_nv_id_reg(struct kvm *kvm, u32 reg, u64 val)
ID_AA64DFR0_EL1_MTPMU |
ID_AA64DFR0_EL1_TraceBuffer |
ID_AA64DFR0_EL1_TraceFilt |
- ID_AA64DFR0_EL1_DoubleLock |
ID_AA64DFR0_EL1_PMSVer |
ID_AA64DFR0_EL1_CTX_CMPs |
ID_AA64DFR0_EL1_SEBEP |
diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c
index b29f72478a50..cb7fc871c42d 100644
--- a/arch/arm64/kvm/sys_regs.c
+++ b/arch/arm64/kvm/sys_regs.c
@@ -1997,6 +1997,26 @@ static u64 sanitise_id_aa64dfr0_el1(const struct kvm_vcpu *vcpu, u64 val)
return val;
}
+/*
+ * Older versions of KVM erroneously claim support for FEAT_DoubleLock with
+ * NV-enabled VMs on unsupporting hardware. Silently ignore the incorrect
+ * value if it is consistent with the bug.
+ */
+static bool ignore_feat_doublelock(struct kvm_vcpu *vcpu, u64 val)
+{
+ u8 host, user;
+
+ if (!vcpu_has_nv(vcpu))
+ return false;
+
+ host = SYS_FIELD_GET(ID_AA64DFR0_EL1, DoubleLock,
+ read_sanitised_ftr_reg(SYS_ID_AA64DFR0_EL1));
+ user = SYS_FIELD_GET(ID_AA64DFR0_EL1, DoubleLock, val);
+
+ return host == ID_AA64DFR0_EL1_DoubleLock_NI &&
+ user == ID_AA64DFR0_EL1_DoubleLock_IMP;
+}
+
static int set_id_aa64dfr0_el1(struct kvm_vcpu *vcpu,
const struct sys_reg_desc *rd,
u64 val)
@@ -2028,6 +2048,11 @@ static int set_id_aa64dfr0_el1(struct kvm_vcpu *vcpu,
if (debugver < ID_AA64DFR0_EL1_DebugVer_IMP)
return -EINVAL;
+ if (ignore_feat_doublelock(vcpu, val)) {
+ val &= ~ID_AA64DFR0_EL1_DoubleLock;
+ val |= SYS_FIELD_PREP_ENUM(ID_AA64DFR0_EL1, DoubleLock, NI);
+ }
+
return set_id_reg(vcpu, rd, val);
}
--
2.39.5
next prev parent reply other threads:[~2025-09-12 21:23 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-09-12 21:22 [PATCH 00/11] KVM: arm64: nv: Align feature limitations with current state of support Oliver Upton
2025-09-12 21:22 ` [PATCH 01/11] KVM: arm64: nv: Convert masks to denylists in limit_nv_id_reg() Oliver Upton
2025-09-12 21:22 ` Oliver Upton [this message]
2025-09-12 21:22 ` [PATCH 03/11] KVM: arm64: nv: Expose FEAT_DF2 to NV-enabled VMs Oliver Upton
2025-09-12 21:22 ` [PATCH 04/11] KVM: arm64: nv: Expose FEAT_RASv1p1 via RAS_frac Oliver Upton
2025-09-12 21:22 ` [PATCH 05/11] KVM: arm64: nv: Expose FEAT_ECBHB to NV-enabled VMs Oliver Upton
2025-09-12 21:22 ` [PATCH 06/11] KVM: arm64: nv: Expose FEAT_AFP " Oliver Upton
2025-09-12 21:22 ` [PATCH 07/11] KVM: arm64: nv: Exclude guest's TWED configuration when TWE isn't set Oliver Upton
2025-09-12 21:22 ` [PATCH 08/11] KVM: arm64: nv: Expose FEAT_TWED to NV-enabled VMs Oliver Upton
2025-09-12 21:22 ` [PATCH 09/11] KVM: arm64: nv: Advertise FEAT_SpecSEI " Oliver Upton
2025-09-12 21:22 ` [PATCH 10/11] KVM: arm64: nv: Advertise FEAT_TIDCP1 " Oliver Upton
2025-09-12 21:22 ` [PATCH 11/11] KVM: arm64: nv: Expose up to FEAT_Debugv8p8 " Oliver Upton
2025-09-12 21:43 ` [PATCH 00/11] KVM: arm64: nv: Align feature limitations with current state of support Marc Zyngier
2025-09-12 21:48 ` Oliver Upton
2025-09-19 13:15 ` Marc Zyngier
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250912212258.407350-3-oliver.upton@linux.dev \
--to=oliver.upton@linux.dev \
--cc=joey.gouly@arm.com \
--cc=kvmarm@lists.linux.dev \
--cc=maz@kernel.org \
--cc=suzuki.poulose@arm.com \
--cc=yangjinqian1@huawei.com \
--cc=yuzenghui@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.