From: Sean Christopherson <seanjc@google.com>
To: "Xin Li (Intel)" <xin@zytor.com>
Cc: pbonzini@redhat.com, kvm@vger.kernel.org,
linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org,
corbet@lwn.net, tglx@linutronix.de, mingo@redhat.com,
bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org,
hpa@zytor.com, andrew.cooper3@citrix.com, luto@kernel.org,
peterz@infradead.org, chao.gao@intel.com, xin3.li@intel.com
Subject: Re: [PATCH v4 14/19] KVM: VMX: Dump FRED context in dump_vmcs()
Date: Tue, 24 Jun 2025 09:32:01 -0700 [thread overview]
Message-ID: <aFrTAT-xTLmlwO5V@google.com> (raw)
In-Reply-To: <20250328171205.2029296-15-xin@zytor.com>
On Fri, Mar 28, 2025, Xin Li (Intel) wrote:
> From: Xin Li <xin3.li@intel.com>
>
> Add FRED related VMCS fields to dump_vmcs() to dump FRED context.
>
> Signed-off-by: Xin Li <xin3.li@intel.com>
> Signed-off-by: Xin Li (Intel) <xin@zytor.com>
> Tested-by: Shan Kang <shan.kang@intel.com>
> ---
>
> Change in v3:
> * Use (vmentry_ctrl & VM_ENTRY_LOAD_IA32_FRED) instead of is_fred_enabled()
> (Chao Gao).
>
> Changes in v2:
> * Use kvm_cpu_cap_has() instead of cpu_feature_enabled() (Chao Gao).
> * Dump guest FRED states only if guest has FRED enabled (Nikolay Borisov).
> ---
> arch/x86/kvm/vmx/vmx.c | 40 +++++++++++++++++++++++++++++++++-------
> 1 file changed, 33 insertions(+), 7 deletions(-)
>
> diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
> index c76015e1e3f8..03855d6690b2 100644
> --- a/arch/x86/kvm/vmx/vmx.c
> +++ b/arch/x86/kvm/vmx/vmx.c
> @@ -6462,7 +6462,7 @@ void dump_vmcs(struct kvm_vcpu *vcpu)
> struct vcpu_vmx *vmx = to_vmx(vcpu);
> u32 vmentry_ctl, vmexit_ctl;
> u32 cpu_based_exec_ctrl, pin_based_exec_ctrl, secondary_exec_control;
> - u64 tertiary_exec_control;
> + u64 tertiary_exec_control, secondary_vmexit_ctl;
> unsigned long cr4;
> int efer_slot;
>
> @@ -6473,6 +6473,8 @@ void dump_vmcs(struct kvm_vcpu *vcpu)
>
> vmentry_ctl = vmcs_read32(VM_ENTRY_CONTROLS);
> vmexit_ctl = vmcs_read32(VM_EXIT_CONTROLS);
> + secondary_vmexit_ctl = cpu_has_secondary_vmexit_ctrls() ?
> + vmcs_read64(SECONDARY_VM_EXIT_CONTROLS) : 0;
> cpu_based_exec_ctrl = vmcs_read32(CPU_BASED_VM_EXEC_CONTROL);
> pin_based_exec_ctrl = vmcs_read32(PIN_BASED_VM_EXEC_CONTROL);
> cr4 = vmcs_readl(GUEST_CR4);
> @@ -6519,6 +6521,16 @@ void dump_vmcs(struct kvm_vcpu *vcpu)
> vmx_dump_sel("LDTR:", GUEST_LDTR_SELECTOR);
> vmx_dump_dtsel("IDTR:", GUEST_IDTR_LIMIT);
> vmx_dump_sel("TR: ", GUEST_TR_SELECTOR);
> + if (vmentry_ctl & VM_ENTRY_LOAD_IA32_FRED)
> + pr_err("FRED guest: config=0x%016llx, stack_levels=0x%016llx\n"
> + "RSP0=0x%016llx, RSP1=0x%016llx\n"
> + "RSP2=0x%016llx, RSP3=0x%016llx\n",
> + vmcs_read64(GUEST_IA32_FRED_CONFIG),
> + vmcs_read64(GUEST_IA32_FRED_STKLVLS),
> + __rdmsr(MSR_IA32_FRED_RSP0),
There is no guarantee the vCPU's FRED_RSP is loaded in hardware at this point.
I think you need to use vmx_read_guest_fred_rsp0().
> + vmcs_read64(GUEST_IA32_FRED_RSP1),
> + vmcs_read64(GUEST_IA32_FRED_RSP2),
> + vmcs_read64(GUEST_IA32_FRED_RSP3));
> efer_slot = vmx_find_loadstore_msr_slot(&vmx->msr_autoload.guest, MSR_EFER);
> if (vmentry_ctl & VM_ENTRY_LOAD_IA32_EFER)
> pr_err("EFER= 0x%016llx\n", vmcs_read64(GUEST_IA32_EFER));
> @@ -6566,6 +6578,16 @@ void dump_vmcs(struct kvm_vcpu *vcpu)
> vmcs_readl(HOST_TR_BASE));
> pr_err("GDTBase=%016lx IDTBase=%016lx\n",
> vmcs_readl(HOST_GDTR_BASE), vmcs_readl(HOST_IDTR_BASE));
> + if (vmexit_ctl & SECONDARY_VM_EXIT_LOAD_IA32_FRED)
> + pr_err("FRED host: config=0x%016llx, stack_levels=0x%016llx\n"
> + "RSP0=0x%016lx, RSP1=0x%016llx\n"
> + "RSP2=0x%016llx, RSP3=0x%016llx\n",
> + vmcs_read64(HOST_IA32_FRED_CONFIG),
> + vmcs_read64(HOST_IA32_FRED_STKLVLS),
> + (unsigned long)task_stack_page(current) + THREAD_SIZE,
Maybe add a helper in arch/x86/include/asm/fred.h to generate the desired RSP0?
Not sure it's worth doing that just for this code.
> + vmcs_read64(HOST_IA32_FRED_RSP1),
> + vmcs_read64(HOST_IA32_FRED_RSP2),
> + vmcs_read64(HOST_IA32_FRED_RSP3));
> pr_err("CR0=%016lx CR3=%016lx CR4=%016lx\n",
> vmcs_readl(HOST_CR0), vmcs_readl(HOST_CR3),
> vmcs_readl(HOST_CR4));
> @@ -6587,25 +6609,29 @@ void dump_vmcs(struct kvm_vcpu *vcpu)
> pr_err("*** Control State ***\n");
> pr_err("CPUBased=0x%08x SecondaryExec=0x%08x TertiaryExec=0x%016llx\n",
> cpu_based_exec_ctrl, secondary_exec_control, tertiary_exec_control);
> - pr_err("PinBased=0x%08x EntryControls=%08x ExitControls=%08x\n",
> - pin_based_exec_ctrl, vmentry_ctl, vmexit_ctl);
> + pr_err("PinBased=0x%08x EntryControls=0x%08x\n",
> + pin_based_exec_ctrl, vmentry_ctl);
> + pr_err("ExitControls=0x%08x SecondaryExitControls=0x%016llx\n",
> + vmexit_ctl, secondary_vmexit_ctl);
> pr_err("ExceptionBitmap=%08x PFECmask=%08x PFECmatch=%08x\n",
> vmcs_read32(EXCEPTION_BITMAP),
> vmcs_read32(PAGE_FAULT_ERROR_CODE_MASK),
> vmcs_read32(PAGE_FAULT_ERROR_CODE_MATCH));
> - pr_err("VMEntry: intr_info=%08x errcode=%08x ilen=%08x\n",
> + pr_err("VMEntry: intr_info=%08x errcode=%08x ilen=%08x event_data=%016llx\n",
> vmcs_read32(VM_ENTRY_INTR_INFO_FIELD),
> vmcs_read32(VM_ENTRY_EXCEPTION_ERROR_CODE),
> - vmcs_read32(VM_ENTRY_INSTRUCTION_LEN));
> + vmcs_read32(VM_ENTRY_INSTRUCTION_LEN),
> + kvm_cpu_cap_has(X86_FEATURE_FRED) ? vmcs_read64(INJECTED_EVENT_DATA) : 0);
> pr_err("VMExit: intr_info=%08x errcode=%08x ilen=%08x\n",
> vmcs_read32(VM_EXIT_INTR_INFO),
> vmcs_read32(VM_EXIT_INTR_ERROR_CODE),
> vmcs_read32(VM_EXIT_INSTRUCTION_LEN));
> pr_err(" reason=%08x qualification=%016lx\n",
> vmcs_read32(VM_EXIT_REASON), vmcs_readl(EXIT_QUALIFICATION));
> - pr_err("IDTVectoring: info=%08x errcode=%08x\n",
> + pr_err("IDTVectoring: info=%08x errcode=%08x event_data=%016llx\n",
> vmcs_read32(IDT_VECTORING_INFO_FIELD),
> - vmcs_read32(IDT_VECTORING_ERROR_CODE));
> + vmcs_read32(IDT_VECTORING_ERROR_CODE),
> + kvm_cpu_cap_has(X86_FEATURE_FRED) ? vmcs_read64(ORIGINAL_EVENT_DATA) : 0);
> pr_err("TSC Offset = 0x%016llx\n", vmcs_read64(TSC_OFFSET));
> if (secondary_exec_control & SECONDARY_EXEC_TSC_SCALING)
> pr_err("TSC Multiplier = 0x%016llx\n",
> --
> 2.48.1
>
next prev parent reply other threads:[~2025-06-24 16:32 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-03-28 17:11 [PATCH v4 00/19] Enable FRED with KVM VMX Xin Li (Intel)
2025-03-28 17:11 ` [PATCH v4 01/19] KVM: VMX: Add support for the secondary VM exit controls Xin Li (Intel)
2025-03-28 17:11 ` [PATCH v4 02/19] KVM: VMX: Initialize VM entry/exit FRED controls in vmcs_config Xin Li (Intel)
2025-04-14 7:41 ` Chao Gao
2025-04-14 16:53 ` Xin Li
2025-03-28 17:11 ` [PATCH v4 03/19] KVM: VMX: Disable FRED if FRED consistency checks fail Xin Li (Intel)
2025-06-24 15:20 ` Sean Christopherson
2025-03-28 17:11 ` [PATCH v4 04/19] x86/cea: Export per CPU array 'cea_exception_stacks' for KVM to use Xin Li (Intel)
2025-04-10 8:53 ` Christoph Hellwig
2025-04-10 14:18 ` Dave Hansen
2025-04-11 16:16 ` Xin Li
2025-03-28 17:11 ` [PATCH v4 05/19] KVM: VMX: Initialize VMCS FRED fields Xin Li (Intel)
2025-03-28 17:11 ` [PATCH v4 06/19] KVM: VMX: Set FRED MSR interception Xin Li (Intel)
2025-06-24 15:27 ` Sean Christopherson
2025-03-28 17:11 ` [PATCH v4 07/19] KVM: VMX: Save/restore guest FRED RSP0 Xin Li (Intel)
2025-06-24 15:44 ` Sean Christopherson
2025-03-28 17:11 ` [PATCH v4 08/19] KVM: VMX: Add support for FRED context save/restore Xin Li (Intel)
2025-06-24 16:27 ` Sean Christopherson
2025-06-25 17:18 ` Xin Li
2025-06-26 17:22 ` Xin Li
2025-06-26 20:50 ` Sean Christopherson
2025-03-28 17:11 ` [PATCH v4 09/19] KVM: x86: Add a helper to detect if FRED is enabled for a vCPU Xin Li (Intel)
2025-03-28 17:11 ` [PATCH v4 10/19] KVM: VMX: Virtualize FRED event_data Xin Li (Intel)
2025-03-28 17:11 ` [PATCH v4 11/19] KVM: VMX: Virtualize FRED nested exception tracking Xin Li (Intel)
2025-03-28 17:11 ` [PATCH v4 12/19] KVM: x86: Save/restore the nested flag of an exception Xin Li (Intel)
2025-03-28 17:11 ` [PATCH v4 13/19] KVM: x86: Mark CR4.FRED as not reserved Xin Li (Intel)
2025-03-28 17:12 ` [PATCH v4 14/19] KVM: VMX: Dump FRED context in dump_vmcs() Xin Li (Intel)
2025-06-24 16:32 ` Sean Christopherson [this message]
2025-06-25 17:38 ` Xin Li
2025-03-28 17:12 ` [PATCH v4 15/19] KVM: x86: Allow FRED/LKGS to be advertised to guests Xin Li (Intel)
2025-06-24 16:38 ` Sean Christopherson
2025-06-25 18:05 ` Xin Li
2025-06-25 18:29 ` Sean Christopherson
2025-03-28 17:12 ` [PATCH v4 16/19] KVM: nVMX: Add support for the secondary VM exit controls Xin Li (Intel)
2025-06-24 16:54 ` Sean Christopherson
2025-03-28 17:12 ` [PATCH v4 17/19] KVM: nVMX: Add FRED VMCS fields to nested VMX context management Xin Li (Intel)
2025-03-28 17:12 ` [PATCH v4 18/19] KVM: nVMX: Add VMCS FRED states checking Xin Li (Intel)
2025-03-28 17:12 ` [PATCH v4 19/19] KVM: nVMX: Allow VMX FRED controls Xin Li (Intel)
2025-03-28 17:25 ` [PATCH v4 00/19] Enable FRED with KVM VMX Xin Li
2025-06-24 17:06 ` Sean Christopherson
2025-06-24 17:43 ` Xin Li
2025-06-24 17:47 ` H. Peter Anvin
2025-06-24 18:02 ` Xin Li
2025-06-24 18:40 ` H. Peter Anvin
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=aFrTAT-xTLmlwO5V@google.com \
--to=seanjc@google.com \
--cc=andrew.cooper3@citrix.com \
--cc=bp@alien8.de \
--cc=chao.gao@intel.com \
--cc=corbet@lwn.net \
--cc=dave.hansen@linux.intel.com \
--cc=hpa@zytor.com \
--cc=kvm@vger.kernel.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=luto@kernel.org \
--cc=mingo@redhat.com \
--cc=pbonzini@redhat.com \
--cc=peterz@infradead.org \
--cc=tglx@linutronix.de \
--cc=x86@kernel.org \
--cc=xin3.li@intel.com \
--cc=xin@zytor.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.