From: Sohil Mehta <sohil.mehta@intel.com>
To: Binbin Wu <binbin.wu@linux.intel.com>,
Sean Christopherson <seanjc@google.com>
Cc: <kvm@vger.kernel.org>, <x86@kernel.org>,
Paolo Bonzini <pbonzini@redhat.com>,
Jonathan Corbet <corbet@lwn.net>,
Shuah Khan <skhan@linuxfoundation.org>,
Thomas Gleixner <tglx@kernel.org>, Ingo Molnar <mingo@redhat.com>,
Borislav Petkov <bp@alien8.de>,
Dave Hansen <dave.hansen@linux.intel.com>,
"H . Peter Anvin" <hpa@zytor.com>, Xin Li <xin@zytor.com>,
Andy Lutomirski <luto@kernel.org>,
Peter Zijlstra <peterz@infradead.org>,
Andrew Cooper <andrew.cooper3@citrix.com>,
"Tom Lendacky" <thomas.lendacky@amd.com>,
Nikunj A Dadhania <nikunj@amd.com>,
Shivansh Dhiman <shivansh.dhiman@amd.com>,
David Woodhouse <dwmw@amazon.co.uk>,
Chao Gao <chao.gao@intel.com>, Zhao Liu <zhao1.liu@intel.com>,
Yosry Ahmed <yosry@kernel.org>,
David Matlack <dmatlack@google.com>, <linux-doc@vger.kernel.org>,
<linux-kernel@vger.kernel.org>, <linux-kselftest@vger.kernel.org>
Subject: Re: [PATCH v10 15/28] KVM: x86: Include CR4.FRED in the emulator CR4 write mask
Date: Fri, 6 Nov 2026 17:49:33 -0800 [thread overview]
Message-ID: <4e5494a1-49d0-409e-b459-f07ffff4c298@intel.com> (raw)
In-Reply-To: <8fd0bb21-c273-4f43-8c08-5e82ea1ed8e5@linux.intel.com>
On 10/29/2026 11:26 PM, Binbin Wu wrote:
> On 9/12/2026 5:36 AM, Sohil Mehta wrote:
>> From: Xin Li <xin@zytor.com>
>>
>> Add CR4.FRED to the emulator's CR4 write mask. Historically, CR4 was
>> restricted to its lower 32 bits in the x86 architecture. With the
>> introduction of FRED, CR4 is expanded to use its higher 32 bits to
>> accommodate the FRED enablement bit at position 32. Update the mask
>> to ensure the emulator correctly handles FRED initialization and
>> prevents the inadvertent truncation of high-order bits.
>>
>> Signed-off-by: Xin Li <xin@zytor.com>
>> Signed-off-by: Sohil Mehta <sohil.mehta@intel.com>
>> ---
>> v10:
>> - New patch
>> ---
>> arch/x86/kvm/regs.h | 2 +-
>> arch/x86/kvm/x86.c | 12 +++++++++---
>> 2 files changed, 10 insertions(+), 4 deletions(-)
>>
>> diff --git a/arch/x86/kvm/regs.h b/arch/x86/kvm/regs.h
>> index 4e641a6c20f9..ef46918daf43 100644
>> --- a/arch/x86/kvm/regs.h
>> +++ b/arch/x86/kvm/regs.h
>> @@ -8,7 +8,7 @@
>> #define KVM_POSSIBLE_CR4_GUEST_BITS \
>> (X86_CR4_PVI | X86_CR4_DE | X86_CR4_PCE | X86_CR4_OSFXSR \
>> | X86_CR4_OSXMMEXCPT | X86_CR4_PGE | X86_CR4_TSD | X86_CR4_FSGSBASE \
>> - | X86_CR4_CET)
>> + | X86_CR4_CET | X86_CR4_FRED)
>>
Looking at this again. I am not sure if this is accurate. Sean's comment
in v9 was that KVM should always intercept and emulate CR4.FRED writes.
IIUC, by default the bit is KVM owned. So, adding FRED to this guest
list seems opposite to that preference.
>> #define X86_CR0_PDPTR_BITS (X86_CR0_CD | X86_CR0_NW | X86_CR0_PG)
>> #define X86_CR4_TLBFLUSH_BITS (X86_CR4_PGE | X86_CR4_PCIDE | X86_CR4_PAE | X86_CR4_SMEP)
>> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
>> index e10ac6b280f6..f264bc9c35f9 100644
>> --- a/arch/x86/kvm/x86.c
>> +++ b/arch/x86/kvm/x86.c
>> @@ -5552,11 +5552,17 @@ static int emulator_set_dr(struct x86_emulate_ctxt *ctxt, int dr,
>> return kvm_set_dr(emul_to_vcpu(ctxt), dr, value);
>> }
>>
>> -static u64 mk_cr_64(u64 curr_cr, u32 new_val)
>> +static u64 mk_cr0_64(u64 curr_cr, u32 new_val)
>> {
>> return (curr_cr & ~((1ULL << 32) - 1)) | new_val;
>> }
>>
>> +static u64 mk_cr4_64(struct kvm_vcpu *vcpu, u64 curr_cr, u64 new_val)
>> +{
>> + u32 shift = guest_cpu_cap_has(vcpu, X86_FEATURE_FRED) ? 33 : 32;
>> + return (curr_cr & ~((1ULL << shift) - 1)) | new_val;
>> +}
>
> It's a bit weird to do it based on specific features.
>
> Also, I am not sure this is needed to do the special handling to preserve
> the higher bits.
> emulator has zero extended the higher bits in fetch_register_operand() if
> in non-64bit mode. I think we can just take the full 64-bit new value?
> Did I miss anything?
>
You are right. The value is already the full operand in 64-bit mode and
zero extended otherwise.
> And also for CR0, is the special handling needed?
>
Yeah, this whole thing is unnecessarily complex. I think we can get rid
of mk_cr_64() and drop this patch entirely. How about something like
below (based on kvm-x86-next-2026.10.13)?
>> +
>> static unsigned long emulator_get_cr(struct x86_emulate_ctxt *ctxt, int cr)
>> {
>> struct kvm_vcpu *vcpu = emul_to_vcpu(ctxt);
>> @@ -5593,7 +5599,7 @@ static int emulator_set_cr(struct x86_emulate_ctxt *ctxt, int cr, ulong val)
>>
>> switch (cr) {
>> case 0:
>> - res = kvm_set_cr0(vcpu, mk_cr_64(kvm_read_cr0(vcpu), val));
>> + res = kvm_set_cr0(vcpu, mk_cr0_64(kvm_read_cr0(vcpu), val));
>> break;
>> case 2:
>> vcpu->arch.cr2 = val;
>> @@ -5602,7 +5608,7 @@ static int emulator_set_cr(struct x86_emulate_ctxt *ctxt, int cr, ulong val)
>> res = kvm_set_cr3(vcpu, val);
>> break;
>> case 4:
>> - res = kvm_set_cr4(vcpu, mk_cr_64(kvm_read_cr4(vcpu), val));
>> + res = kvm_set_cr4(vcpu, mk_cr4_64(vcpu, kvm_read_cr4(vcpu), val));
>> break;
>> case 8:
>> res = kvm_set_cr8(vcpu, val);
>
KVM: x86: Stop truncating CR0/CR4 writes from the emulator
Pass the new value directly to kvm_set_cr0() and kvm_set_cr4() when
emulating MOV to CR, instead of taking the low 32 bits of the new value
and the upper 32 bits of the current value. Preserving the upper half is
not needed, as KVM never allows a bit above bit 31 to be set in CR0 or
CR4. In practice, mk_cr_64() only truncates the new value, which allows
an emulated write that sets a reserved bit in CR[63:32] to succeed
instead of generating #GP.
Truncating the value is unnecessary to begin with. MOV to CR is emulated
with Op3264, i.e. the emulator provides the architectural value: the
full operand in 64-bit mode, and a zero-extended 32-bit operand
otherwise. Note, only the emulator is special in this regard, VMX and
SVM pass the guest's value through as-is when handling CR access exits.
Dropping the truncation also readies the emulator for FRED. CR4.FRED
(bit 32) is the first CR4 bit defined in the upper half. It now needs no
special handling as the full value is passed through.
Signed-off-by: Sohil Mehta <sohil.mehta@intel.com>
---
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 32563a91fba9..a6f94595ac75 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -5541,11 +5541,6 @@ static int emulator_set_dr(struct
x86_emulate_ctxt *ctxt, int dr,
return kvm_set_dr(emul_to_vcpu(ctxt), dr, value);
}
-static u64 mk_cr_64(u64 curr_cr, u32 new_val)
-{
- return (curr_cr & ~((1ULL << 32) - 1)) | new_val;
-}
-
static unsigned long emulator_get_cr(struct x86_emulate_ctxt *ctxt, int cr)
{
struct kvm_vcpu *vcpu = emul_to_vcpu(ctxt);
@@ -5582,7 +5577,7 @@ static int emulator_set_cr(struct x86_emulate_ctxt
*ctxt, int cr, ulong val)
switch (cr) {
case 0:
- res = kvm_set_cr0(vcpu, mk_cr_64(kvm_read_cr0(vcpu), val));
+ res = kvm_set_cr0(vcpu, val);
break;
case 2:
vcpu->arch.cr2 = val;
@@ -5591,7 +5586,7 @@ static int emulator_set_cr(struct x86_emulate_ctxt
*ctxt, int cr, ulong val)
res = kvm_set_cr3(vcpu, val);
break;
case 4:
- res = kvm_set_cr4(vcpu, mk_cr_64(kvm_read_cr4(vcpu), val));
+ res = kvm_set_cr4(vcpu, val);
break;
case 8:
res = kvm_set_cr8(vcpu, val);
next prev parent reply other threads:[~2026-11-07 1:49 UTC|newest]
Thread overview: 84+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-11 21:36 [PATCH v10 00/28] KVM: Enable FRED support with KVM VMX Sohil Mehta
2026-09-11 21:36 ` [PATCH v10 01/28] KVM: VMX: Enable support for secondary VM exit controls Sohil Mehta
2026-10-22 9:27 ` Binbin Wu
2026-10-23 2:09 ` Sohil Mehta
2026-09-11 21:36 ` [PATCH v10 02/28] KVM: VMX: Initialize VM entry/exit FRED controls in vmcs_config Sohil Mehta
2026-10-22 9:48 ` Binbin Wu
2026-10-23 3:10 ` Sohil Mehta
2026-10-26 5:00 ` Sohil Mehta
2026-10-27 1:25 ` Binbin Wu
2026-09-11 21:36 ` [PATCH v10 03/28] KVM: VMX: Disable FRED if FRED consistency checks fail Sohil Mehta
2026-10-22 10:19 ` Binbin Wu
2026-10-23 3:13 ` Sohil Mehta
2026-09-11 21:36 ` [PATCH v10 04/28] x86/cea: Prefix event stack names with ESTACK_ Sohil Mehta
2026-10-23 5:58 ` Binbin Wu
2026-09-11 21:36 ` [PATCH v10 05/28] x86/cea: Use array indexing to simplify exception stack access Sohil Mehta
2026-10-23 6:07 ` Binbin Wu
2026-10-27 21:15 ` Sohil Mehta
2026-09-11 21:36 ` [PATCH v10 06/28] x86/fred: Export this_cpu_fred_rsp() for KVM usage Sohil Mehta
2026-10-23 6:49 ` Binbin Wu
2026-10-28 0:44 ` Sohil Mehta
2026-09-11 21:36 ` [PATCH v10 07/28] KVM: VMX: Initialize VMCS FRED fields Sohil Mehta
2026-10-23 7:19 ` Binbin Wu
2026-10-29 0:13 ` Sohil Mehta
2026-09-11 21:36 ` [PATCH v10 08/28] KVM: VMX: Set FRED MSR intercepts Sohil Mehta
2026-10-23 8:07 ` Binbin Wu
2026-10-29 2:42 ` Sohil Mehta
2026-09-11 21:36 ` [PATCH v10 09/28] KVM: VMX: Save/restore guest FRED RSP0 Sohil Mehta
2026-09-14 7:04 ` Binbin Wu
2026-09-14 16:14 ` Edgecombe, Rick P
2026-09-15 8:43 ` Binbin Wu
2026-09-11 21:36 ` [PATCH v10 10/28] KVM: VMX: Add support for saving and restoring FRED MSRs Sohil Mehta
2026-10-23 8:59 ` Binbin Wu
2026-10-29 6:18 ` Sohil Mehta
2026-09-11 21:36 ` [PATCH v10 11/28] KVM: x86: Add a helper to detect if FRED is enabled for a vCPU Sohil Mehta
2026-10-23 9:21 ` Binbin Wu
2026-11-04 20:01 ` Sohil Mehta
2026-11-05 5:16 ` Binbin Wu
2026-11-06 4:05 ` Sohil Mehta
2026-09-11 21:36 ` [PATCH v10 12/28] KVM: x86: Add a new save/restore flag for FRED metadata Sohil Mehta
2026-10-29 3:10 ` Binbin Wu
2026-11-05 1:06 ` Sohil Mehta
2026-09-11 21:36 ` [PATCH v10 13/28] KVM: VMX: Virtualize FRED nested exception tracking Sohil Mehta
2026-10-29 8:41 ` Binbin Wu
2026-11-06 19:51 ` Sohil Mehta
2026-09-11 21:36 ` [PATCH v10 14/28] KVM: VMX: Virtualize FRED event_data Sohil Mehta
2026-10-29 10:55 ` Binbin Wu
2026-11-06 21:28 ` Sohil Mehta
2026-09-11 21:36 ` [PATCH v10 15/28] KVM: x86: Include CR4.FRED in the emulator CR4 write mask Sohil Mehta
2026-10-30 6:26 ` Binbin Wu
2026-11-07 1:49 ` Sohil Mehta [this message]
2026-09-11 21:36 ` [PATCH v10 16/28] KVM: x86: Mark CR4.FRED as not reserved Sohil Mehta
2026-10-30 6:42 ` Binbin Wu
2026-09-11 21:36 ` [PATCH v10 17/28] KVM: x86: Handle CR4.FRED when emulating RSM Sohil Mehta
2026-09-11 21:36 ` [PATCH v10 18/28] KVM: VMX: Dump FRED context in dump_vmcs() Sohil Mehta
2026-09-11 21:36 ` [PATCH v10 19/28] KVM: x86: Advertise support for FRED Sohil Mehta
2026-11-02 7:32 ` Binbin Wu
2026-09-11 21:36 ` [PATCH v10 20/28] KVM: nVMX: Enable support for secondary VM exit controls Sohil Mehta
2026-11-02 8:29 ` Binbin Wu
2026-09-11 21:36 ` [PATCH v10 21/28] KVM: nVMX: Handle FRED VMCS fields in nested VMX context Sohil Mehta
2026-11-04 6:43 ` Binbin Wu
2026-09-11 21:36 ` [PATCH v10 22/28] KVM: nVMX: Restrict event data VMCS fields to FRED-supported hosts Sohil Mehta
2026-11-04 6:57 ` Binbin Wu
2026-11-04 13:32 ` Chao Gao
2026-09-11 21:36 ` [PATCH v10 23/28] KVM: nVMX: Shadow ORIGINAL_EVENT_DATA and INJECTED_EVENT_DATA fields Sohil Mehta
2026-11-04 7:10 ` Binbin Wu
2026-09-11 21:36 ` [PATCH v10 24/28] KVM: nVMX: Validate FRED-related VMCS fields Sohil Mehta
2026-09-11 21:36 ` [PATCH v10 25/28] KVM: nVMX: Enable VMX FRED controls Sohil Mehta
2026-09-11 21:36 ` [PATCH v10 26/28] KVM: selftests: Add FRED MSRs to msrs_test Sohil Mehta
2026-09-11 21:36 ` [PATCH v10 27/28] KVM: selftests: Add a new VM guest mode to run user level code Sohil Mehta
2026-09-11 21:36 ` [PATCH v10 28/28] KVM: selftests: Add fred exception tests Sohil Mehta
2026-09-15 6:03 ` [PATCH v10 00/28] KVM: Enable FRED support with KVM VMX Xin Li
2026-10-24 22:59 ` H. Peter Anvin
2026-10-26 16:04 ` Sean Christopherson
2026-10-26 17:22 ` Sohil Mehta
2026-10-26 22:22 ` Sohil Mehta
2026-10-27 17:43 ` Sohil Mehta
2026-09-15 10:00 ` [EXTERNAL] " David Woodhouse
2026-09-24 11:14 ` Shivansh Dhiman
2026-09-24 14:13 ` David Woodhouse
2026-09-25 12:06 ` Shivansh Dhiman
2026-10-28 5:48 ` H. Peter Anvin
2026-10-19 20:46 ` Dave Hansen
2026-10-19 22:19 ` Sohil Mehta
2026-10-30 20:53 ` Chang S. Bae
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=4e5494a1-49d0-409e-b459-f07ffff4c298@intel.com \
--to=sohil.mehta@intel.com \
--cc=andrew.cooper3@citrix.com \
--cc=binbin.wu@linux.intel.com \
--cc=bp@alien8.de \
--cc=chao.gao@intel.com \
--cc=corbet@lwn.net \
--cc=dave.hansen@linux.intel.com \
--cc=dmatlack@google.com \
--cc=dwmw@amazon.co.uk \
--cc=hpa@zytor.com \
--cc=kvm@vger.kernel.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=luto@kernel.org \
--cc=mingo@redhat.com \
--cc=nikunj@amd.com \
--cc=pbonzini@redhat.com \
--cc=peterz@infradead.org \
--cc=seanjc@google.com \
--cc=shivansh.dhiman@amd.com \
--cc=skhan@linuxfoundation.org \
--cc=tglx@kernel.org \
--cc=thomas.lendacky@amd.com \
--cc=x86@kernel.org \
--cc=xin@zytor.com \
--cc=yosry@kernel.org \
--cc=zhao1.liu@intel.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®