]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/blobdiff - arch/x86/kvm/cpuid.c
KVM: x86: Add Intel Processor Trace cpuid emulation
[mirror_ubuntu-hirsute-kernel.git] / arch / x86 / kvm / cpuid.c
index be5e64c61d8f73b42cbc2fcec10c6184297c6f2d..c731e87baef580ec5776bf67161d9e894ea1dbc2 100644 (file)
@@ -334,6 +334,7 @@ static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function,
        unsigned f_mpx = kvm_mpx_supported() ? F(MPX) : 0;
        unsigned f_xsaves = kvm_x86_ops->xsaves_supported() ? F(XSAVES) : 0;
        unsigned f_umip = kvm_x86_ops->umip_emulated() ? F(UMIP) : 0;
+       unsigned f_intel_pt = kvm_x86_ops->pt_supported() ? F(INTEL_PT) : 0;
 
        /* cpuid 1.edx */
        const u32 kvm_cpuid_1_edx_x86_features =
@@ -392,7 +393,7 @@ static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function,
                F(BMI2) | F(ERMS) | f_invpcid | F(RTM) | f_mpx | F(RDSEED) |
                F(ADX) | F(SMAP) | F(AVX512IFMA) | F(AVX512F) | F(AVX512PF) |
                F(AVX512ER) | F(AVX512CD) | F(CLFLUSHOPT) | F(CLWB) | F(AVX512DQ) |
-               F(SHA_NI) | F(AVX512BW) | F(AVX512VL);
+               F(SHA_NI) | F(AVX512BW) | F(AVX512VL) | f_intel_pt;
 
        /* cpuid 0xD.1.eax */
        const u32 kvm_cpuid_D_1_eax_x86_features =
@@ -423,7 +424,7 @@ static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function,
 
        switch (function) {
        case 0:
-               entry->eax = min(entry->eax, (u32)0xd);
+               entry->eax = min(entry->eax, (u32)(f_intel_pt ? 0x14 : 0xd));
                break;
        case 1:
                entry->edx &= kvm_cpuid_1_edx_x86_features;
@@ -600,6 +601,23 @@ static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function,
                }
                break;
        }
+       /* Intel PT */
+       case 0x14: {
+               int t, times = entry->eax;
+
+               if (!f_intel_pt)
+                       break;
+
+               entry->flags |= KVM_CPUID_FLAG_SIGNIFCANT_INDEX;
+               for (t = 1; t <= times; ++t) {
+                       if (*nent >= maxnent)
+                               goto out;
+                       do_cpuid_1_ent(&entry[t], function, t);
+                       entry[t].flags |= KVM_CPUID_FLAG_SIGNIFCANT_INDEX;
+                       ++*nent;
+               }
+               break;
+       }
        case KVM_CPUID_SIGNATURE: {
                static const char signature[12] = "KVMKVMKVM\0\0";
                const u32 *sigptr = (const u32 *)signature;