lkml.org 
[lkml]   [2019]   [Oct]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v1 5/8] KVM: X86: Expose PDCM cpuid to guest
    Date
    PDCM (Perfmon and Debug Capability) indicates the processor
    supports the performance and debug feature indication
    MSR IA32_PERF_CAPABILITIES.

    PEBS enabling in KVM guest depend on PEBS via PT, and
    PEBS via PT is detected by IA32_PERF_CAPABILITIES[Bit16].

    Signed-off-by: Luwei Kang <luwei.kang@intel.com>
    ---
    arch/x86/include/asm/kvm_host.h | 1 +
    arch/x86/kvm/cpuid.c | 3 ++-
    arch/x86/kvm/svm.c | 6 ++++++
    arch/x86/kvm/vmx/capabilities.h | 10 ++++++++++
    arch/x86/kvm/vmx/vmx.c | 1 +
    5 files changed, 20 insertions(+), 1 deletion(-)

    diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
    index ed01936..a987ae1 100644
    --- a/arch/x86/include/asm/kvm_host.h
    +++ b/arch/x86/include/asm/kvm_host.h
    @@ -1126,6 +1126,7 @@ struct kvm_x86_ops {
    bool (*xsaves_supported)(void);
    bool (*umip_emulated)(void);
    bool (*pt_supported)(void);
    + bool (*pdcm_supported)(void);

    int (*check_nested_events)(struct kvm_vcpu *vcpu, bool external_intr);
    void (*request_immediate_exit)(struct kvm_vcpu *vcpu);
    diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c
    index 9c5029c..ab2906d 100644
    --- a/arch/x86/kvm/cpuid.c
    +++ b/arch/x86/kvm/cpuid.c
    @@ -442,6 +442,7 @@ static inline int __do_cpuid_func(struct kvm_cpuid_entry2 *entry, u32 function,
    unsigned f_rdtscp = kvm_x86_ops->rdtscp_supported() ? F(RDTSCP) : 0;
    unsigned f_xsaves = kvm_x86_ops->xsaves_supported() ? F(XSAVES) : 0;
    unsigned f_intel_pt = kvm_x86_ops->pt_supported() ? F(INTEL_PT) : 0;
    + unsigned f_pdcm = kvm_x86_ops->pdcm_supported() ? F(PDCM) : 0;

    /* cpuid 1.edx */
    const u32 kvm_cpuid_1_edx_x86_features =
    @@ -470,7 +471,7 @@ static inline int __do_cpuid_func(struct kvm_cpuid_entry2 *entry, u32 function,
    F(XMM3) | F(PCLMULQDQ) | 0 /* DTES64, MONITOR */ |
    0 /* DS-CPL, VMX, SMX, EST */ |
    0 /* TM2 */ | F(SSSE3) | 0 /* CNXT-ID */ | 0 /* Reserved */ |
    - F(FMA) | F(CX16) | 0 /* xTPR Update, PDCM */ |
    + F(FMA) | F(CX16) | 0 /* xTPR Update */ | f_pdcm |
    F(PCID) | 0 /* Reserved, DCA */ | F(XMM4_1) |
    F(XMM4_2) | F(X2APIC) | F(MOVBE) | F(POPCNT) |
    0 /* Reserved*/ | F(AES) | F(XSAVE) | 0 /* OSXSAVE */ | F(AVX) |
    diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
    index f8ecb6d..7e0a7b3 100644
    --- a/arch/x86/kvm/svm.c
    +++ b/arch/x86/kvm/svm.c
    @@ -5975,6 +5975,11 @@ static bool svm_pt_supported(void)
    return false;
    }

    +static bool svm_pdcm_supported(void)
    +{
    + return false;
    +}
    +
    static bool svm_has_wbinvd_exit(void)
    {
    return true;
    @@ -7272,6 +7277,7 @@ static bool svm_apic_init_signal_blocked(struct kvm_vcpu *vcpu)
    .xsaves_supported = svm_xsaves_supported,
    .umip_emulated = svm_umip_emulated,
    .pt_supported = svm_pt_supported,
    + .pdcm_supported = svm_pdcm_supported,

    .set_supported_cpuid = svm_set_supported_cpuid,

    diff --git a/arch/x86/kvm/vmx/capabilities.h b/arch/x86/kvm/vmx/capabilities.h
    index fc861d4..2f502f1 100644
    --- a/arch/x86/kvm/vmx/capabilities.h
    +++ b/arch/x86/kvm/vmx/capabilities.h
    @@ -363,4 +363,14 @@ static inline bool cpu_has_vmx_pebs_output_pt(void)
    (perf_cap & MSR_IA32_PERF_CAP_PEBS_OUTPUT_PT));
    }

    +static inline bool vmx_pebs_supported(void)
    +{
    + return (cpu_has_vmx_pebs_output_pt() && pt_mode == PT_MODE_HOST_GUEST);
    +}
    +
    +static inline bool vmx_pdcm_supported(void)
    +{
    + return boot_cpu_has(X86_FEATURE_PDCM) && vmx_pebs_supported();
    +}
    +
    #endif /* __KVM_X86_VMX_CAPS_H */
    diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
    index 170afde..6c29a57 100644
    --- a/arch/x86/kvm/vmx/vmx.c
    +++ b/arch/x86/kvm/vmx/vmx.c
    @@ -7865,6 +7865,7 @@ static __exit void hardware_unsetup(void)
    .xsaves_supported = vmx_xsaves_supported,
    .umip_emulated = vmx_umip_emulated,
    .pt_supported = vmx_pt_supported,
    + .pdcm_supported = vmx_pdcm_supported,

    .request_immediate_exit = vmx_request_immediate_exit,

    --
    1.8.3.1
    \
     
     \ /
      Last update: 2019-10-27 12:13    [W:4.074 / U:1.388 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site