From: mlevitsk@redhat.com
To: Paolo Bonzini <pbonzini@redhat.com>,
linux-kernel@vger.kernel.org, kvm@vger.kernel.org
Cc: d.riley@proxmox.com, jon@nutanix.com
Subject: Re: [PATCH 22/28] KVM: x86/mmu: introduce cpu_role bit for availability of PFEC.I/D
Date: Tue, 02 Jun 2026 10:29:41 -0400 [thread overview]
Message-ID: <e82cdc2b9aa86356d971103cfe396c69c45734bb.camel@redhat.com> (raw)
In-Reply-To: <20260505195226.563317-23-pbonzini@redhat.com>
On Tue, 2026-05-05 at 21:52 +0200, Paolo Bonzini wrote:
> While GMET looks a lot like SMEP, it has several annoying differences.
> The main one is that the availability of the I/D bit in the page fault
> error code still depends on the host CR4.SMEP and EFER.NXE bits. If the
Hi!
What do you think if we reword this like this:
"still depends on either host's CR4.SMEP or host's EFER.NXE being set"
I initially thought that we have to have both of these settings enabled and it
confused me.
> base.cr4_smep bit of the cpu_role is (ab)used to enable GMET, there needs
> to be another place where the host CR4.SMEP is read from; just merge it
> with EFER.NXE into a new cpu_role bit that tells paging_tmpl.h whether
> to set the I/D bit at all.
I am thinking:
For KVM point of view, has_pferr_fetch will always be true on NPT, because the kernel itself always enables EFER.NX,
if it can (for reference, the code is in head_64.S), and there seems to be no override for that.
And then, KVM refuses to load when EFER.NX is not supported by the CPU
So host's EFER.NX will always be set for KVM (we can add an assert somewhere to be 100% sure)
In fact if this is the case, we can simplifiy things by assuming that we always have PFERR_FETCH for NPT.
What do you think?
>
> Tested-by: David Riley <d.riley@proxmox.com>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
> arch/x86/include/asm/kvm_host.h | 7 +++++++
> arch/x86/kvm/mmu/mmu.c | 8 ++++++++
> arch/x86/kvm/mmu/paging_tmpl.h | 2 +-
> 3 files changed, 16 insertions(+), 1 deletion(-)
>
> diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
> index 23a7ac8d7fbe..7dde4ca87752 100644
> --- a/arch/x86/include/asm/kvm_host.h
> +++ b/arch/x86/include/asm/kvm_host.h
> @@ -414,6 +414,13 @@ union kvm_mmu_extended_role {
> unsigned int cr4_smap:1;
> unsigned int cr4_la57:1;
> unsigned int efer_lma:1;
> +
> + /*
> + * True if either CR4.SMEP or EFER.NXE are set. For AMD NPT
> + * this is the "real" host CR4.SMEP whereas cr4_smep is
> + * actually GMET.
> + */
If we adopt my suggestion of using 'role.has_user_exec_permission',
then I guess we won't need this patch?
What do you think?
Side question: Is it true that CR4.SMEP *on the host* is not needed for NPT/GMET?
(I wasn't able to find anything in the manual)
Best regards,
Maxim Levitsky
> + unsigned int has_pferr_fetch:1;
> };
> };
>
> diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c
> index 156bab8afbc6..912c8e97ef61 100644
> --- a/arch/x86/kvm/mmu/mmu.c
> +++ b/arch/x86/kvm/mmu/mmu.c
> @@ -234,6 +234,11 @@ BUILD_MMU_ROLE_ACCESSOR(ext, cr4, la57);
> BUILD_MMU_ROLE_ACCESSOR(base, efer, nx);
> BUILD_MMU_ROLE_ACCESSOR(ext, efer, lma);
>
> +static inline bool has_pferr_fetch(struct kvm_mmu *mmu)
> +{
> + return mmu->cpu_role.ext.has_pferr_fetch;
> +}
> +
> static inline bool is_cr0_pg(struct kvm_mmu *mmu)
> {
> return mmu->cpu_role.base.level > 0;
> @@ -5793,6 +5798,8 @@ static union kvm_cpu_role kvm_calc_cpu_role(struct kvm_vcpu *vcpu,
> role.ext.cr4_pke = ____is_efer_lma(regs) && ____is_cr4_pke(regs);
> role.ext.cr4_la57 = ____is_efer_lma(regs) && ____is_cr4_la57(regs);
> role.ext.efer_lma = ____is_efer_lma(regs);
> +
> + role.ext.has_pferr_fetch = role.base.efer_nx | role.base.cr4_smep;
> return role;
> }
>
> @@ -5946,6 +5953,7 @@ void kvm_init_shadow_npt_mmu(struct kvm_vcpu *vcpu, unsigned long cr0,
>
> /* NPT requires CR0.PG=1. */
> WARN_ON_ONCE(cpu_role.base.direct || !cpu_role.base.guest_mode);
> + cpu_role.base.cr4_smep = false;
>
> root_role = cpu_role.base;
> root_role.level = kvm_mmu_get_tdp_level(vcpu);
> diff --git a/arch/x86/kvm/mmu/paging_tmpl.h b/arch/x86/kvm/mmu/paging_tmpl.h
> index 047400af924d..07100bbfc270 100644
> --- a/arch/x86/kvm/mmu/paging_tmpl.h
> +++ b/arch/x86/kvm/mmu/paging_tmpl.h
> @@ -489,7 +489,7 @@ static int FNAME(walk_addr_generic)(struct guest_walker *walker,
>
> error:
> errcode |= write_fault | user_fault;
> - if (fetch_fault && (is_efer_nx(mmu) || is_cr4_smep(mmu)))
> + if (fetch_fault && has_pferr_fetch(mmu))
> errcode |= PFERR_FETCH_MASK;
>
> walker->fault.vector = PF_VECTOR;
next prev parent reply other threads:[~2026-06-02 14:29 UTC|newest]
Thread overview: 75+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-05 19:51 [PATCH v6 00/28] KVM: combined patchset for MBEC/GMET support Paolo Bonzini
2026-05-05 19:51 ` [PATCH 01/28] KVM: TDX/VMX: rework EPT_VIOLATION_EXEC_FOR_RING3_LIN into PROT_MASK Paolo Bonzini
2026-06-02 14:19 ` mlevitsk
2026-05-05 19:52 ` [PATCH 02/28] KVM: x86/mmu: remove SPTE_PERM_MASK Paolo Bonzini
2026-06-02 14:20 ` mlevitsk
2026-05-05 19:52 ` [PATCH 03/28] KVM: x86/mmu: free up bit 10 of PTEs in preparation for MBEC Paolo Bonzini
2026-06-02 14:20 ` mlevitsk
2026-05-05 19:52 ` [PATCH 04/28] KVM: x86/mmu: shuffle high bits of SPTEs " Paolo Bonzini
2026-06-02 14:20 ` mlevitsk
2026-05-05 19:52 ` [PATCH 05/28] KVM: x86/mmu: remove SPTE_EPT_* Paolo Bonzini
2026-06-02 14:21 ` mlevitsk
2026-05-05 19:52 ` [PATCH 06/28] KVM: x86/mmu: merge make_spte_{non,}executable Paolo Bonzini
2026-06-02 14:22 ` mlevitsk
2026-05-05 19:52 ` [PATCH 07/28] KVM: x86/mmu: rename and clarify BYTE_MASK Paolo Bonzini
2026-06-02 14:22 ` mlevitsk
2026-05-05 19:52 ` [PATCH 08/28] KVM: x86/mmu: separate more EPT/non-EPT permission_fault() Paolo Bonzini
2026-05-07 14:35 ` Sean Christopherson
2026-06-02 14:22 ` mlevitsk
2026-05-05 19:52 ` [PATCH 09/28] KVM: x86/mmu: introduce ACC_READ_MASK Paolo Bonzini
2026-06-02 14:23 ` mlevitsk
2026-05-05 19:52 ` [PATCH 10/28] KVM: x86/mmu: pass PFERR_GUEST_PAGE/FINAL_MASK to kvm_translate_gpa Paolo Bonzini
2026-06-02 14:23 ` mlevitsk
2026-05-05 19:52 ` [PATCH 11/28] KVM: x86/mmu: pass pte_access for final nGPA->GPA walk Paolo Bonzini
2026-06-02 14:24 ` mlevitsk
2026-05-05 19:52 ` [PATCH 12/28] KVM: x86: make translate_nested_gpa vendor-specific Paolo Bonzini
2026-06-02 14:24 ` mlevitsk
2026-05-05 19:52 ` [PATCH 13/28] KVM: x86/mmu: split XS/XU bits for EPT Paolo Bonzini
2026-06-02 14:24 ` mlevitsk
2026-05-05 19:52 ` [PATCH 14/28] KVM: x86/mmu: move cr4_smep to base role Paolo Bonzini
2026-06-02 14:25 ` mlevitsk
2026-05-05 19:52 ` [PATCH 15/28] KVM: VMX: enable use of MBEC Paolo Bonzini
2026-05-07 14:40 ` Sean Christopherson
2026-06-02 14:26 ` mlevitsk
2026-05-05 19:52 ` [PATCH 16/28] KVM: nVMX: pass advanced EPT violation vmexit info to guest Paolo Bonzini
2026-06-02 14:26 ` mlevitsk
2026-05-05 19:52 ` [PATCH 17/28] KVM: nVMX: pass PFERR_USER_MASK to MMU on EPT violations Paolo Bonzini
2026-06-02 14:27 ` mlevitsk
2026-05-05 19:52 ` [PATCH 18/28] KVM: x86/mmu: add support for MBEC to EPT page table walks Paolo Bonzini
2026-06-02 14:28 ` mlevitsk
2026-05-05 19:52 ` [PATCH 19/28] KVM: nVMX: advertise MBEC to nested guests Paolo Bonzini
2026-06-02 14:28 ` mlevitsk
2026-05-05 19:52 ` [PATCH 20/28] KVM: nVMX: allow MBEC with EVMCS Paolo Bonzini
2026-06-02 14:28 ` mlevitsk
2026-06-02 15:29 ` Vitaly Kuznetsov
2026-05-05 19:52 ` [PATCH 21/28] KVM: x86/mmu: propagate access mask from root pages down Paolo Bonzini
2026-06-02 14:29 ` mlevitsk
2026-05-05 19:52 ` [PATCH 22/28] KVM: x86/mmu: introduce cpu_role bit for availability of PFEC.I/D Paolo Bonzini
2026-06-02 14:29 ` mlevitsk [this message]
2026-05-05 19:52 ` [PATCH 23/28] KVM: SVM: add GMET bit definitions Paolo Bonzini
2026-06-02 14:30 ` mlevitsk
2026-05-05 19:52 ` [PATCH 24/28] KVM: x86/mmu: hard code more bits in kvm_init_shadow_npt_mmu Paolo Bonzini
2026-06-02 14:30 ` mlevitsk
2026-05-05 19:52 ` [PATCH 25/28] KVM: x86/mmu: add support for GMET to NPT page table walks Paolo Bonzini
2026-06-02 14:31 ` mlevitsk
2026-05-05 19:52 ` [PATCH 26/28] KVM: SVM: enable GMET and set it in MMU role Paolo Bonzini
2026-06-02 14:31 ` mlevitsk
2026-05-05 19:52 ` [PATCH 27/28] KVM: SVM: work around errata 1218 Paolo Bonzini
2026-06-02 14:31 ` mlevitsk
2026-05-05 19:52 ` [PATCH 28/28] KVM: nSVM: enable GMET for guests Paolo Bonzini
2026-06-02 14:32 ` mlevitsk
2026-05-07 14:44 ` [PATCH v6 00/28] KVM: combined patchset for MBEC/GMET support Sean Christopherson
2026-05-07 17:49 ` Paolo Bonzini
2026-05-11 10:53 ` David Riley
2026-05-11 10:55 ` Paolo Bonzini
2026-05-11 11:07 ` David Riley
2026-05-14 2:11 ` Chao Gao
2026-05-14 19:13 ` Sean Christopherson
2026-05-12 14:32 ` Paolo Bonzini
2026-05-12 16:34 ` Paolo Bonzini
2026-05-15 14:53 ` David Riley
2026-05-15 18:31 ` Sean Christopherson
2026-05-19 8:02 ` David Riley
2026-08-05 12:35 ` Jonas Theisen
-- strict thread matches above, loose matches on Subject: below --
2026-04-30 15:07 [PATCH v5 " Paolo Bonzini
2026-04-30 15:07 ` [PATCH 22/28] KVM: x86/mmu: introduce cpu_role bit for availability of PFEC.I/D Paolo Bonzini
2026-04-28 11:09 [PATCH v4 00/28] KVM: combined patchset for MBEC/GMET support Paolo Bonzini
2026-04-28 11:09 ` [PATCH 22/28] KVM: x86/mmu: introduce cpu_role bit for availability of PFEC.I/D Paolo Bonzini
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=e82cdc2b9aa86356d971103cfe396c69c45734bb.camel@redhat.com \
--to=mlevitsk@redhat.com \
--cc=d.riley@proxmox.com \
--cc=jon@nutanix.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=pbonzini@redhat.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
all inboxes | Powered by JetHome®