All of lore.kernel.org
 help / color / mirror / Atom feed
From: Oliver Upton <oupton@kernel.org>
To: Leonardo Bras <leo.bras@arm.com>
Cc: kvmarm@lists.linux.dev, 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>
Subject: Re: [PATCH 08/22] KVM: arm64: nv: Treat DBM as writable at stage-2
Date: Wed, 23 Sep 2026 10:16:06 -0700	[thread overview]
Message-ID: <arQJVgtalOI1A8ip@kernel.org> (raw)
In-Reply-To: <arPka0PldKvd0jzc@LeoBrasDK>

On Wed, Sep 23, 2026 at 03:38:36PM +0100, Leonardo Bras wrote:
> On Tue, Jun 23, 2026 at 11:41:47AM -0700, Oliver Upton wrote:
> > When using direct permissions, the DBM bit has the effect of granting
> > the write permission. And, depending on the access, it could grant write
> > permission without a dirty state update.
> > 
> > Signed-off-by: Oliver Upton <oupton@kernel.org>
> > ---
> >  arch/arm64/include/asm/kvm_pgtable.h |  1 +
> >  arch/arm64/kvm/nested.c              | 11 +++++++++++
> >  2 files changed, 12 insertions(+)
> > 
> > diff --git a/arch/arm64/include/asm/kvm_pgtable.h b/arch/arm64/include/asm/kvm_pgtable.h
> > index 22aeb2ed18d1..6ae36973686c 100644
> > --- a/arch/arm64/include/asm/kvm_pgtable.h
> > +++ b/arch/arm64/include/asm/kvm_pgtable.h
> > @@ -94,6 +94,7 @@ typedef u64 kvm_pte_t;
> >  #define KVM_PTE_LEAF_ATTR_HI_S1_PXN	BIT(53)
> >  
> >  #define KVM_PTE_LEAF_ATTR_HI_S2_XN	GENMASK(54, 53)
> > +#define KVM_PTE_LEAF_ATTR_HI_S2_DBM	BIT(51)
> >  
> >  #define KVM_PTE_LEAF_ATTR_HI_S1_GP	BIT(50)
> >  
> > diff --git a/arch/arm64/kvm/nested.c b/arch/arm64/kvm/nested.c
> > index e5a407fc0880..4f13f37e560b 100644
> > --- a/arch/arm64/kvm/nested.c
> > +++ b/arch/arm64/kvm/nested.c
> > @@ -305,6 +305,17 @@ static void compute_s2_permissions(struct kvm_vcpu *vcpu, struct s2_walk_info *w
> >  		break;
> >  	}
> >  
> > +	/*
> > +	 * Descriptors with the DBM bit set while hardware dirty state are
> > +	 * considered writable, even though certain accesses (like AT instructions)
> > +	 * don't actually update the dirty state.
> > +	 *
> > +	 * Assume that walk_nestd_s2_pgd() made the necessary descriptor updates
> > +	 * for the access and just treat DBM as writable here.
> > +	 */
> > +	if (wi->hd && ws->desc & KVM_PTE_LEAF_ATTR_HI_S2_DBM)
> > +		s2ap |= BIT(1);
> > +
> >  	trans->readable = s2ap & BIT(0);
> >  	trans->writable = s2ap & BIT(1);
> >  
> > -- 
> > 2.47.3
> > 
> 
> 
> Okay, now I see why were you doing that on the previous patch.
> 
> Here you test DBM and set writable to 1, and change nothing else, as s2ap 
> is a local variable that is only used to set writable if DBM is set.
> 
> This feels weird, though. That way it looks like DBM is changing s2ap, 
> which is not.
> 
> I suggest doing something like:
> 
> +     if (wi->hd && ws->desc & KVM_PTE_LEAF_ATTR_HI_S2_DBM)
> +             trans->writable = true;
> +
>        trans->readable =  s2ap & BIT(0);
> -      trans->writable = s2ap & BIT(1);
> +      trans->writable |= s2ap & BIT(1);
> 
> Although, this is odd, as S2AP[1] is supposed to be the dirty-bit.
> Maybe it's fine, as in our case, dirty implies writable.
> 
> IHMO, the best approach to this would be to make the movement to 
> DBM = writable, then have something like:
> 
> +	trans->readable =  s2ap & BIT(0);
> +	trans->dirty    =  s2ap & BIT(1);
> +	trans->writable =  ws->desc & KVM_PTE_LEAF_ATTR_HI_S2_DBM;
> 
> +	/* Dirty implies on writable, was used alone on older systems */
> +	trans->writable |= trans->dirty;
> 
> (And we assume DBM always means writable, and not only when VTCR_EL2.HD=1.

The Arm ARM is clear as mud in this area but this doesn't pass the smell
test. Look at R_HBFHL and R_FQNDX, which suggests that S2AP is the
authoritative field for write permissions through a descriptor.

> What do you think?

So the current shape of the code is a byproduct of looking at the Arm
pseudocode. Granted, AArch64.S1DirectBasePermissions() is the one
changing the effective value of AP based on the dirty state of the
descriptor.

Thanks,
Oliver

  reply	other threads:[~2026-09-23 17:16 UTC|newest]

Thread overview: 90+ 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-09-21 11:30   ` Leonardo Bras
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-09-21 13:46   ` Leonardo Bras
2026-09-21 21:28     ` Oliver Upton
2026-06-23 18:41 ` [PATCH 03/22] KVM: arm64: nv: Get rid of kvm_s2_trans*() accessors Oliver Upton
2026-09-21 16:18   ` Leonardo Bras
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-09-21 16:51   ` Leonardo Bras
2026-09-21 21:39     ` Oliver Upton
2026-06-23 18:41 ` [PATCH 05/22] KVM: arm64: nv: Pass an access descriptor for stage-2 walks Oliver Upton
2026-06-23 19:06   ` sashiko-bot
2026-09-21 17:28   ` Leonardo Bras
2026-09-21 21:45     ` Oliver Upton
2026-09-22 14:24       ` Leonardo Bras
2026-06-23 18:41 ` [PATCH 06/22] KVM: arm64: nv: Use a helper for stage-2 descriptor updates Oliver Upton
2026-09-22 16:14   ` Leonardo Bras
2026-09-22 16:31     ` 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-09-23 14:09   ` Leonardo Bras
2026-09-23 16:46     ` 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-09-23 14:38   ` Leonardo Bras
2026-09-23 17:16     ` Oliver Upton [this message]
2026-09-24 17:22       ` Leonardo Bras
2026-06-23 18:41 ` [PATCH 09/22] KVM: arm64: Compute S1 permissions as part of s1_walk() Oliver Upton
2026-09-23 15:47   ` Leonardo Bras
2026-06-23 18:41 ` [PATCH 10/22] KVM: arm64: Plumb through access descriptor for stage-1 Oliver Upton
2026-09-23 16:21   ` Leonardo Bras
2026-09-23 20:37     ` Oliver Upton
2026-09-25 11:10       ` Leonardo Bras
2026-06-23 18:41 ` [PATCH 11/22] KVM: arm64: Use a struct for stage-1 walk context Oliver Upton
2026-09-23 17:03   ` Leonardo Bras
2026-09-23 20:23     ` Oliver Upton
2026-09-25 11:20       ` Leonardo Bras
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-09-25 14:35   ` Leonardo Bras
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-09-25 15:07   ` 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-09-25 15:18   ` Leonardo Bras
2026-06-23 18:41 ` [PATCH 15/22] KVM: arm64: Don't update descriptors for "non-arch" access Oliver Upton
2026-09-25 15:51   ` Leonardo Bras
2026-06-23 18:41 ` [PATCH 16/22] KVM: arm64: nv: Expose FEAT_HAFDBS Oliver Upton
2026-06-23 19:01   ` sashiko-bot
2026-09-25 15:53   ` Leonardo Bras
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-09-28 14:33   ` Leonardo Bras
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-09-28 14:40   ` Leonardo Bras
2026-06-23 18:41 ` [PATCH 19/22] KVM: arm64: nv: Expose FEAT_HAFT Oliver Upton
2026-06-23 19:05   ` sashiko-bot
2026-09-28 14:42   ` Leonardo Bras
2026-06-23 18:41 ` [PATCH 20/22] KVM: arm64: selftests: Only test AF behavior for emulated AT insns Oliver Upton
2026-09-28 16:01   ` Leonardo Bras
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-09-28 17:06   ` Leonardo Bras
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-09-28 17:21   ` Leonardo Bras
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
2026-09-18 14:55 ` 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=arQJVgtalOI1A8ip@kernel.org \
    --to=oupton@kernel.org \
    --cc=joey.gouly@arm.com \
    --cc=kvmarm@lists.linux.dev \
    --cc=leo.bras@arm.com \
    --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 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.