To make the code look clean, wrap CPUID(0xD,n>=1) enumeration code in a helper function now. Signed-off-by: Yang Weijiang <weijiang.yang@xxxxxxxxx> --- arch/x86/kvm/cpuid.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c index 4992e7c99588..29cbde7538a3 100644 --- a/arch/x86/kvm/cpuid.c +++ b/arch/x86/kvm/cpuid.c @@ -313,6 +313,50 @@ static int __do_cpuid_ent_emulated(struct kvm_cpuid_entry2 *entry, return 0; } +static inline int __do_cpuid_dx_leaf(struct kvm_cpuid_entry2 *entry, int *nent, + int maxnent, u64 xss_mask, u64 xcr0_mask, + u32 eax_mask) +{ + int idx, i; + u64 mask; + u64 supported; + + for (idx = 1, i = 1; idx < 64; ++idx) { + mask = ((u64)1 << idx); + if (*nent >= maxnent) + return -EINVAL; + + do_cpuid_1_ent(&entry[i], 0xD, idx); + if (idx == 1) { + entry[i].eax &= eax_mask; + cpuid_mask(&entry[i].eax, CPUID_D_1_EAX); + supported = xcr0_mask | xss_mask; + entry[i].ebx = 0; + entry[i].edx = 0; + entry[i].ecx &= xss_mask; + if (entry[i].eax & (F(XSAVES) | F(XSAVEC))) { + entry[i].ebx = + xstate_required_size(supported, + true); + } + } else { + supported = (entry[i].ecx & 1) ? xss_mask : + xcr0_mask; + if (entry[i].eax == 0 || !(supported & mask)) + continue; + entry[i].ecx &= 1; + entry[i].edx = 0; + if (entry[i].ecx) + entry[i].ebx = 0; + } + entry[i].flags |= + KVM_CPUID_FLAG_SIGNIFCANT_INDEX; + ++*nent; + ++i; + } + return 0; +} + static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function, u32 index, int *nent, int maxnent) { -- 2.17.2