| From c711192f36c4c41ec0716b1b0a20448a9cc2194f Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 14 Aug 2025 17:25:26 -0700 |
| Subject: KVM: x86: Snapshot the host's DEBUGCTL in common x86 |
| |
| From: Sean Christopherson <seanjc@google.com> |
| |
| [ Upstream commit fb71c795935652fa20eaf9517ca9547f5af99a76 ] |
| |
| Move KVM's snapshot of DEBUGCTL to kvm_vcpu_arch and take the snapshot in |
| common x86, so that SVM can also use the snapshot. |
| |
| Opportunistically change the field to a u64. While bits 63:32 are reserved |
| on AMD, not mentioned at all in Intel's SDM, and managed as an "unsigned |
| long" by the kernel, DEBUGCTL is an MSR and therefore a 64-bit value. |
| |
| Reviewed-by: Xiaoyao Li <xiaoyao.li@intel.com> |
| Cc: stable@vger.kernel.org |
| Reviewed-and-tested-by: Ravi Bangoria <ravi.bangoria@amd.com> |
| Link: https://lore.kernel.org/r/20250227222411.3490595-4-seanjc@google.com |
| Signed-off-by: Sean Christopherson <seanjc@google.com> |
| [sean: resolve minor syntatic conflict in vmx_vcpu_load()] |
| Signed-off-by: Sean Christopherson <seanjc@google.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| arch/x86/include/asm/kvm_host.h | 1 + |
| arch/x86/kvm/vmx/vmx.c | 8 ++------ |
| arch/x86/kvm/vmx/vmx.h | 2 -- |
| arch/x86/kvm/x86.c | 1 + |
| 4 files changed, 4 insertions(+), 8 deletions(-) |
| |
| diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h |
| index 5fc89d255550..b5210505abfa 100644 |
| --- a/arch/x86/include/asm/kvm_host.h |
| +++ b/arch/x86/include/asm/kvm_host.h |
| @@ -733,6 +733,7 @@ struct kvm_vcpu_arch { |
| u32 pkru; |
| u32 hflags; |
| u64 efer; |
| + u64 host_debugctl; |
| u64 apic_base; |
| struct kvm_lapic *apic; /* kernel irqchip context */ |
| bool load_eoi_exitmap_pending; |
| diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c |
| index 4563e7a9a851..9ba4baf2a9e9 100644 |
| --- a/arch/x86/kvm/vmx/vmx.c |
| +++ b/arch/x86/kvm/vmx/vmx.c |
| @@ -1499,13 +1499,9 @@ void vmx_vcpu_load_vmcs(struct kvm_vcpu *vcpu, int cpu, |
| */ |
| static void vmx_vcpu_load(struct kvm_vcpu *vcpu, int cpu) |
| { |
| - struct vcpu_vmx *vmx = to_vmx(vcpu); |
| - |
| vmx_vcpu_load_vmcs(vcpu, cpu, NULL); |
| |
| vmx_vcpu_pi_load(vcpu, cpu); |
| - |
| - vmx->host_debugctlmsr = get_debugctlmsr(); |
| } |
| |
| static void vmx_vcpu_put(struct kvm_vcpu *vcpu) |
| @@ -7414,8 +7410,8 @@ static fastpath_t vmx_vcpu_run(struct kvm_vcpu *vcpu) |
| } |
| |
| /* MSR_IA32_DEBUGCTLMSR is zeroed on vmexit. Restore it if needed */ |
| - if (vmx->host_debugctlmsr) |
| - update_debugctlmsr(vmx->host_debugctlmsr); |
| + if (vcpu->arch.host_debugctl) |
| + update_debugctlmsr(vcpu->arch.host_debugctl); |
| |
| #ifndef CONFIG_X86_64 |
| /* |
| diff --git a/arch/x86/kvm/vmx/vmx.h b/arch/x86/kvm/vmx/vmx.h |
| index 88c5b7ebf9d3..fb36bde2dd87 100644 |
| --- a/arch/x86/kvm/vmx/vmx.h |
| +++ b/arch/x86/kvm/vmx/vmx.h |
| @@ -340,8 +340,6 @@ struct vcpu_vmx { |
| /* apic deadline value in host tsc */ |
| u64 hv_deadline_tsc; |
| |
| - unsigned long host_debugctlmsr; |
| - |
| /* |
| * Only bits masked by msr_ia32_feature_control_valid_bits can be set in |
| * msr_ia32_feature_control. FEAT_CTL_LOCKED is always included |
| diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c |
| index 55185670e0e5..7aff0fe469c3 100644 |
| --- a/arch/x86/kvm/x86.c |
| +++ b/arch/x86/kvm/x86.c |
| @@ -4823,6 +4823,7 @@ void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu) |
| |
| /* Save host pkru register if supported */ |
| vcpu->arch.host_pkru = read_pkru(); |
| + vcpu->arch.host_debugctl = get_debugctlmsr(); |
| |
| /* Apply any externally detected TSC adjustments (due to suspend) */ |
| if (unlikely(vcpu->arch.tsc_offset_adjustment)) { |
| -- |
| 2.50.1 |
| |