Loading arch/x86/kvm/cpuid.c +42 −47 Original line number Diff line number Diff line Loading @@ -294,14 +294,19 @@ static void do_cpuid_1_ent(struct kvm_cpuid_entry2 *entry, u32 function, { entry->function = function; entry->index = index; entry->flags = 0; cpuid_count(entry->function, entry->index, &entry->eax, &entry->ebx, &entry->ecx, &entry->edx); entry->flags = 0; } static int __do_cpuid_ent_emulated(struct kvm_cpuid_entry2 *entry, u32 func, u32 index, int *nent, int maxnent) static int __do_cpuid_func_emulated(struct kvm_cpuid_entry2 *entry, u32 func, int *nent, int maxnent) { entry->function = func; entry->index = 0; entry->flags = 0; switch (func) { case 0: entry->eax = 7; Loading @@ -313,21 +318,18 @@ static int __do_cpuid_ent_emulated(struct kvm_cpuid_entry2 *entry, break; case 7: entry->flags |= KVM_CPUID_FLAG_SIGNIFCANT_INDEX; if (index == 0) entry->eax = 0; entry->ecx = F(RDPID); ++*nent; default: break; } entry->function = func; entry->index = index; return 0; } static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function, u32 index, int *nent, int maxnent) static inline int __do_cpuid_func(struct kvm_cpuid_entry2 *entry, u32 function, int *nent, int maxnent) { int r; unsigned f_nx = is_efer_nx() ? F(NX) : 0; Loading Loading @@ -431,7 +433,7 @@ static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function, if (*nent >= maxnent) goto out; do_cpuid_1_ent(entry, function, index); do_cpuid_1_ent(entry, function, 0); ++*nent; switch (function) { Loading Loading @@ -496,8 +498,8 @@ static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function, break; case 7: { entry->flags |= KVM_CPUID_FLAG_SIGNIFCANT_INDEX; entry->eax = 0; /* Mask ebx against host capability word 9 */ if (index == 0) { entry->ebx &= kvm_cpuid_7_0_ebx_x86_features; cpuid_mask(&entry->ebx, CPUID_7_0_EBX); // TSC_ADJUST is emulated Loading @@ -518,12 +520,6 @@ static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function, * if the host doesn't support it. */ entry->edx |= F(ARCH_CAPABILITIES); } else { entry->ebx = 0; entry->ecx = 0; entry->edx = 0; } entry->eax = 0; break; } case 9: Loading Loading @@ -750,20 +746,19 @@ static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function, return r; } static int do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 func, u32 idx, int *nent, int maxnent, unsigned int type) static int do_cpuid_func(struct kvm_cpuid_entry2 *entry, u32 func, int *nent, int maxnent, unsigned int type) { if (type == KVM_GET_EMULATED_CPUID) return __do_cpuid_ent_emulated(entry, func, idx, nent, maxnent); return __do_cpuid_func_emulated(entry, func, nent, maxnent); return __do_cpuid_ent(entry, func, idx, nent, maxnent); return __do_cpuid_func(entry, func, nent, maxnent); } #undef F struct kvm_cpuid_param { u32 func; u32 idx; bool has_leaf_count; bool (*qualifier)(const struct kvm_cpuid_param *param); }; Loading Loading @@ -836,7 +831,7 @@ int kvm_dev_ioctl_get_cpuid(struct kvm_cpuid2 *cpuid, if (ent->qualifier && !ent->qualifier(ent)) continue; r = do_cpuid_ent(&cpuid_entries[nent], ent->func, ent->idx, r = do_cpuid_func(&cpuid_entries[nent], ent->func, &nent, cpuid->nent, type); if (r) Loading @@ -847,7 +842,7 @@ int kvm_dev_ioctl_get_cpuid(struct kvm_cpuid2 *cpuid, limit = cpuid_entries[nent - 1].eax; for (func = ent->func + 1; func <= limit && nent < cpuid->nent && r == 0; ++func) r = do_cpuid_ent(&cpuid_entries[nent], func, ent->idx, r = do_cpuid_func(&cpuid_entries[nent], func, &nent, cpuid->nent, type); if (r) Loading Loading
arch/x86/kvm/cpuid.c +42 −47 Original line number Diff line number Diff line Loading @@ -294,14 +294,19 @@ static void do_cpuid_1_ent(struct kvm_cpuid_entry2 *entry, u32 function, { entry->function = function; entry->index = index; entry->flags = 0; cpuid_count(entry->function, entry->index, &entry->eax, &entry->ebx, &entry->ecx, &entry->edx); entry->flags = 0; } static int __do_cpuid_ent_emulated(struct kvm_cpuid_entry2 *entry, u32 func, u32 index, int *nent, int maxnent) static int __do_cpuid_func_emulated(struct kvm_cpuid_entry2 *entry, u32 func, int *nent, int maxnent) { entry->function = func; entry->index = 0; entry->flags = 0; switch (func) { case 0: entry->eax = 7; Loading @@ -313,21 +318,18 @@ static int __do_cpuid_ent_emulated(struct kvm_cpuid_entry2 *entry, break; case 7: entry->flags |= KVM_CPUID_FLAG_SIGNIFCANT_INDEX; if (index == 0) entry->eax = 0; entry->ecx = F(RDPID); ++*nent; default: break; } entry->function = func; entry->index = index; return 0; } static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function, u32 index, int *nent, int maxnent) static inline int __do_cpuid_func(struct kvm_cpuid_entry2 *entry, u32 function, int *nent, int maxnent) { int r; unsigned f_nx = is_efer_nx() ? F(NX) : 0; Loading Loading @@ -431,7 +433,7 @@ static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function, if (*nent >= maxnent) goto out; do_cpuid_1_ent(entry, function, index); do_cpuid_1_ent(entry, function, 0); ++*nent; switch (function) { Loading Loading @@ -496,8 +498,8 @@ static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function, break; case 7: { entry->flags |= KVM_CPUID_FLAG_SIGNIFCANT_INDEX; entry->eax = 0; /* Mask ebx against host capability word 9 */ if (index == 0) { entry->ebx &= kvm_cpuid_7_0_ebx_x86_features; cpuid_mask(&entry->ebx, CPUID_7_0_EBX); // TSC_ADJUST is emulated Loading @@ -518,12 +520,6 @@ static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function, * if the host doesn't support it. */ entry->edx |= F(ARCH_CAPABILITIES); } else { entry->ebx = 0; entry->ecx = 0; entry->edx = 0; } entry->eax = 0; break; } case 9: Loading Loading @@ -750,20 +746,19 @@ static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function, return r; } static int do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 func, u32 idx, int *nent, int maxnent, unsigned int type) static int do_cpuid_func(struct kvm_cpuid_entry2 *entry, u32 func, int *nent, int maxnent, unsigned int type) { if (type == KVM_GET_EMULATED_CPUID) return __do_cpuid_ent_emulated(entry, func, idx, nent, maxnent); return __do_cpuid_func_emulated(entry, func, nent, maxnent); return __do_cpuid_ent(entry, func, idx, nent, maxnent); return __do_cpuid_func(entry, func, nent, maxnent); } #undef F struct kvm_cpuid_param { u32 func; u32 idx; bool has_leaf_count; bool (*qualifier)(const struct kvm_cpuid_param *param); }; Loading Loading @@ -836,7 +831,7 @@ int kvm_dev_ioctl_get_cpuid(struct kvm_cpuid2 *cpuid, if (ent->qualifier && !ent->qualifier(ent)) continue; r = do_cpuid_ent(&cpuid_entries[nent], ent->func, ent->idx, r = do_cpuid_func(&cpuid_entries[nent], ent->func, &nent, cpuid->nent, type); if (r) Loading @@ -847,7 +842,7 @@ int kvm_dev_ioctl_get_cpuid(struct kvm_cpuid2 *cpuid, limit = cpuid_entries[nent - 1].eax; for (func = ent->func + 1; func <= limit && nent < cpuid->nent && r == 0; ++func) r = do_cpuid_ent(&cpuid_entries[nent], func, ent->idx, r = do_cpuid_func(&cpuid_entries[nent], func, &nent, cpuid->nent, type); if (r) Loading