Hi Marc, On Mon, Nov 29, 2021 at 08:00:46PM +0000, Marc Zyngier wrote: > The S2 page table code has a limited use the SW bits, but we are about > to need them to encode some guest Stage-2 information (its mapping size > in the form of the TTL encoding). > > Propagate the SW bits specified by the caller, and store them into > the corresponding entry. > > Signed-off-by: Marc Zyngier <maz@xxxxxxxxxx> > --- > arch/arm64/kvm/hyp/pgtable.c | 7 ++++--- > 1 file changed, 4 insertions(+), 3 deletions(-) > > diff --git a/arch/arm64/kvm/hyp/pgtable.c b/arch/arm64/kvm/hyp/pgtable.c > index 8cdbc43fa651..d69e400b2de6 100644 > --- a/arch/arm64/kvm/hyp/pgtable.c > +++ b/arch/arm64/kvm/hyp/pgtable.c > @@ -1064,9 +1064,6 @@ int kvm_pgtable_stage2_relax_perms(struct kvm_pgtable *pgt, u64 addr, > u32 level; > kvm_pte_t set = 0, clr = 0; > > - if (prot & KVM_PTE_LEAF_ATTR_HI_SW) > - return -EINVAL; > - > if (prot & KVM_PGTABLE_PROT_R) > set |= KVM_PTE_LEAF_ATTR_LO_S2_S2AP_R; > > @@ -1076,6 +1073,10 @@ int kvm_pgtable_stage2_relax_perms(struct kvm_pgtable *pgt, u64 addr, > if (prot & KVM_PGTABLE_PROT_X) > clr |= KVM_PTE_LEAF_ATTR_HI_S2_XN; > > + /* Always propagate the SW bits */ > + clr |= FIELD_PREP(KVM_PTE_LEAF_ATTR_HI_SW, 0xf); Nitpick: isn't that the same as: clr |= KVM_PTE_LEAF_ATTR_HI_SW; which looks more readable to me. > + set |= prot & KVM_PTE_LEAF_ATTR_HI_SW; Checked stage2_attr_walker() callbak, first it clears the bits in clr, then sets the bits in set, so this looks correct to me: Reviewed-by: Alexandru Elisei <alexandru.elisei@xxxxxxx> Thanks, Alex > + > ret = stage2_update_leaf_attrs(pgt, addr, 1, set, clr, NULL, &level); > if (!ret) > kvm_call_hyp(__kvm_tlb_flush_vmid_ipa, pgt->mmu, addr, level); > -- > 2.30.2 >