Using cpuid structs in KVM to eliminate cryptic code with many bit operations. The code does not introduce functional changes. Signed-off-by: Nadav Amit <namit@xxxxxxxxxxxxxxxxx> --- arch/x86/kvm/cpuid.c | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c index 38a0afe..a7479ab 100644 --- a/arch/x86/kvm/cpuid.c +++ b/arch/x86/kvm/cpuid.c @@ -18,6 +18,7 @@ #include <linux/uaccess.h> #include <asm/user.h> #include <asm/xsave.h> +#include <asm/cpuid_def.h> #include "cpuid.h" #include "lapic.h" #include "mmu.h" @@ -357,16 +358,18 @@ static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function, } /* function 4 has additional index. */ case 4: { - int i, cache_type; + int i; entry->flags |= KVM_CPUID_FLAG_SIGNIFCANT_INDEX; /* read more entries until cache_type is zero */ for (i = 1; ; ++i) { + union cpuid4_eax eax; + if (*nent >= maxnent) goto out; - cache_type = entry[i - 1].eax & 0x1f; - if (!cache_type) + eax.full = entry[i - 1].eax; + if (!eax.split.cache_type) break; do_cpuid_1_ent(&entry[i], function, i); entry[i].flags |= @@ -423,16 +426,18 @@ static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function, } /* function 0xb has additional index. */ case 0xb: { - int i, level_type; + int i; entry->flags |= KVM_CPUID_FLAG_SIGNIFCANT_INDEX; /* read more entries until level_type is zero */ for (i = 1; ; ++i) { + union cpuid11_ecx ecx; + if (*nent >= maxnent) goto out; - level_type = entry[i - 1].ecx & 0xff00; - if (!level_type) + ecx.full = entry[i - 1].ecx; + if (!ecx.split.level_type) break; do_cpuid_1_ent(&entry[i], function, i); entry[i].flags |= @@ -505,13 +510,13 @@ static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function, entry->eax = entry->ebx = entry->ecx = 0; break; case 0x80000008: { - unsigned g_phys_as = (entry->eax >> 16) & 0xff; - unsigned virt_as = max((entry->eax >> 8) & 0xff, 48U); - unsigned phys_as = entry->eax & 0xff; + union cpuid_8_8_eax eax; - if (!g_phys_as) - g_phys_as = phys_as; - entry->eax = g_phys_as | (virt_as << 8); + eax.full = entry->eax; + eax.split.virt_as = max_t(int, eax.split.virt_as, 48); + if (!eax.split.guest_phys_as) + eax.split.guest_phys_as = eax.split.phys_as; + entry->eax = eax.full; entry->ebx = entry->edx = 0; break; } @@ -724,13 +729,16 @@ EXPORT_SYMBOL_GPL(kvm_find_cpuid_entry); int cpuid_maxphyaddr(struct kvm_vcpu *vcpu) { struct kvm_cpuid_entry2 *best; + union cpuid_8_8_eax eax; best = kvm_find_cpuid_entry(vcpu, 0x80000000, 0); if (!best || best->eax < 0x80000008) goto not_found; best = kvm_find_cpuid_entry(vcpu, 0x80000008, 0); - if (best) - return best->eax & 0xff; + if (best) { + eax.full = best->eax; + return eax.split.phys_as; + } not_found: return 36; } -- 1.9.1 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html