On Tue, Aug 15, 2023 at 01:36:46PM -0700, Sean Christopherson wrote: > Track "NRIPS exposed to L1" via a governed feature flag instead of using > a dedicated bit/flag in vcpu_svm. > > No functional change intended. > > Signed-off-by: Sean Christopherson <seanjc@xxxxxxxxxx> Reviewed-by: Yuan Yao <yuan.yao@xxxxxxxxx> > --- > arch/x86/kvm/governed_features.h | 1 + > arch/x86/kvm/svm/nested.c | 6 +++--- > arch/x86/kvm/svm/svm.c | 4 +--- > arch/x86/kvm/svm/svm.h | 1 - > 4 files changed, 5 insertions(+), 7 deletions(-) > > diff --git a/arch/x86/kvm/governed_features.h b/arch/x86/kvm/governed_features.h > index 22446614bf49..722b66af412c 100644 > --- a/arch/x86/kvm/governed_features.h > +++ b/arch/x86/kvm/governed_features.h > @@ -8,6 +8,7 @@ BUILD_BUG() > KVM_GOVERNED_X86_FEATURE(GBPAGES) > KVM_GOVERNED_X86_FEATURE(XSAVES) > KVM_GOVERNED_X86_FEATURE(VMX) > +KVM_GOVERNED_X86_FEATURE(NRIPS) > > #undef KVM_GOVERNED_X86_FEATURE > #undef KVM_GOVERNED_FEATURE > diff --git a/arch/x86/kvm/svm/nested.c b/arch/x86/kvm/svm/nested.c > index 3342cc4a5189..9092f3f8dccf 100644 > --- a/arch/x86/kvm/svm/nested.c > +++ b/arch/x86/kvm/svm/nested.c > @@ -716,7 +716,7 @@ static void nested_vmcb02_prepare_control(struct vcpu_svm *svm, > * what a nrips=0 CPU would do (L1 is responsible for advancing RIP > * prior to injecting the event). > */ > - if (svm->nrips_enabled) > + if (guest_can_use(vcpu, X86_FEATURE_NRIPS)) > vmcb02->control.next_rip = svm->nested.ctl.next_rip; > else if (boot_cpu_has(X86_FEATURE_NRIPS)) > vmcb02->control.next_rip = vmcb12_rip; > @@ -726,7 +726,7 @@ static void nested_vmcb02_prepare_control(struct vcpu_svm *svm, > svm->soft_int_injected = true; > svm->soft_int_csbase = vmcb12_csbase; > svm->soft_int_old_rip = vmcb12_rip; > - if (svm->nrips_enabled) > + if (guest_can_use(vcpu, X86_FEATURE_NRIPS)) > svm->soft_int_next_rip = svm->nested.ctl.next_rip; > else > svm->soft_int_next_rip = vmcb12_rip; > @@ -1026,7 +1026,7 @@ int nested_svm_vmexit(struct vcpu_svm *svm) > if (vmcb12->control.exit_code != SVM_EXIT_ERR) > nested_save_pending_event_to_vmcb12(svm, vmcb12); > > - if (svm->nrips_enabled) > + if (guest_can_use(vcpu, X86_FEATURE_NRIPS)) > vmcb12->control.next_rip = vmcb02->control.next_rip; > > vmcb12->control.int_ctl = svm->nested.ctl.int_ctl; > diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c > index d67f6e23dcd2..c8b97cb3138c 100644 > --- a/arch/x86/kvm/svm/svm.c > +++ b/arch/x86/kvm/svm/svm.c > @@ -4288,9 +4288,7 @@ static void svm_vcpu_after_set_cpuid(struct kvm_vcpu *vcpu) > guest_cpuid_has(vcpu, X86_FEATURE_XSAVE)) > kvm_governed_feature_set(vcpu, X86_FEATURE_XSAVES); > > - /* Update nrips enabled cache */ > - svm->nrips_enabled = kvm_cpu_cap_has(X86_FEATURE_NRIPS) && > - guest_cpuid_has(vcpu, X86_FEATURE_NRIPS); > + kvm_governed_feature_check_and_set(vcpu, X86_FEATURE_NRIPS); > > svm->tsc_scaling_enabled = tsc_scaling && guest_cpuid_has(vcpu, X86_FEATURE_TSCRATEMSR); > svm->lbrv_enabled = lbrv && guest_cpuid_has(vcpu, X86_FEATURE_LBRV); > diff --git a/arch/x86/kvm/svm/svm.h b/arch/x86/kvm/svm/svm.h > index 5115b35a4d31..e147f2046ffa 100644 > --- a/arch/x86/kvm/svm/svm.h > +++ b/arch/x86/kvm/svm/svm.h > @@ -259,7 +259,6 @@ struct vcpu_svm { > bool soft_int_injected; > > /* optional nested SVM features that are enabled for this guest */ > - bool nrips_enabled : 1; > bool tsc_scaling_enabled : 1; > bool v_vmload_vmsave_enabled : 1; > bool lbrv_enabled : 1; > -- > 2.41.0.694.ge786442a9b-goog >