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 11/12] KVM: nSVM: Use KVM-governed feature framework to track "vGIF enabled"
    From
    Track "virtual GIF 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 | 3 ++-
    arch/x86/kvm/svm/svm.c | 3 ++-
    arch/x86/kvm/svm/svm.h | 7 +++----
    4 files changed, 8 insertions(+), 6 deletions(-)

    diff --git a/arch/x86/kvm/governed_features.h b/arch/x86/kvm/governed_features.h
    index 93c7d840e546..b49fdabb88c4 100644
    --- a/arch/x86/kvm/governed_features.h
    +++ b/arch/x86/kvm/governed_features.h
    @@ -13,6 +13,7 @@ KVM_GOVERNED_X86_FEATURE(V_VMSAVE_VMLOAD)
    KVM_GOVERNED_X86_FEATURE(LBRV)
    KVM_GOVERNED_X86_FEATURE(PAUSEFILTER)
    KVM_GOVERNED_X86_FEATURE(PFTHRESHOLD)
    +KVM_GOVERNED_X86_FEATURE(VGIF)

    #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 c38f17ba818e..c73c2acaf4c0 100644
    --- a/arch/x86/kvm/svm/nested.c
    +++ b/arch/x86/kvm/svm/nested.c
    @@ -648,7 +648,8 @@ static void nested_vmcb02_prepare_control(struct vcpu_svm *svm,
    * exit_int_info, exit_int_info_err, next_rip, insn_len, insn_bytes.
    */

    - if (svm->vgif_enabled && (svm->nested.ctl.int_ctl & V_GIF_ENABLE_MASK))
    + if (guest_can_use(vcpu, X86_FEATURE_VGIF) &&
    + (svm->nested.ctl.int_ctl & V_GIF_ENABLE_MASK))
    int_ctl_vmcb12_bits |= (V_GIF_MASK | V_GIF_ENABLE_MASK);
    else
    int_ctl_vmcb01_bits |= (V_GIF_MASK | V_GIF_ENABLE_MASK);
    diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c
    index b18bd0b33942..11068e8eb969 100644
    --- a/arch/x86/kvm/svm/svm.c
    +++ b/arch/x86/kvm/svm/svm.c
    @@ -4163,7 +4163,8 @@ static void svm_vcpu_after_set_cpuid(struct kvm_vcpu *vcpu)
    if (kvm_cpu_cap_has(X86_FEATURE_PFTHRESHOLD))
    kvm_governed_feature_check_and_set(vcpu, X86_FEATURE_PFTHRESHOLD);

    - svm->vgif_enabled = vgif && guest_cpuid_has(vcpu, X86_FEATURE_VGIF);
    + if (vgif)
    + kvm_governed_feature_check_and_set(vcpu, X86_FEATURE_VGIF);

    svm_recalc_instruction_intercepts(vcpu, svm);

    diff --git a/arch/x86/kvm/svm/svm.h b/arch/x86/kvm/svm/svm.h
    index c05eea319d28..be5419975694 100644
    --- a/arch/x86/kvm/svm/svm.h
    +++ b/arch/x86/kvm/svm/svm.h
    @@ -22,6 +22,7 @@
    #include <asm/svm.h>
    #include <asm/sev-common.h>

    +#include "cpuid.h"
    #include "kvm_cache_regs.h"

    #define __sme_page_pa(x) __sme_set(page_to_pfn(x) << PAGE_SHIFT)
    @@ -257,9 +258,6 @@ struct vcpu_svm {
    unsigned long soft_int_next_rip;
    bool soft_int_injected;

    - /* optional nested SVM features that are enabled for this guest */
    - bool vgif_enabled : 1;
    -
    u32 ldr_reg;
    u32 dfr_reg;
    struct page *avic_backing_page;
    @@ -484,7 +482,8 @@ static inline bool svm_is_intercept(struct vcpu_svm *svm, int bit)

    static inline bool nested_vgif_enabled(struct vcpu_svm *svm)
    {
    - return svm->vgif_enabled && (svm->nested.ctl.int_ctl & V_GIF_ENABLE_MASK);
    + return guest_can_use(&svm->vcpu, X86_FEATURE_VGIF) &&
    + (svm->nested.ctl.int_ctl & V_GIF_ENABLE_MASK);
    }

    static inline struct vmcb *get_vgif_vmcb(struct vcpu_svm *svm)
    --
    2.39.2.637.g21b0678d19-goog
    \
     
     \ /
      Last update: 2023-03-27 00:27    [W:4.173 / U:0.844 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site