diff options
author | Nitin A Kamble <nitin.a.kamble@intel.com> | 2008-11-05 15:56:21 -0800 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2008-12-31 16:52:24 +0200 |
commit | 0fdf8e59faa5c60e9d77c8e14abe3a0f8bfcf586 (patch) | |
tree | 4dba778281a62ab4c4927092a5017acef4fb0d7b | |
parent | 0853d2c1d849ef69884d2447d90d04007590b72b (diff) | |
download | kernel_samsung_smdk4412-0fdf8e59faa5c60e9d77c8e14abe3a0f8bfcf586.tar.gz kernel_samsung_smdk4412-0fdf8e59faa5c60e9d77c8e14abe3a0f8bfcf586.tar.bz2 kernel_samsung_smdk4412-0fdf8e59faa5c60e9d77c8e14abe3a0f8bfcf586.zip |
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>
-rw-r--r-- | arch/x86/kvm/x86.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 2889a0f359e..7a2aeba0bfb 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, int t, times = entry->eax & 0xff; entry->flags |= KVM_CPUID_FLAG_STATEFUL_FUNC; + entry->flags |= KVM_CPUID_FLAG_STATE_READ_NEXT; for (t = 1; t < times && *nent < maxnent; ++t) { do_cpuid_1_ent(&entry[t], function, 0); 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) e->flags &= ~KVM_CPUID_FLAG_STATE_READ_NEXT; /* when no next entry is found, the current entry[i] is reselected */ - for (j = i + 1; j == i; j = (j + 1) % nent) { + for (j = i + 1; ; j = (j + 1) % nent) { struct kvm_cpuid_entry2 *ej = &vcpu->arch.cpuid_entries[j]; if (ej->function == e->function) { ej->flags |= KVM_CPUID_FLAG_STATE_READ_NEXT; |