lkml.org 
[lkml]   [2023]   [Feb]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    Subject[PATCH 09/12] KVM: nSVM: Use KVM-governed feature framework to track "LBRv enabled"
    From
    Track "LBR virtualization 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@google.com>
    ---
    arch/x86/kvm/governed_features.h | 1 +
    arch/x86/kvm/svm/nested.c | 23 +++++++++++++----------
    arch/x86/kvm/svm/svm.c | 7 +++++--
    arch/x86/kvm/svm/svm.h | 1 -
    4 files changed, 19 insertions(+), 13 deletions(-)

    diff --git a/arch/x86/kvm/governed_features.h b/arch/x86/kvm/governed_features.h
    index b66b9d550f33..16c58d61bdf6 100644
    --- a/arch/x86/kvm/governed_features.h
    +++ b/arch/x86/kvm/governed_features.h
    @@ -10,6 +10,7 @@ KVM_GOVERNED_X86_FEATURE(XSAVES)
    KVM_GOVERNED_X86_FEATURE(NRIPS)
    KVM_GOVERNED_X86_FEATURE(TSCRATEMSR)
    KVM_GOVERNED_X86_FEATURE(V_VMSAVE_VMLOAD)
    +KVM_GOVERNED_X86_FEATURE(LBRV)

    #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 6a96058c0e48..9e210b03e635 100644
    --- a/arch/x86/kvm/svm/nested.c
    +++ b/arch/x86/kvm/svm/nested.c
    @@ -540,6 +540,7 @@ static void nested_vmcb02_prepare_save(struct vcpu_svm *svm, struct vmcb *vmcb12
    bool new_vmcb12 = false;
    struct vmcb *vmcb01 = svm->vmcb01.ptr;
    struct vmcb *vmcb02 = svm->nested.vmcb02.ptr;
    + struct kvm_vcpu *vcpu = &svm->vcpu;

    nested_vmcb02_compute_g_pat(svm);

    @@ -565,18 +566,18 @@ static void nested_vmcb02_prepare_save(struct vcpu_svm *svm, struct vmcb *vmcb12
    vmcb_mark_dirty(vmcb02, VMCB_DT);
    }

    - kvm_set_rflags(&svm->vcpu, vmcb12->save.rflags | X86_EFLAGS_FIXED);
    + kvm_set_rflags(vcpu, vmcb12->save.rflags | X86_EFLAGS_FIXED);

    - svm_set_efer(&svm->vcpu, svm->nested.save.efer);
    + svm_set_efer(vcpu, svm->nested.save.efer);

    - svm_set_cr0(&svm->vcpu, svm->nested.save.cr0);
    - svm_set_cr4(&svm->vcpu, svm->nested.save.cr4);
    + svm_set_cr0(vcpu, svm->nested.save.cr0);
    + svm_set_cr4(vcpu, svm->nested.save.cr4);

    svm->vcpu.arch.cr2 = vmcb12->save.cr2;

    - kvm_rax_write(&svm->vcpu, vmcb12->save.rax);
    - kvm_rsp_write(&svm->vcpu, vmcb12->save.rsp);
    - kvm_rip_write(&svm->vcpu, vmcb12->save.rip);
    + kvm_rax_write(vcpu, vmcb12->save.rax);
    + kvm_rsp_write(vcpu, vmcb12->save.rsp);
    + kvm_rip_write(vcpu, vmcb12->save.rip);

    /* In case we don't even reach vcpu_run, the fields are not updated */
    vmcb02->save.rax = vmcb12->save.rax;
    @@ -590,7 +591,8 @@ static void nested_vmcb02_prepare_save(struct vcpu_svm *svm, struct vmcb *vmcb12
    vmcb_mark_dirty(vmcb02, VMCB_DR);
    }

    - if (unlikely(svm->lbrv_enabled && (svm->nested.ctl.virt_ext & LBR_CTL_ENABLE_MASK))) {
    + if (unlikely(guest_can_use(vcpu, X86_FEATURE_LBRV) &&
    + (svm->nested.ctl.virt_ext & LBR_CTL_ENABLE_MASK))) {
    /*
    * Reserved bits of DEBUGCTL are ignored. Be consistent with
    * svm_set_msr's definition of reserved bits.
    @@ -712,7 +714,7 @@ static void nested_vmcb02_prepare_control(struct vcpu_svm *svm,

    vmcb02->control.virt_ext = vmcb01->control.virt_ext &
    LBR_CTL_ENABLE_MASK;
    - if (svm->lbrv_enabled)
    + if (guest_can_use(vcpu, X86_FEATURE_LBRV))
    vmcb02->control.virt_ext |=
    (svm->nested.ctl.virt_ext & LBR_CTL_ENABLE_MASK);

    @@ -1021,7 +1023,8 @@ int nested_svm_vmexit(struct vcpu_svm *svm)

    svm_switch_vmcb(svm, &svm->vmcb01);

    - if (unlikely(svm->lbrv_enabled && (svm->nested.ctl.virt_ext & LBR_CTL_ENABLE_MASK))) {
    + if (unlikely(guest_can_use(vcpu, X86_FEATURE_LBRV) &&
    + (svm->nested.ctl.virt_ext & LBR_CTL_ENABLE_MASK))) {
    svm_copy_lbrs(vmcb12, vmcb02);
    svm_update_lbrv(vcpu);
    } else if (unlikely(vmcb01->control.virt_ext & LBR_CTL_ENABLE_MASK)) {
    diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c
    index b3f0271c73b9..42591c77f98a 100644
    --- a/arch/x86/kvm/svm/svm.c
    +++ b/arch/x86/kvm/svm/svm.c
    @@ -994,9 +994,11 @@ void svm_update_lbrv(struct kvm_vcpu *vcpu)
    bool current_enable_lbrv = !!(svm->vmcb->control.virt_ext &
    LBR_CTL_ENABLE_MASK);

    - if (unlikely(is_guest_mode(vcpu) && svm->lbrv_enabled))
    + if (unlikely(is_guest_mode(vcpu) &&
    + guest_can_use(vcpu, X86_FEATURE_LBRV))) {
    if (unlikely(svm->nested.ctl.virt_ext & LBR_CTL_ENABLE_MASK))
    enable_lbrv = true;
    + }

    if (enable_lbrv == current_enable_lbrv)
    return;
    @@ -4149,7 +4151,8 @@ static void svm_vcpu_after_set_cpuid(struct kvm_vcpu *vcpu)
    if (tsc_scaling)
    kvm_governed_feature_check_and_set(vcpu, X86_FEATURE_TSCRATEMSR);

    - svm->lbrv_enabled = lbrv && guest_cpuid_has(vcpu, X86_FEATURE_LBRV);
    + if (lbrv)
    + kvm_governed_feature_check_and_set(vcpu, X86_FEATURE_LBRV);

    if (vls && !guest_cpuid_is_intel(vcpu))
    kvm_governed_feature_check_and_set(vcpu, X86_FEATURE_V_VMSAVE_VMLOAD);
    diff --git a/arch/x86/kvm/svm/svm.h b/arch/x86/kvm/svm/svm.h
    index 1e3e7462b1d7..60817ff346b0 100644
    --- a/arch/x86/kvm/svm/svm.h
    +++ b/arch/x86/kvm/svm/svm.h
    @@ -258,7 +258,6 @@ struct vcpu_svm {
    bool soft_int_injected;

    /* optional nested SVM features that are enabled for this guest */
    - bool lbrv_enabled : 1;
    bool pause_filter_enabled : 1;
    bool pause_threshold_enabled : 1;
    bool vgif_enabled : 1;
    --
    2.39.2.637.g21b0678d19-goog
    \
     
     \ /
      Last update: 2023-03-27 00:27    [W:3.566 / U:0.040 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site