lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <qsj5cleufe4ljlfi7zq77ted6utdgaqzcwuifjeik5hnbvqzvi@xitzlce5si6o>
Date: Tue, 23 Dec 2025 23:40:27 +0000
From: Yosry Ahmed <yosry.ahmed@...ux.dev>
To: Sean Christopherson <seanjc@...gle.com>
Cc: Paolo Bonzini <pbonzini@...hat.com>, kvm@...r.kernel.org, 
	linux-kernel@...r.kernel.org
Subject: Re: [PATCH v3 07/16] KVM: selftests: Move PTE bitmasks to kvm_mmu

On Tue, Dec 23, 2025 at 02:31:38PM -0800, Sean Christopherson wrote:
> On Thu, Nov 27, 2025, Yosry Ahmed wrote:
> > @@ -1449,11 +1439,44 @@ enum pg_level {
> >  #define PG_SIZE_2M PG_LEVEL_SIZE(PG_LEVEL_2M)
> >  #define PG_SIZE_1G PG_LEVEL_SIZE(PG_LEVEL_1G)
> >  
> > +struct pte_masks {
> > +	uint64_t present;
> > +	uint64_t writable;
> > +	uint64_t user;
> > +	uint64_t accessed;
> > +	uint64_t dirty;
> > +	uint64_t huge;
> > +	uint64_t nx;
> > +	uint64_t c;
> > +	uint64_t s;
> > +};
> > +
> >  struct kvm_mmu {
> >  	uint64_t root_gpa;
> >  	int pgtable_levels;
> > +	struct pte_masks pte_masks;
> 
> And then introduce kvm_mmu_arch so that x86 can shove pte_masks into the mmu.

Makes sense.

> 
> >  };
> >  
> > +#define PTE_PRESENT_MASK(mmu) ((mmu)->pte_masks.present)
> > +#define PTE_WRITABLE_MASK(mmu) ((mmu)->pte_masks.writable)
> > +#define PTE_USER_MASK(mmu) ((mmu)->pte_masks.user)
> > +#define PTE_ACCESSED_MASK(mmu) ((mmu)->pte_masks.accessed)
> > +#define PTE_DIRTY_MASK(mmu) ((mmu)->pte_masks.dirty)
> > +#define PTE_HUGE_MASK(mmu) ((mmu)->pte_masks.huge)
> > +#define PTE_NX_MASK(mmu) ((mmu)->pte_masks.nx)
> > +#define PTE_C_MASK(mmu) ((mmu)->pte_masks.c)
> > +#define PTE_S_MASK(mmu) ((mmu)->pte_masks.s)
> > +
> > +#define pte_present(mmu, pte) (!!(*(pte) & PTE_PRESENT_MASK(mmu)))
> 
> I very, very strongly prefer is_present_pte(), is_huge_pte(), etc.

These were modeled after the kernel accessors (e.g. in
arch/x86/include/asm/pgtable.h). I think it's clearer if we use the same
naming here, but I don't feel as strongly as you -- so fine either way.

> 
> > +#define pte_writable(mmu, pte) (!!(*(pte) & PTE_WRITABLE_MASK(mmu)))
> > +#define pte_user(mmu, pte) (!!(*(pte) & PTE_USER_MASK(mmu)))
> > +#define pte_accessed(mmu, pte) (!!(*(pte) & PTE_ACCESSED_MASK(mmu)))
> > +#define pte_dirty(mmu, pte) (!!(*(pte) & PTE_DIRTY_MASK(mmu)))
> > +#define pte_huge(mmu, pte) (!!(*(pte) & PTE_HUGE_MASK(mmu)))
> > +#define pte_nx(mmu, pte) (!!(*(pte) & PTE_NX_MASK(mmu)))
> > +#define pte_c(mmu, pte) (!!(*(pte) & PTE_C_MASK(mmu)))
> > +#define pte_s(mmu, pte) (!!(*(pte) & PTE_S_MASK(mmu)))

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ