aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorNitin A Kamble <nitin.a.kamble@intel.com>2008-11-05 18:56:21 -0500
committerAvi Kivity <avi@redhat.com>2008-12-31 09:52:24 -0500
commit0fdf8e59faa5c60e9d77c8e14abe3a0f8bfcf586 (patch)
tree4dba778281a62ab4c4927092a5017acef4fb0d7b /arch
parent0853d2c1d849ef69884d2447d90d04007590b72b (diff)
KVM: Fix cpuid iteration on multiple leaves per eac
The code to traverse the cpuid data array list for counting type of leaves is currently broken. This patches fixes the 2 things in it. 1. Set the 1st counting entry's flag KVM_CPUID_FLAG_STATE_READ_NEXT. Without it the code will never find a valid entry. 2. Also the stop condition in the for loop while looking for the next unflaged entry is broken. It needs to stop when it find one matching entry; and in the case of count of 1, it will be the same entry found in this iteration. Signed-Off-By: Nitin A Kamble <nitin.a.kamble@intel.com> Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/x86/kvm/x86.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 2889a0f359ea..7a2aeba0bfbd 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -1246,6 +1246,7 @@ static void do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function,
1246 int t, times = entry->eax & 0xff; 1246 int t, times = entry->eax & 0xff;
1247 1247
1248 entry->flags |= KVM_CPUID_FLAG_STATEFUL_FUNC; 1248 entry->flags |= KVM_CPUID_FLAG_STATEFUL_FUNC;
1249 entry->flags |= KVM_CPUID_FLAG_STATE_READ_NEXT;
1249 for (t = 1; t < times && *nent < maxnent; ++t) { 1250 for (t = 1; t < times && *nent < maxnent; ++t) {
1250 do_cpuid_1_ent(&entry[t], function, 0); 1251 do_cpuid_1_ent(&entry[t], function, 0);
1251 entry[t].flags |= KVM_CPUID_FLAG_STATEFUL_FUNC; 1252 entry[t].flags |= KVM_CPUID_FLAG_STATEFUL_FUNC;
@@ -2801,7 +2802,7 @@ static int move_to_next_stateful_cpuid_entry(struct kvm_vcpu *vcpu, int i)
2801 2802
2802 e->flags &= ~KVM_CPUID_FLAG_STATE_READ_NEXT; 2803 e->flags &= ~KVM_CPUID_FLAG_STATE_READ_NEXT;
2803 /* when no next entry is found, the current entry[i] is reselected */ 2804 /* when no next entry is found, the current entry[i] is reselected */
2804 for (j = i + 1; j == i; j = (j + 1) % nent) { 2805 for (j = i + 1; ; j = (j + 1) % nent) {
2805 struct kvm_cpuid_entry2 *ej = &vcpu->arch.cpuid_entries[j]; 2806 struct kvm_cpuid_entry2 *ej = &vcpu->arch.cpuid_entries[j];
2806 if (ej->function == e->function) { 2807 if (ej->function == e->function) {
2807 ej->flags |= KVM_CPUID_FLAG_STATE_READ_NEXT; 2808 ej->flags |= KVM_CPUID_FLAG_STATE_READ_NEXT;