From: Oliver Upton <oupton@kernel.org>
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>,
Wei-Lin Chang <weilin.chang@arm.com>,
Steffen Eiden <seiden@linux.ibm.com>,
Oliver Upton <oupton@kernel.org>
Subject: [PATCH 05/22] KVM: arm64: nv: Pass an access descriptor for stage-2 walks
Date: Tue, 23 Jun 2026 11:41:44 -0700 [thread overview]
Message-ID: <20260623184201.1518871-6-oupton@kernel.org> (raw)
In-Reply-To: <20260623184201.1518871-1-oupton@kernel.org>
Pass sufficient context to the stage-2 PTW such that access-dependent
features like FEAT_HAFDBS can determine the correct behavior of the
walk.
Signed-off-by: Oliver Upton <oupton@kernel.org>
---
arch/arm64/include/asm/kvm_nested.h | 15 ++++++++++++++-
arch/arm64/kvm/at.c | 23 +++++++++++++++++++----
arch/arm64/kvm/mmu.c | 16 +++++++++++++++-
arch/arm64/kvm/nested.c | 10 +++++-----
4 files changed, 53 insertions(+), 11 deletions(-)
diff --git a/arch/arm64/include/asm/kvm_nested.h b/arch/arm64/include/asm/kvm_nested.h
index 7fe6fb56c187..71814c4aac3e 100644
--- a/arch/arm64/include/asm/kvm_nested.h
+++ b/arch/arm64/include/asm/kvm_nested.h
@@ -105,7 +105,20 @@ static inline bool kvm_has_xnx(struct kvm *kvm)
kvm_has_feat(kvm, ID_AA64MMFR1_EL1, XNX, IMP);
}
-extern int kvm_walk_nested_s2(struct kvm_vcpu *vcpu, phys_addr_t gipa,
+struct kvm_walk_access {
+ enum {
+ WALK_ACCESS_IFETCH,
+ WALK_ACCESS_LDST,
+ WALK_ACCESS_CMO,
+ WALK_ACCESS_AT,
+ WALK_ACCESS_S1PTW,
+ } type;
+
+ u64 ia;
+ bool write;
+};
+
+extern int kvm_walk_nested_s2(struct kvm_vcpu *vcpu, struct kvm_walk_access *access,
struct kvm_s2_trans *result);
extern int kvm_s2_handle_perm_fault(struct kvm_vcpu *vcpu,
struct kvm_s2_trans *trans);
diff --git a/arch/arm64/kvm/at.c b/arch/arm64/kvm/at.c
index 7a84495a2e6d..083014e9d86a 100644
--- a/arch/arm64/kvm/at.c
+++ b/arch/arm64/kvm/at.c
@@ -483,7 +483,19 @@ static int walk_s1(struct kvm_vcpu *vcpu, struct s1_walk_info *wi,
ipa = baddr | index;
if (wi->s2) {
- ret = kvm_walk_nested_s2(vcpu, ipa, &s2_trans);
+ struct kvm_walk_access s2_access = {
+ .type = WALK_ACCESS_S1PTW,
+ .ia = ipa,
+
+ /*
+ * R_JCXVS, stage-2 dirty state can be updated
+ * for an S1PTW even if the stage-1 descriptor
+ * isn't updated.
+ */
+ .write = wi->ha,
+ };
+
+ ret = kvm_walk_nested_s2(vcpu, &s2_access, &s2_trans);
if (ret == -EAGAIN)
return ret;
@@ -1597,8 +1609,9 @@ int __kvm_at_s1e2(struct kvm_vcpu *vcpu, u32 op, u64 vaddr)
int __kvm_at_s12(struct kvm_vcpu *vcpu, u32 op, u64 vaddr)
{
+ struct kvm_walk_access access = {};
struct kvm_s2_trans out = {};
- u64 ipa, par;
+ u64 par;
bool write;
int ret;
@@ -1642,9 +1655,11 @@ int __kvm_at_s12(struct kvm_vcpu *vcpu, u32 op, u64 vaddr)
return 0;
/* Do the stage-2 translation */
- ipa = (par & GENMASK_ULL(47, 12)) | (vaddr & GENMASK_ULL(11, 0));
+ access.type = WALK_ACCESS_AT;
+ access.ia = (par & GENMASK_ULL(47, 12)) | (vaddr & GENMASK_ULL(11, 0));
out.esr = 0;
- ret = kvm_walk_nested_s2(vcpu, ipa, &out);
+
+ ret = kvm_walk_nested_s2(vcpu, &access, &out);
if (ret < 0)
return ret;
diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c
index f35c4ce95473..88998195274b 100644
--- a/arch/arm64/kvm/mmu.c
+++ b/arch/arm64/kvm/mmu.c
@@ -2313,9 +2313,23 @@ int kvm_handle_guest_abort(struct kvm_vcpu *vcpu)
*/
if (kvm_is_nested_s2_mmu(vcpu->kvm,vcpu->arch.hw_mmu) &&
vcpu->arch.hw_mmu->nested_stage2_enabled) {
+ struct kvm_walk_access access = {
+ .ia = fault_ipa,
+ };
u32 esr;
- ret = kvm_walk_nested_s2(vcpu, fault_ipa, &nested_trans);
+ if (kvm_vcpu_abt_iss1tw(vcpu))
+ access.type = WALK_ACCESS_S1PTW;
+ else if (is_iabt)
+ access.type = WALK_ACCESS_IFETCH;
+ else if (kvm_vcpu_dabt_is_cm(vcpu))
+ access.type = WALK_ACCESS_CMO;
+ else
+ access.type = WALK_ACCESS_LDST;
+
+ access.write = kvm_is_write_fault(vcpu);
+
+ ret = kvm_walk_nested_s2(vcpu, &access, &nested_trans);
if (ret == -EAGAIN) {
ret = 1;
goto out_unlock;
diff --git a/arch/arm64/kvm/nested.c b/arch/arm64/kvm/nested.c
index dcc7d0cc7c95..c2fb7290f0c8 100644
--- a/arch/arm64/kvm/nested.c
+++ b/arch/arm64/kvm/nested.c
@@ -280,7 +280,7 @@ static void compute_s2_permissions(struct kvm_vcpu *vcpu, struct s2_walk_info *w
*
* Must be called with the kvm->srcu read lock held
*/
-static int walk_nested_s2_pgd(struct kvm_vcpu *vcpu, phys_addr_t ipa,
+static int walk_nested_s2_pgd(struct kvm_vcpu *vcpu, struct kvm_walk_access *access,
struct s2_walk_info *wi, struct kvm_s2_trans *out)
{
int first_block_level, stride, input_size, base_lower_bound;
@@ -330,7 +330,7 @@ static int walk_nested_s2_pgd(struct kvm_vcpu *vcpu, phys_addr_t ipa,
phys_addr_t index;
addr_bottom = (3 - ws.level) * stride + wi->pgshift;
- index = (ipa & GENMASK_ULL(addr_top, addr_bottom))
+ index = (access->ia & GENMASK_ULL(addr_top, addr_bottom))
>> (addr_bottom - 3);
ws.desc_pa = base_addr | index;
@@ -412,7 +412,7 @@ static int walk_nested_s2_pgd(struct kvm_vcpu *vcpu, phys_addr_t ipa,
/* Calculate and return the result */
out->output = (ws.desc & GENMASK_ULL(47, addr_bottom)) |
- (ipa & GENMASK_ULL(addr_bottom - 1, 0));
+ (access->ia & GENMASK_ULL(addr_bottom - 1, 0));
out->block_size = 1UL << ((3 - ws.level) * stride + wi->pgshift);
compute_s2_permissions(vcpu, wi, &ws, out);
out->level = ws.level;
@@ -515,7 +515,7 @@ static void setup_s2_walk(struct kvm_vcpu *vcpu, struct s2_walk_info *wi)
wi->be = vcpu_read_sys_reg(vcpu, SCTLR_EL2) & SCTLR_ELx_EE;
}
-int kvm_walk_nested_s2(struct kvm_vcpu *vcpu, phys_addr_t gipa,
+int kvm_walk_nested_s2(struct kvm_vcpu *vcpu, struct kvm_walk_access *access,
struct kvm_s2_trans *result)
{
struct s2_walk_info wi;
@@ -528,7 +528,7 @@ int kvm_walk_nested_s2(struct kvm_vcpu *vcpu, phys_addr_t gipa,
setup_s2_walk(vcpu, &wi);
- ret = walk_nested_s2_pgd(vcpu, gipa, &wi, result);
+ ret = walk_nested_s2_pgd(vcpu, access, &wi, result);
if (ret)
result->esr |= (kvm_vcpu_get_esr(vcpu) & ~ESR_ELx_FSC);
--
2.47.3
next prev parent reply other threads:[~2026-06-23 18:42 UTC|newest]
Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-23 18:41 [PATCH 00/22] KVM: arm64: nv: Implement FEAT_HAFDBS, FEAT_HAFT Oliver Upton
2026-06-23 18:41 ` [PATCH 01/22] KVM: arm64: nv: Introduce struct for stage-2 walk step Oliver Upton
2026-06-23 18:41 ` [PATCH 02/22] KVM: arm64: nv: Consolidate computation of stage-2 permissions Oliver Upton
2026-06-23 18:57 ` sashiko-bot
2026-06-23 18:41 ` [PATCH 03/22] KVM: arm64: nv: Get rid of kvm_s2_trans*() accessors Oliver Upton
2026-06-23 18:41 ` [PATCH 04/22] KVM: arm64: nv: Only shadow writable-dirty guest descs as writable Oliver Upton
2026-06-23 18:58 ` sashiko-bot
2026-06-23 20:05 ` Oliver Upton
2026-06-23 18:41 ` Oliver Upton [this message]
2026-06-23 19:06 ` [PATCH 05/22] KVM: arm64: nv: Pass an access descriptor for stage-2 walks sashiko-bot
2026-06-23 18:41 ` [PATCH 06/22] KVM: arm64: nv: Use a helper for stage-2 descriptor updates Oliver Upton
2026-06-23 18:41 ` [PATCH 07/22] KVM: arm64: nv: Set dirty state at stage-2 Oliver Upton
2026-06-23 19:03 ` sashiko-bot
2026-07-06 16:50 ` Wei-Lin Chang
2026-07-08 7:35 ` Oliver Upton
2026-06-23 18:41 ` [PATCH 08/22] KVM: arm64: nv: Treat DBM as writable " Oliver Upton
2026-06-23 18:55 ` sashiko-bot
2026-06-23 20:08 ` Oliver Upton
2026-06-23 18:41 ` [PATCH 09/22] KVM: arm64: Compute S1 permissions as part of s1_walk() Oliver Upton
2026-06-23 18:41 ` [PATCH 10/22] KVM: arm64: Plumb through access descriptor for stage-1 Oliver Upton
2026-06-23 18:41 ` [PATCH 11/22] KVM: arm64: Use a struct for stage-1 walk context Oliver Upton
2026-06-23 18:41 ` [PATCH 12/22] KVM: arm64: Create helper for stage-1 descriptor updates Oliver Upton
2026-06-23 18:55 ` sashiko-bot
2026-06-23 18:41 ` [PATCH 13/22] KVM: arm64: Set dirty state at stage-1 Oliver Upton
2026-06-23 18:54 ` sashiko-bot
2026-06-26 15:49 ` Leonardo Bras
2026-06-26 16:03 ` Marc Zyngier
2026-06-29 10:38 ` Leonardo Bras
2026-06-26 17:35 ` Oliver Upton
2026-06-29 10:39 ` Leonardo Bras
2026-06-23 18:41 ` [PATCH 14/22] KVM: arm64: Grant write permission when DBM is set at S1 Oliver Upton
2026-06-23 18:57 ` sashiko-bot
2026-06-23 18:41 ` [PATCH 15/22] KVM: arm64: Don't update descriptors for "non-arch" access Oliver Upton
2026-06-23 18:41 ` [PATCH 16/22] KVM: arm64: nv: Expose FEAT_HAFDBS Oliver Upton
2026-06-23 19:01 ` sashiko-bot
2026-06-23 18:41 ` [PATCH 17/22] KVM: arm64: Set Access flag on table descriptors at stage-1 Oliver Upton
2026-06-23 20:56 ` sashiko-bot
2026-06-23 18:41 ` [PATCH 18/22] KVM: arm64: nv: Set access flag on table descriptors at stage-2 Oliver Upton
2026-06-23 19:05 ` sashiko-bot
2026-06-23 20:14 ` Oliver Upton
2026-06-23 18:41 ` [PATCH 19/22] KVM: arm64: nv: Expose FEAT_HAFT Oliver Upton
2026-06-23 19:05 ` sashiko-bot
2026-06-23 18:41 ` [PATCH 20/22] KVM: arm64: selftests: Only test AF behavior for emulated AT insns Oliver Upton
2026-06-23 18:42 ` [PATCH 21/22] KVM: arm64: selftests: Test AT emulation for FEAT_HAFT Oliver Upton
2026-06-23 19:05 ` sashiko-bot
2026-06-23 20:17 ` Oliver Upton
2026-06-23 18:42 ` [PATCH 22/22] HACK: KVM: arm64: nv: Set the dirty state for CMOs that fetch for write Oliver Upton
2026-07-01 10:16 ` Wei-Lin Chang
2026-07-01 17:33 ` Oliver Upton
2026-07-02 6:50 ` Wei-Lin Chang
2026-06-26 15:31 ` [PATCH 00/22] KVM: arm64: nv: Implement FEAT_HAFDBS, FEAT_HAFT Leonardo Bras
2026-06-26 17:12 ` Marc Zyngier
2026-06-26 17:45 ` Oliver Upton
2026-06-29 10:37 ` Leonardo Bras
2026-06-29 10:29 ` Leonardo Bras
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=20260623184201.1518871-6-oupton@kernel.org \
--to=oupton@kernel.org \
--cc=joey.gouly@arm.com \
--cc=kvmarm@lists.linux.dev \
--cc=maz@kernel.org \
--cc=seiden@linux.ibm.com \
--cc=suzuki.poulose@arm.com \
--cc=weilin.chang@arm.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox