mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-16 16:54:20 +08:00
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>
This commit is contained in:
parent
0853d2c1d8
commit
0fdf8e59fa
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user