FAILED: patch "[PATCH] KVM: x86: Always initialize EFER reserved bits on vendor" failed to apply to 7.2-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 7.2-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-7.2.y
git checkout FETCH_HEAD
git cherry-pick -x a4b8acd428ba3f03952ef309d7f438dbc357557b
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026090906-angling-trickily-a20c@gregkh' --subject-prefix 'PATCH 7.2.y' 'HEAD^..'
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From a4b8acd428ba3f03952ef309d7f438dbc357557b Mon Sep 17 00:00:00 2001
From: Yosry Ahmed <[email protected]>
Date: Mon, 13 Jul 2026 18:10:18 +0000
Subject: [PATCH] KVM: x86: Always initialize EFER reserved bits on vendor
initialization
EFER reserved bits are statically initialized, and do not reset if a vendor module is re-loaded. For example, loading kvm_amd with nested=1 removes EFER.SVME (and potentially EFER.LMSLE) from the reserved bits. Reloading kvm_amd with nested=0 does not add them back, allowing userspace to set EFER.SVME with nested=0.
Re-initializing EFER reserved bits before configuring them on vendor initialization.
arch/x86/kvm/msrs.c +8 -2
@@ -19,8 +19,7 @@ bool __read_mostly report_ignored_msrs = true;module_param (report_ignored_msrs, bool,0644 );EXPORT_SYMBOL_FOR_KVM_INTERNAL (report_ignored_msrs); -/* Enable syscall by default because its emulated by KVM */ -static u64 __read_mostly efer_reserved_bits = ~((u64 )EFER_SCE ); +static u64 __read_mostly efer_reserved_bits;#define MAX_IO_MSRS 256
@@ -650,6 +649,13 @@ static int set_efer(struct kvm_vcpu *vcpu, struct msr_data *msr_info)return 0 ; } +void kvm_init_efer_bits (void ) +{ +/* Enable syscall by default because its emulated by KVM */ + efer_reserved_bits = ~((u64 )EFER_SCE ); +} +EXPORT_SYMBOL_FOR_KVM_INTERNAL (kvm_init_efer_bits); +void kvm_enable_efer_bits (u64 mask) { efer_reserved_bits &= ~mask;
arch/x86/kvm/msrs.h +1 -0
@@ -58,6 +58,7 @@ int kvm_get_set_one_reg(struct kvm_vcpu *vcpu, unsigned int ioctl,int kvm_get_reg_list (struct kvm_vcpu *vcpu,struct kvm_reg_list __user *user_list); +void kvm_init_efer_bits (void );void kvm_enable_efer_bits (u64 );bool kvm_valid_efer (struct kvm_vcpu *vcpu,u64 efer);int kvm_emulate_msr_read (struct kvm_vcpu *vcpu,u32 index,u64 *data);
arch/x86/kvm/x86.c +2 -0
@@ -6910,6 +6910,8 @@ EXPORT_SYMBOL_FOR_KVM_INTERNAL(kvm_setup_xss_caps);static void kvm_setup_efer_caps (void ) { +kvm_init_efer_bits (); +if (kvm_cpu_cap_has (X86_FEATURE_LM ))kvm_enable_efer_bits (EFER_LME |EFER_LMA );
Sasha Levin
maintainerPATCH 1/7 KVM: x86: Move tdp_enabled from kvm_host.h to mmu.h
From: Sean Christopherson <[email protected]>
[ Upstream commit af0dbcaaa2bbc90ba8e6f696be725c4522face08 ]
Relocated the declaration of tdp_enabled into mmu.h, and opportunistically hoist tdp_mmu_enabled up to the top so that the two are co-located.
No functional change intended.
Message-ID: <[email protected]>
Stable-dep-of: a4b8acd428ba ("KVM: x86: Always initialize EFER reserved bits on vendor initialization")
--- arch/x86/include/asm/kvm_host.h | 2 -- arch/x86/kvm/mmu.h | 12 ++++++------ 2 files changed, 6 insertions(+), 8 deletions(-)
arch/x86/include/asm/kvm_host.h +0 -2
@@ -2148,8 +2148,6 @@ void kvm_zap_gfn_range(struct kvm *kvm, gfn_t gfn_start, gfn_t gfn_end);int load_pdptrs (struct kvm_vcpu *vcpu,unsigned long cr3); -extern bool tdp_enabled; -/* * EMULTYPE_NO_DECODE - Set when re-emulating an instruction (after completing * userspace I/O) to indicate that the emulation context
arch/x86/kvm/mmu.h +6 -6
@@ -7,6 +7,12 @@#include "x86.h" #include "cpuid.h" +extern bool tdp_enabled; +#ifdef CONFIG_X86_64 +extern bool tdp_mmu_enabled; +#else +#define tdp_mmu_enabled false +#endif extern bool __read_mostly enable_mmio_caching;#define PT_WRITABLE_SHIFT 1
@@ -261,12 +267,6 @@ static inline bool kvm_shadow_root_allocated(struct kvm *kvm)return smp_load_acquire (&kvm->arch.shadow_root_allocated); } -#ifdef CONFIG_X86_64 -extern bool tdp_mmu_enabled; -#else -#define tdp_mmu_enabled false -#endif -int kvm_tdp_mmu_map_private_pfn (struct kvm_vcpu *vcpu,gfn_t gfn,kvm_pfn_t pfn);static inline bool kvm_memslots_have_rmaps (struct kvm *kvm)
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 2/7 KVM: x86: Move eager_page_split to mmu.{c,h}
From: Sean Christopherson <[email protected]>
[ Upstream commit cde542b6526639571a848e1d70f8ff6817e40e4e ]
Move KVM's eager_page_split module param to the MMU, as it is very much an MMU knob.
No functional change intended.
Message-ID: <[email protected]>
Stable-dep-of: a4b8acd428ba ("KVM: x86: Always initialize EFER reserved bits on vendor initialization")
--- arch/x86/kvm/mmu.h | 1 + arch/x86/kvm/mmu/mmu.c | 3 +++ arch/x86/kvm/x86.c | 3 --- arch/x86/kvm/x86.h | 2 -- 4 files changed, 4 insertions(+), 5 deletions(-)
arch/x86/kvm/mmu.h +1 -0
@@ -14,6 +14,7 @@ extern bool tdp_mmu_enabled;#define tdp_mmu_enabled false#endif extern bool __read_mostly enable_mmio_caching; +extern bool eager_page_split;#define PT_WRITABLE_SHIFT 1#define PT_USER_SHIFT 2
arch/x86/kvm/mmu/mmu.c +3 -0
@@ -115,6 +115,9 @@ module_param_named(tdp_mmu, tdp_mmu_enabled, bool, 0444);EXPORT_SYMBOL_FOR_KVM_INTERNAL (tdp_mmu_enabled);#endif +bool __read_mostly eager_page_split = true; +module_param (eager_page_split, bool,0644 ); +static int max_huge_page_level__read_mostly ;static int tdp_root_level__read_mostly ;static int max_tdp_level__read_mostly ;
arch/x86/kvm/x86.c +0 -3
@@ -181,9 +181,6 @@ module_param(force_emulation_prefix, int, 0644);int __read_mostly pi_inject_timer =-1 ;module_param (pi_inject_timer, bint,0644 ); -bool __read_mostly eager_page_split = true; -module_param (eager_page_split, bool,0644 ); -/* Enable/disable SMT_RSB bug mitigation */ static bool __read_mostly mitigate_smt_rsb;module_param (mitigate_smt_rsb, bool,0444 );
arch/x86/kvm/x86.h +0 -2
@@ -463,8 +463,6 @@ extern int pi_inject_timer;extern bool report_ignored_msrs; -extern bool eager_page_split; -static inline void kvm_pr_unimpl_wrmsr (struct kvm_vcpu *vcpu,u32 msr,u64 data) {if (report_ignored_msrs)
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 3/7 KVM: x86: Move kvm_{load,put}_guest_fpu() to fpu.h
In reply to Sasha LevinFrom: Sean Christopherson <[email protected]>
[ Upstream commit c392e508ffb0792b9e974ce65b10f5363aefc719 ]
Move the kvm_{load,put}_guest_fpu() helpers to fpu.h in anticipation of moving the bulk of KVM's MSR handling code out of x86.c. KVM needs to load and put the FPU when accessing MSRs that are managed via XSTATE, a.k.a. the so called "FPU".
No functional change intended.
Message-ID: <[email protected]>
Stable-dep-of: a4b8acd428ba ("KVM: x86: Always initialize EFER reserved bits on vendor initialization")
--- arch/x86/kvm/fpu.h | 26 ++++++++++++++++++++++++++ arch/x86/kvm/x86.c | 24 ------------------------ 2 files changed, 26 insertions(+), 24 deletions(-)
arch/x86/kvm/fpu.h +26 -0
@@ -3,8 +3,34 @@#ifndef __KVM_FPU_H_#define __KVM_FPU_H_ +#include <linux/kvm_host.h> + +#include <trace/events/kvm.h> +#include <asm/fpu/api.h> +/* Swap (qemu) user FPU context for the guest FPU context. */ +static inline void kvm_load_guest_fpu (struct kvm_vcpu *vcpu) +{ +if (KVM_BUG_ON (vcpu->arch.guest_fpu.fpstate->in_use, vcpu->kvm)) +return ; + +/* Exclude PKRU, it's restored separately immediately after VM-Exit. */ +fpu_swap_kvm_fpstate (&vcpu->arch.guest_fpu, true); +trace_kvm_fpu (1 ); +} + +/* When vcpu_run ends, restore user space FPU context. */ +static inline void kvm_put_guest_fpu (struct kvm_vcpu *vcpu) +{ +if (KVM_BUG_ON (!vcpu->arch.guest_fpu.fpstate->in_use, vcpu->kvm)) +return ; + +fpu_swap_kvm_fpstate (&vcpu->arch.guest_fpu, false); + ++vcpu->stat.fpu_reload; +trace_kvm_fpu (0 ); +} + typedef u32 __attribute__((vector_size(16))) sse128_t;#define __sse128_u union { sse128_t vec; u64 as_u64[2]; u32 as_u32[4]; }#define sse128_lo (x) ({ __sse128_u t; t.vec = x; t.as_u64[0]; })
arch/x86/kvm/x86.c +0 -24
@@ -137,8 +137,6 @@ static int __set_sregs2(struct kvm_vcpu *vcpu, struct kvm_sregs2 *sregs2);static void __get_sregs2 (struct kvm_vcpu *vcpu,struct kvm_sregs2 *sregs2);static DEFINE_MUTEX (vendor_module_lock); -static void kvm_load_guest_fpu (struct kvm_vcpu *vcpu); -static void kvm_put_guest_fpu (struct kvm_vcpu *vcpu);struct kvm_x86_ops kvm_x86_ops__read_mostly ;
@@ -11899,28 +11897,6 @@ static int complete_emulated_mmio(struct kvm_vcpu *vcpu)return 0 ; } -/* Swap (qemu) user FPU context for the guest FPU context. */ -static void kvm_load_guest_fpu (struct kvm_vcpu *vcpu) -{ -if (KVM_BUG_ON (vcpu->arch.guest_fpu.fpstate->in_use, vcpu->kvm)) -return ; - -/* Exclude PKRU, it's restored separately immediately after VM-Exit. */ -fpu_swap_kvm_fpstate (&vcpu->arch.guest_fpu, true); -trace_kvm_fpu (1 ); -} - -/* When vcpu_run ends, restore user space FPU context. */ -static void kvm_put_guest_fpu (struct kvm_vcpu *vcpu) -{ -if (KVM_BUG_ON (!vcpu->arch.guest_fpu.fpstate->in_use, vcpu->kvm)) -return ; - -fpu_swap_kvm_fpstate (&vcpu->arch.guest_fpu, false); - ++vcpu->stat.fpu_reload; -trace_kvm_fpu (0 ); -} -static int kvm_x86_vcpu_pre_run (struct kvm_vcpu *vcpu) {/*
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 4/7 KVM: x86: Extract get/set MSR (list) ioctl logic to helpers
In reply to Sasha LevinFrom: Sean Christopherson <[email protected]>
[ Upstream commit 57412a311f8f575a97b64fdc46c9a45a40076559 ]
Extract the code for getting/setting MSRs and MSR lists to dedicated helpers in anticipation of moving the MSR code to a new msrs.c.
No functional change intended.
Message-ID: <[email protected]>
Stable-dep-of: a4b8acd428ba ("KVM: x86: Always initialize EFER reserved bits on vendor initialization")
--- arch/x86/kvm/x86.c | 135 ++++++++++++++++++++++++++------------------- 1 file changed, 78 insertions(+), 57 deletions(-)
arch/x86/kvm/x86.c +78 -57
@@ -5014,6 +5014,61 @@ static int kvm_x86_dev_has_attr(struct kvm_device_attr *attr)return __kvm_x86_dev_get_attr (attr, &val); } +static int kvm_get_msr_index_list (struct kvm_msr_list __user *user_msr_list) +{ +struct kvm_msr_list msr_list; +unsigned int n; + +if (copy_from_user (&msr_list, user_msr_list,sizeof (msr_list))) +return -EFAULT ; + + n = msr_list.nmsrs; + msr_list.nmsrs = num_msrs_to_save + num_emulated_msrs; +if (copy_to_user (user_msr_list, &msr_list,sizeof (msr_list))) +return -EFAULT ; + +if (n < msr_list.nmsrs) +return -E2BIG ; + +if (copy_to_user (user_msr_list->indices, &msrs_to_save, + num_msrs_to_save *sizeof (u32))) +return -EFAULT ; + +if (copy_to_user (user_msr_list->indices + num_msrs_to_save, + &emulated_msrs, num_emulated_msrs *sizeof (u32))) +return -EFAULT ; + +return 0 ; +} + +static int kvm_get_feature_msr_index_list (struct kvm_msr_list __user *user_msr_list) +{ +struct kvm_msr_list msr_list; +unsigned int n; + +if (copy_from_user (&msr_list, user_msr_list,sizeof (msr_list))) +return -EFAULT ; + + n = msr_list.nmsrs; + msr_list.nmsrs = num_msr_based_features; +if (copy_to_user (user_msr_list, &msr_list,sizeof (msr_list))) +return -EFAULT ; + +if (n < msr_list.nmsrs) +return -E2BIG ; + +if (copy_to_user (user_msr_list->indices, &msr_based_features, + num_msr_based_features *sizeof (u32))) +return -EFAULT ; + +return 0 ; +} + +static int kvm_get_feature_msrs (struct kvm_msrs __user *user_msrs) +{ +return msr_io (NULL , user_msrs, do_get_feature_msr,1 ); +} +long kvm_arch_dev_ioctl (struct file *filp,unsigned int ioctl,unsigned long arg) {
@@ -5021,32 +5076,9 @@ long kvm_arch_dev_ioctl(struct file *filp,long r;switch (ioctl) { -case KVM_GET_MSR_INDEX_LIST : { -struct kvm_msr_list __user *user_msr_list = argp; -struct kvm_msr_list msr_list; -unsigned n; - - r = -EFAULT ; -if (copy_from_user (&msr_list, user_msr_list,sizeof (msr_list))) - goto out; - n = msr_list.nmsrs; - msr_list.nmsrs = num_msrs_to_save + num_emulated_msrs; -if (copy_to_user (user_msr_list, &msr_list,sizeof (msr_list))) - goto out; - r = -E2BIG ; -if (n < msr_list.nmsrs) - goto out; - r = -EFAULT ; -if (copy_to_user (user_msr_list->indices, &msrs_to_save, - num_msrs_to_save *sizeof (u32))) - goto out; -if (copy_to_user (user_msr_list->indices + num_msrs_to_save, - &emulated_msrs, - num_emulated_msrs *sizeof (u32))) - goto out; - r =0 ; +case KVM_GET_MSR_INDEX_LIST : + r =kvm_get_msr_index_list (argp);break ; - }case KVM_GET_SUPPORTED_CPUID :case KVM_GET_EMULATED_CPUID : {struct kvm_cpuid2 __user *cpuid_arg = argp;
@@ -5074,30 +5106,11 @@ long kvm_arch_dev_ioctl(struct file *filp, goto out; r =0 ;break ; -case KVM_GET_MSR_FEATURE_INDEX_LIST : { -struct kvm_msr_list __user *user_msr_list = argp; -struct kvm_msr_list msr_list; -unsigned int n; - - r = -EFAULT ; -if (copy_from_user (&msr_list, user_msr_list,sizeof (msr_list))) - goto out; - n = msr_list.nmsrs; - msr_list.nmsrs = num_msr_based_features; -if (copy_to_user (user_msr_list, &msr_list,sizeof (msr_list))) - goto out; - r = -E2BIG ; -if (n < msr_list.nmsrs) - goto out; - r = -EFAULT ; -if (copy_to_user (user_msr_list->indices, &msr_based_features, - num_msr_based_features *sizeof (u32))) - goto out; - r =0 ; +case KVM_GET_MSR_FEATURE_INDEX_LIST : + r =kvm_get_feature_msr_index_list (argp);break ; - }case KVM_GET_MSRS : - r =msr_io (NULL , argp, do_get_feature_msr,1 ); + r =kvm_get_feature_msrs (argp);break ;#ifdef CONFIG_KVM_HYPERV case KVM_GET_SUPPORTED_HV_CPUID :
@@ -6181,6 +6194,20 @@ static int kvm_get_reg_list(struct kvm_vcpu *vcpu,return 0 ; } +static int kvm_get_msrs (struct kvm_vcpu *vcpu,struct kvm_msrs __user *user_msrs) +{ +guard (srcu)(&vcpu->kvm->srcu); + +return msr_io (vcpu, user_msrs, do_get_msr,1 ); +} + +static int kvm_set_msrs (struct kvm_vcpu *vcpu,struct kvm_msrs __user *user_msrs) +{ +guard (srcu)(&vcpu->kvm->srcu); + +return msr_io (vcpu, user_msrs, do_set_msr,0 ); +} +long kvm_arch_vcpu_ioctl (struct file *filp,unsigned int ioctl,unsigned long arg) {
@@ -6285,18 +6312,12 @@ long kvm_arch_vcpu_ioctl(struct file *filp, r =0 ;break ; } -case KVM_GET_MSRS : { -int idx =srcu_read_lock (&vcpu->kvm->srcu); - r =msr_io (vcpu, argp, do_get_msr,1 ); -srcu_read_unlock (&vcpu->kvm->srcu, idx); +case KVM_GET_MSRS : + r =kvm_get_msrs (vcpu, argp);break ; - } -case KVM_SET_MSRS : { -int idx =srcu_read_lock (&vcpu->kvm->srcu); - r =msr_io (vcpu, argp, do_set_msr,0 ); -srcu_read_unlock (&vcpu->kvm->srcu, idx); +case KVM_SET_MSRS : + r =kvm_set_msrs (vcpu, argp);break ; - }case KVM_GET_ONE_REG :case KVM_SET_ONE_REG : r =kvm_get_set_one_reg (vcpu, ioctl, argp);
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 5/7 KVM: x86: Expose several TSC helpers via x86.h for use by MSR code
In reply to Sasha LevinFrom: Sean Christopherson <[email protected]>
[ Upstream commit 9d13832ced63160ca67b6c72868b794cbcda556d ]
Begrudgingly move adjust_tsc_offset_{guest,host}() to x86.h as inlines, and expose several other TSC helpers in anticipation of moving KVM's MSR code to a dedicated msrs.c. Unfortunately for KVM, several MSRs that KVM emulates can affect TSC state.
Opportunistically drop a superfluous local "tsc_offset" variable, whose existence causes checkpatch to complain about lack of a blank line.
No functional change intended.
Message-ID: <[email protected]>
Stable-dep-of: a4b8acd428ba ("KVM: x86: Always initialize EFER reserved bits on vendor initialization")
--- arch/x86/kvm/x86.c | 22 +++------------------- arch/x86/kvm/x86.h | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+), 19 deletions(-)
arch/x86/kvm/x86.c +3 -19
@@ -2637,7 +2637,7 @@ u64 kvm_scale_tsc(u64 tsc, u64 ratio)return _tsc; } -static u64 kvm_compute_l1_tsc_offset (struct kvm_vcpu *vcpu,u64 target_tsc) +u64 kvm_compute_l1_tsc_offset (struct kvm_vcpu *vcpu,u64 target_tsc) {u64 tsc;
@@ -2678,7 +2678,7 @@ u64 kvm_calc_nested_tsc_multiplier(u64 l1_multiplier, u64 l2_multiplier) }EXPORT_SYMBOL_FOR_KVM_INTERNAL (kvm_calc_nested_tsc_multiplier); -static void kvm_vcpu_write_tsc_offset (struct kvm_vcpu *vcpu,u64 l1_offset) +void kvm_vcpu_write_tsc_offset (struct kvm_vcpu *vcpu,u64 l1_offset) {if (vcpu->arch.guest_tsc_protected)return ;
@@ -2792,7 +2792,7 @@ static void __kvm_synchronize_tsc(struct kvm_vcpu *vcpu, u64 offset, u64 tsc,kvm_track_tsc_matching (vcpu, !matched); } -static void kvm_synchronize_tsc (struct kvm_vcpu *vcpu,u64 *user_value) +void kvm_synchronize_tsc (struct kvm_vcpu *vcpu,u64 *user_value) {u64 data = user_value ? *user_value :0 ;struct kvm *kvm = vcpu->kvm;
@@ -2860,22 +2860,6 @@ static void kvm_synchronize_tsc(struct kvm_vcpu *vcpu, u64 *user_value)raw_spin_unlock_irqrestore (&kvm->arch.tsc_write_lock, flags); } -static inline void adjust_tsc_offset_guest (struct kvm_vcpu *vcpu, -s64 adjustment) -{ -u64 tsc_offset = vcpu->arch.l1_tsc_offset; -kvm_vcpu_write_tsc_offset (vcpu, tsc_offset + adjustment); -} - -static inline void adjust_tsc_offset_host (struct kvm_vcpu *vcpu,s64 adjustment) -{ -if (vcpu->arch.l1_tsc_scaling_ratio != kvm_caps.default_tsc_scaling_ratio) -WARN_ON (adjustment <0 ); - adjustment =kvm_scale_tsc ((u64 ) adjustment, - vcpu->arch.l1_tsc_scaling_ratio); -adjust_tsc_offset_guest (vcpu, adjustment); -} -#ifdef CONFIG_X86_64 static u64 read_tsc (void )
arch/x86/kvm/x86.h +19 -0
@@ -391,6 +391,25 @@ uint64_t kvm_get_wall_clock_epoch(struct kvm *kvm);bool kvm_get_monotonic_and_clockread (s64 *kernel_ns,u64 *tsc_timestamp);int kvm_guest_time_update (struct kvm_vcpu *v); +void kvm_synchronize_tsc (struct kvm_vcpu *vcpu,u64 *user_value); +u64 kvm_compute_l1_tsc_offset (struct kvm_vcpu *vcpu,u64 target_tsc); +void kvm_vcpu_write_tsc_offset (struct kvm_vcpu *vcpu,u64 l1_offset); + +static inline void adjust_tsc_offset_guest (struct kvm_vcpu *vcpu, +s64 adjustment) +{ +kvm_vcpu_write_tsc_offset (vcpu, vcpu->arch.l1_tsc_offset + adjustment); +} + +static inline void adjust_tsc_offset_host (struct kvm_vcpu *vcpu,s64 adjustment) +{ +if (vcpu->arch.l1_tsc_scaling_ratio != kvm_caps.default_tsc_scaling_ratio) +WARN_ON (adjustment <0 ); + adjustment =kvm_scale_tsc ((u64 ) adjustment, + vcpu->arch.l1_tsc_scaling_ratio); +adjust_tsc_offset_guest (vcpu, adjustment); +} +int kvm_read_guest_virt (struct kvm_vcpu *vcpu,gva_t addr,void *val,unsigned int bytes,struct x86_exception *exception);
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 6/7 KVM: x86: Move the bulk of MSR specific code from x86.c to msrs.{c,h}
In reply to Sasha LevinFrom: Sean Christopherson <[email protected]>
[ Upstream commit 7a268308015843c7e8b15dda588b2e9adf45223f ]
Introduce msrs.{c,h}, and move the vast majority of MSR specific code out of x86.{c,h}. Use a plural "msrs" instead of just "msr" to be consistent with regs.{c,h}, and to make it easier to differentiate KVM's code from the other 5+ msr.c files in the kernel.
Opportunistically drop the "x86.h" include from mtrr.c, mostly as proof that the bulk of the MSR code is indeed being relocated to msrs.c.
No functional change intended.
Message-ID: <[email protected]>
Stable backport adaptations for a4b8acd428ba:
- Build msrs.o without regs.o, which is absent from this stable tree, and retain the stable x86.h/MMU include ordering. Declare kvm_caps and kvm_host before the TSC inlines; the preceding dependency left kvm_caps declared after adjust_tsc_offset_host(), which fails to compile here.
- Move the existing emulator MSR callbacks directly to msrs.c, retaining their names and signatures instead of introducing new wrapper helpers.
- Move the three existing MSR declarations needed by the target to msrs.h.
- Fold in the EFER setup preparation from e62392bf39ebf and 6ccc19d4c1eb9:
enable long-mode bits according to KVM's capabilities, and configure SVM bits in the common EFER setup after vendor hardware setup. This supplies the target's context and prevents its reset from clearing nested SVM support that was just enabled by vendor initialization.
No new functions are introduced by this dependency adaptation.
Stable-dep-of: a4b8acd428ba ("KVM: x86: Always initialize EFER reserved bits on vendor initialization")
--- arch/x86/include/asm/kvm_host.h | 3 - arch/x86/kvm/Makefile | 2 +- arch/x86/kvm/msrs.c | 2726 +++++++++++++++++ arch/x86/kvm/msrs.h | 132 + arch/x86/kvm/mtrr.c | 2 +- arch/x86/kvm/svm/svm.c | 4 - arch/x86/kvm/x86.c | 4817 +++++++------------------------ arch/x86/kvm/x86.h | 93 +- 8 files changed, 3915 insertions(+), 3864 deletions(-) create mode 100644 arch/x86/kvm/msrs.c create mode 100644 arch/x86/kvm/msrs.h
arch/x86/include/asm/kvm_host.h +0 -3
@@ -2240,9 +2240,6 @@ void kvm_prepare_emulation_failure_exit(struct kvm_vcpu *vcpu);void kvm_prepare_event_vectoring_exit (struct kvm_vcpu *vcpu,gpa_t gpa);void kvm_prepare_unexpected_reason_exit (struct kvm_vcpu *vcpu,u64 exit_reason); -void kvm_enable_efer_bits (u64 ); -bool kvm_valid_efer (struct kvm_vcpu *vcpu,u64 efer); -int kvm_emulate_msr_read (struct kvm_vcpu *vcpu,u32 index,u64 *data);int kvm_emulate_msr_write (struct kvm_vcpu *vcpu,u32 index,u64 data);int __kvm_emulate_msr_read (struct kvm_vcpu *vcpu,u32 index,u64 *data);int __kvm_emulate_msr_write (struct kvm_vcpu *vcpu,u32 index,u64 data);
arch/x86/kvm/Makefile +1 -1
@@ -5,7 +5,7 @@ ccflags-$(CONFIG_KVM_WERROR) += -Werror include $(srctree)/virt/kvm/Makefile.kvm -kvm-y += x86.o emulate.o irq.o lapic.o cpuid.o pmu.o mtrr.o \ +kvm-y += x86.o emulate.o irq.o lapic.o cpuid.o msrs.o pmu.o mtrr.o \ debugfs.o mmu/mmu.o mmu/page_track.o mmu/spte.o kvm-$(CONFIG_X86_64) += mmu/tdp_iter.o mmu/tdp_mmu.o
arch/x86/kvm/msrs.c new file +2726 -0
2,726 lines not on this page · raw message
arch/x86/kvm/msrs.h new file +132 -0
132 lines not on this page · raw message
arch/x86/kvm/mtrr.c +1 -1
@@ -19,7 +19,7 @@#include <asm/mtrr.h> #include "cpuid.h" -#include "x86.h" +#include "msrs.h" static u64 *find_mtrr (struct kvm_vcpu *vcpu,unsigned int msr) {
arch/x86/kvm/svm/svm.c +0 -4
@@ -5656,10 +5656,6 @@ static __init int svm_hardware_setup(void)if (nested) {pr_info ("Nested Virtualization enabled\n" ); -kvm_enable_efer_bits (EFER_SVME ); -if (!boot_cpu_has (X86_FEATURE_EFER_LMSLE_MBZ )) -kvm_enable_efer_bits (EFER_LMSLE ); - r =nested_svm_init_msrpm_merge_offsets ();if (r)return r;
arch/x86/kvm/x86.c +1050 -3767
107 lines not on this page · raw message
arch/x86/kvm/x86.h +5 -88
93 lines not on this page · raw message
The rest of this diff is not shown. View the raw message.
Signature · 1 line
2.53.0
Part of the diff is not shown here. View the raw message.
Sasha Levin
maintainerPATCH 7/7 KVM: x86: Always initialize EFER reserved bits on vendor initialization
In reply to Sasha LevinFrom: Yosry Ahmed <[email protected]>
[ Upstream commit a4b8acd428ba3f03952ef309d7f438dbc357557b ]
EFER reserved bits are statically initialized, and do not reset if a vendor module is re-loaded. For example, loading kvm_amd with nested=1 removes EFER.SVME (and potentially EFER.LMSLE) from the reserved bits. Reloading kvm_amd with nested=0 does not add them back, allowing userspace to set EFER.SVME with nested=0.
Re-initializing EFER reserved bits before configuring them on vendor initialization.
--- arch/x86/kvm/msrs.c | 10 ++++++++-- arch/x86/kvm/msrs.h | 1 + arch/x86/kvm/x86.c | 2 ++ 3 files changed, 11 insertions(+), 2 deletions(-)
arch/x86/kvm/msrs.c +8 -2
@@ -19,8 +19,7 @@ bool __read_mostly report_ignored_msrs = true;module_param (report_ignored_msrs, bool,0644 );EXPORT_SYMBOL_FOR_KVM_INTERNAL (report_ignored_msrs); -/* Enable syscall by default because its emulated by KVM */ -static u64 __read_mostly efer_reserved_bits = ~((u64 )EFER_SCE ); +static u64 __read_mostly efer_reserved_bits;#define MAX_IO_MSRS 256
@@ -637,6 +636,13 @@ static int set_efer(struct kvm_vcpu *vcpu, struct msr_data *msr_info)return 0 ; } +void kvm_init_efer_bits (void ) +{ +/* Enable syscall by default because its emulated by KVM */ + efer_reserved_bits = ~((u64 )EFER_SCE ); +} +EXPORT_SYMBOL_FOR_KVM_INTERNAL (kvm_init_efer_bits); +void kvm_enable_efer_bits (u64 mask) { efer_reserved_bits &= ~mask;
arch/x86/kvm/msrs.h +1 -0
@@ -56,6 +56,7 @@ int kvm_get_set_one_reg(struct kvm_vcpu *vcpu, unsigned int ioctl,int kvm_get_reg_list (struct kvm_vcpu *vcpu,struct kvm_reg_list __user *user_list); +void kvm_init_efer_bits (void );void kvm_enable_efer_bits (u64 );bool kvm_valid_efer (struct kvm_vcpu *vcpu,u64 efer);int kvm_emulate_msr_read (struct kvm_vcpu *vcpu,u32 index,u64 *data);
arch/x86/kvm/x86.c +2 -0
@@ -7304,6 +7304,8 @@ EXPORT_SYMBOL_FOR_KVM_INTERNAL(kvm_setup_xss_caps);static void kvm_setup_efer_caps (void ) { +kvm_init_efer_bits (); +if (kvm_cpu_cap_has (X86_FEATURE_LM ))kvm_enable_efer_bits (EFER_LME |EFER_LMA );
Signature · 1 line
2.53.0
Re: [PATCH 7.2.y 1/7] KVM: x86: Move tdp_enabled from kvm_host.h to mmu.h
In reply to Sasha LevinQuoted 69 lines · Sasha Levin
From: Sean Christopherson <[email protected]>
[ Upstream commit
af0dbcaaa2bbc90ba8e6f696be725c4522face08]Relocated the declaration of
tdp_enabledintommu.h, and opportunistically hoisttdp_mmu_enabledup to the top so that the two are co-located.No functional change intended.
Reviewed-by Kai Huang <[email protected]>Reviewed-by Yosry Ahmed <[email protected]>Signed-off-by Sean Christopherson <[email protected]>Reviewed-by Binbin Wu <[email protected]>Message-ID: <[email protected]>
Signed-off-by Paolo Bonzini <[email protected]>Stable-dep-of:
a4b8acd428ba("KVM: x86: Always initialize EFER reserved bits on vendor initialization")Signed-off-by Sasha Levin <[email protected]>--- arch/x86/include/asm/kvm_host.h | 2 -- arch/x86/kvm/mmu.h | 12 ++++++------ 2 files changed, 6 insertions(+), 8 deletions(-)arch/x86/include/asm/kvm_host.h +0
-2@@ -2148,8 +2148,6 @@ void kvm_zap_gfn_range(struct kvm *kvm, gfn_t gfn_start, gfn_t gfn_end);int load_pdptrs (struct kvm_vcpu *vcpu,unsigned long cr3); -extern bool tdp_enabled; -/* * EMULTYPE_NO_DECODE - Set when re-emulating an instruction (after completing * userspace I/O) to indicate that the emulation context arch/x86/kvm/mmu.h +6
-6@@ -7,6 +7,12 @@#include "x86.h" #include "cpuid.h" +extern bool tdp_enabled; +#ifdef CONFIG_X86_64 +extern bool tdp_mmu_enabled; +#else +#define tdp_mmu_enabled false +#endif extern bool __read_mostly enable_mmio_caching;#define PT_WRITABLE_SHIFT 1@@ -261,12 +267,6 @@ static inline bool kvm_shadow_root_allocated(struct kvm *kvm)return smp_load_acquire (&kvm->arch.shadow_root_allocated); } -#ifdef CONFIG_X86_64 -extern bool tdp_mmu_enabled; -#else -#define tdp_mmu_enabled false -#endif -int kvm_tdp_mmu_map_private_pfn (struct kvm_vcpu *vcpu,gfn_t gfn,kvm_pfn_t pfn);static inline bool kvm_memslots_have_rmaps (struct kvm *kvm)Signature · 1 line
2.53.0
Series also does not apply :(