All of lore.kernel.org
 help / color / mirror / Atom feed
From: Tian Zheng <zhengtian10@huawei.com>
To: Leonardo Bras <leo.bras@arm.com>, Marc Zyngier <maz@kernel.org>
Cc: Oliver Upton <oupton@kernel.org>,
	Fuad Tabba <fuad.tabba@linux.dev>,
	Joey Gouly <joey.gouly@arm.com>,
	Steffen Eiden <seiden@linux.ibm.com>,
	Suzuki K Poulose <suzuki.poulose@arm.com>,
	Zenghui Yu <yuzenghui@huawei.com>,
	Catalin Marinas <catalin.marinas@arm.com>,
	Will Deacon <will@kernel.org>,
	Mark Rutland <mark.rutland@arm.com>,
	Raghavendra Rao Ananta <rananta@google.com>,
	<linux-arm-kernel@lists.infradead.org>, <kvmarm@lists.linux.dev>,
	<linux-kernel@vger.kernel.org>,
	Tian Zheng <zhengtian10@huawei.com>
Subject: Re: [RFC PATCH 1/5] KVM: arm64: pgtables: Change write bit from S2AP_W to DBM
Date: Fri, 18 Sep 2026 19:43:41 +0800	[thread overview]
Message-ID: <d039151a-d114-47fd-988d-df80751f1c97@huawei.com> (raw)
In-Reply-To: <aqqY1QiB0ZBAQkwc@LeoBrasDK>



On 9/16/2026 9:25 PM, Leonardo Bras wrote:
> On Wed, Sep 16, 2026 at 01:20:33PM +0100, Marc Zyngier wrote:
>> On Wed, 16 Sep 2026 12:22:05 +0100,
>> Leonardo Bras <leo.bras@arm.com> wrote:
>>>
>>> On Tue, Sep 15, 2026 at 05:37:15PM -0700, Oliver Upton wrote:
>>>> On Tue, Sep 15, 2026 at 06:12:45PM +0100, Leonardo Bras wrote:
>>>>>> Yes, the HW should ignore it. But we have also
>>>>>> seen quite a few broken designs in this area...
>>>>>>
>>>>>
>>>>> I lack experience on what bad thing could happen. So I will expand on what
>>>>> I belive to understand up to here:
>>>>>
>>>>> - The PTE is in memory, so the DBM bit can be set regardless of being RES0
>>>>> - For SW pagetable walking, I don't think 'bit 51 == 0' is checked
>>>>> - For HW pagetable walking, maybe some faulty implementation may rely on
>>>>>    bit51 being RES0, and fault otherwise.
>>>>>
>>>>> If that's the case, then we would have to actually support both encodings,
>>>>> and only enable the new one if HAFDBS is available in the system.
>>>>>
>>>>> I just wonder how high are the chances to have such a broken design,
>>>>> or other broken designs did not come to my mind, and if we have to start
>>>>> with that multiple-encoding option.
>>>>
>>>> FWIW, the host stage-1 already uses the DBM bit unconditionally,
>>>> treating it as a software bit on implementations without HAFDBS.
>>>> Although given the quality of any garden variety Arm MMU I understand
>>>> where Marc is coming from.
>>>>
>>>> I don't think the HAFDBS enablement is complicated enough to be done in
>>>> a separate series without any meaningful users, nor would I really be
>>>> interested in taking it without, say, HDBSS.
>>>>
>>>> Can you please work with Tian to get a combined series out for this?
>>>>
>>>
>>> Hi Oliver, thanks for reviewing!
>>>
>>> Sure, one of the reasons I sent like this is so Tian could use it as a base
>>> for his next version.
>>>
>>>
>>>>>>> diff --git a/arch/arm64/kvm/nested.c b/arch/arm64/kvm/nested.c
>>>>>>> index 17123f0b6dab..eb8dfffc32c7 100644
>>>>>>> --- a/arch/arm64/kvm/nested.c
>>>>>>> +++ b/arch/arm64/kvm/nested.c
>>>>>>> @@ -379,21 +379,23 @@ static int walk_nested_s2_pgd(struct kvm_vcpu *vcpu, phys_addr_t ipa,
>>>>>>>   	}
>>>>>>>   
>>>>>>>   	addr_bottom += contiguous_bit_shift(desc, wi, level);
>>>>>>>   
>>>>>>>   	/* Calculate and return the result */
>>>>>>>   	paddr = (desc & GENMASK_ULL(47, addr_bottom)) |
>>>>>>>   		(ipa & GENMASK_ULL(addr_bottom - 1, 0));
>>>>>>>   	out->output = paddr;
>>>>>>>   	out->block_size = 1UL << ((3 - level) * stride + wi->pgshift);
>>>>>>>   	out->readable = desc & KVM_PTE_LEAF_ATTR_LO_S2_S2AP_R;
>>>>>>> -	out->writable = desc & KVM_PTE_LEAF_ATTR_LO_S2_S2AP_W;
>>>>>>> +	/* Takes care of both RO/RW and RO/WC/WD encodings */
>>>>>>> +	out->writable = desc & (KVM_PTE_LEAF_ATTR_HI_S2_DBM |
>>>>>>> +				KVM_PTE_LEAF_ATTR_LO_S2_S2AP_W);
>>>>>>
>>>>>> Absolutely NOT. For a start, NV doesn't support FEAT_HAFDBS. But even
>>>>>> if it did, you are now actively corrupting memory by turning a RO
>>>>>> mapping with a spurious DBM bit set into a writable mapping.
>>>>>> VTCR_EL2.HD exists for a reason.
>>>>>>
>>>>>> Do you see why your blanket approach of equating DBM with writable is
>>>>>> plain wrong?
>>>>>
>>>>> Sorry, not really... please help me understand it.
>>>>>
>>>>> When you say a spurious DBM bit, what does it mean?
>>>>
>>>> You've implemented the exact sort of bug that was alluded to above. In
>>>> this case it's a software page table walker consuming DBM regardless of
>>>> the value of VTCR_EL2.HD.
>>>>
>>>
>>> So you mean that DBM being treated as "writable" could _only_ happen if we
>>> have VTCR_EL2.HD=1? I was previously under the impression that it could be
>>> used regardless of HD value.
>>
>> Then you have failed to understand the architecture. When
>> VTCR_EL2.HD==0, DBM can be treated as RES0, RES0, or RES0.
>>
>> R_XZFQH and R_BRFGY are pretty clear that DBM can only be evaluated
>> when dirty hw update is enabled, and I_MHJZP tells you what it means
>> for S2 to have this enabled.
> 
> Right, I_MHJZP says that if VTCR_EL2.HD is 1, then dirty state hardware
> management is enabled.
> 
> Then, R_XZFQH and R_BRFGY say that if (DBM+S2AP) bit combination is the
> given and the dirty state hardware management is enabled then a block
> descriptor is WC/WD.
> 
> R_XZFQH header, as an example:
> For each translation stage using Direct permissions, if all of the
> following apply, then a Block descriptor or Page descriptor is described
> as writable-clean[...]
> 
> It says:
> "if all apply, the block is WC",
> it does not say
> "only if all apply, the block is WC".
> so it forces one way, but not the other.
> 
> So I previously understood that we could also use the encoding for WC/WD in
> software, to avoid having 2 distinct encodings, when VTCR_EL2.HD=0.
> 
> If that's not possible, as you mentioned, then yes, I failed to get that
> part. I also see that you mention it being RES0 when VTCR_EL2.HD==0, but I
> honestly could not find reference to that. :(
> 
> What I could find on Arm ARM M.cc was Table D8-53, which states for
> bit 51 that it's DBM if indirect permissions are disabled, or PIINDEX[1]
> if they are enabled. There is also no such information in D8.5.2 about this
> res0 behavior.
> 
> So I am possibly missing the proper place to look for that information.
> Could you please share that with me so I can improve and maybe avoid being
> a inconvenience in the future?
> 
> Thanks!
> Leo
> 

Hi Leo, Marc,

On the NV side, KVM itself already limits the L1-visible
ID_AA64MMFR1_EL1.HAFDBS to AF-only in limit_nv_id_reg(), so bit 51 has
no architectural meaning to L1, and an L1 using it as software metadata
would have its read-only pages misread as writable by the union read in
walk_nested_s2_pgd() — the memory corruption Marc described. Since NV
has no HAFDBS emulation today, I'd suggest we simply revert this hunk
for now and keep reading writability from S2AP[1] alone:

```
out->writable = desc & KVM_PTE_LEAF_ATTR_LO_S2_S2AP_W;
```

It seems we can address the NV side later, once nested HAFDBS is
actually supported.

That's what I did when picking the series up for HDBSS v5: patch 1 drops
the nested.c hunk.

Thanks,
Tian

  reply	other threads:[~2026-09-18 11:43 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-01 17:15 [RFC PATCH 0/5] KVM: arm64: New PTE dirty-page encoding, HAFDBS new usage Leonardo Bras
2026-09-01 17:15 ` [RFC PATCH 1/5] KVM: arm64: pgtables: Change write bit from S2AP_W to DBM Leonardo Bras
2026-09-01 17:30   ` sashiko-bot
2026-09-02 11:07     ` Leonardo Bras
2026-09-13  9:00   ` Marc Zyngier
2026-09-15 17:12     ` Leonardo Bras
2026-09-16  0:37       ` Oliver Upton
2026-09-16 11:22         ` Leonardo Bras
2026-09-16 12:20           ` Marc Zyngier
2026-09-16 13:25             ` Leonardo Bras
2026-09-18 11:43               ` Tian Zheng [this message]
2026-09-18  9:39           ` Tian Zheng
2026-09-21 14:15             ` Leonardo Bras
2026-09-29 10:30               ` Tian Zheng
2026-09-16  8:30       ` Marc Zyngier
2026-09-16 13:03         ` Leonardo Bras
2026-09-01 17:15 ` [RFC PATCH 2/5] KVM: arm64: Add KVM_PGTABLE_PROT_DIRTY Leonardo Bras
2026-09-01 17:34   ` sashiko-bot
2026-09-02 11:30     ` Leonardo Bras
2026-09-13  9:09   ` Marc Zyngier
2026-09-15 17:33     ` Leonardo Bras
2026-09-01 17:15 ` [RFC PATCH 3/5] KVM: arm64: Introduce a dedicated walker for stage2 write-protect Leonardo Bras
2026-09-01 17:15 ` [RFC PATCH 4/5] KVM: arm64: Add KVM_REQ_RELOAD_STAGE2 Leonardo Bras
2026-09-02  3:41   ` Tian Zheng
2026-09-02 10:53     ` Leonardo Bras
2026-09-01 17:15 ` [RFC PATCH 5/5] KVM: arm64: Enable HAFDBS for guests not on migration Leonardo Bras
2026-09-01 17:49   ` sashiko-bot
2026-09-02 13:16     ` Leonardo Bras
2026-09-16  0:10   ` Oliver Upton
2026-09-16 14:00     ` Leonardo Bras
2026-09-16 23:27       ` Oliver Upton
2026-09-17 13:40         ` Leonardo Bras
2026-09-18 11:58   ` Tian Zheng
2026-09-21 14:28     ` Leonardo Bras
2026-09-29 11:30       ` Tian Zheng
2026-09-12 12:24 ` [RFC PATCH 0/5] KVM: arm64: New PTE dirty-page encoding, HAFDBS new usage Marc Zyngier
2026-09-15 15:31   ` 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=d039151a-d114-47fd-988d-df80751f1c97@huawei.com \
    --to=zhengtian10@huawei.com \
    --cc=catalin.marinas@arm.com \
    --cc=fuad.tabba@linux.dev \
    --cc=joey.gouly@arm.com \
    --cc=kvmarm@lists.linux.dev \
    --cc=leo.bras@arm.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=maz@kernel.org \
    --cc=oupton@kernel.org \
    --cc=rananta@google.com \
    --cc=seiden@linux.ibm.com \
    --cc=suzuki.poulose@arm.com \
    --cc=will@kernel.org \
    --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.