Add and export kvm_cpuid_get_allowed_mask() to let vendor modules (e.g., TDX) look up the allowed bitmask for a specific CPUID leaf/subleaf/ register under a given overlay. TDX is probably the only user, CPUID features emulated are not included. Signed-off-by: Binbin Wu --- arch/x86/kvm/cpuid.c | 16 ++++++++++++++++ arch/x86/kvm/cpuid.h | 1 + 2 files changed, 17 insertions(+) diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c index e6f0ecadc290..30fb61c1430d 100644 --- a/arch/x86/kvm/cpuid.c +++ b/arch/x86/kvm/cpuid.c @@ -526,6 +526,22 @@ static int kvm_check_pv_cpuid_relocated(struct kvm_vcpu *vcpu, struct kvm_cpuid_ return 0; } +/* CPUID features emulated are not included. */ +u32 kvm_cpuid_get_allowed_mask(u32 func, u32 index, int reg, u32 overlay) +{ + u32 leaf; + + if (is_cpuid_paranoid_ignored(func, index, reg, overlay)) + return (u32)-1; + + leaf = cpuid_reg_2_x86_leaf(func, index, reg); + if (leaf == (u32)-1) + return 0; + + return kvm_cpu_caps[overlay][leaf]; +} +EXPORT_SYMBOL_FOR_KVM_INTERNAL(kvm_cpuid_get_allowed_mask); + static int cpuid_check_and_set_vcpu_caps(struct kvm_vcpu *vcpu, struct kvm_cpuid_entry2 *entry) { diff --git a/arch/x86/kvm/cpuid.h b/arch/x86/kvm/cpuid.h index cff5e71579ce..251003d78990 100644 --- a/arch/x86/kvm/cpuid.h +++ b/arch/x86/kvm/cpuid.h @@ -85,6 +85,7 @@ int kvm_vcpu_ioctl_get_cpuid2(struct kvm_vcpu *vcpu, struct kvm_cpuid_entry2 __user *entries); bool kvm_cpuid(struct kvm_vcpu *vcpu, u32 *eax, u32 *ebx, u32 *ecx, u32 *edx, bool exact_only); +u32 kvm_cpuid_get_allowed_mask(u32 func, u32 index, int reg, u32 overlay); void __init kvm_init_xstate_sizes(void); u32 xstate_required_size(u64 xstate_bv, bool compacted); -- 2.46.0