Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d9aadaf6 authored by Paolo Bonzini's avatar Paolo Bonzini
Browse files

KVM: cpuid: set struct kvm_cpuid_entry2 flags in do_cpuid_1_ent



do_cpuid_1_ent is typically called in two places by __do_cpuid_func
for CPUID functions that have subleafs.  Both places have to set
the KVM_CPUID_FLAG_SIGNIFCANT_INDEX.  Set that flag, and
KVM_CPUID_FLAG_STATEFUL_FUNC as well, directly in do_cpuid_1_ent.

Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent 54d360d4
Loading
Loading
Loading
Loading
+14 −16
Original line number Original line Diff line number Diff line
@@ -298,6 +298,20 @@ static void do_cpuid_1_ent(struct kvm_cpuid_entry2 *entry, u32 function,


	cpuid_count(entry->function, entry->index,
	cpuid_count(entry->function, entry->index,
		    &entry->eax, &entry->ebx, &entry->ecx, &entry->edx);
		    &entry->eax, &entry->ebx, &entry->ecx, &entry->edx);

	switch (function) {
	case 2:
		entry->flags |= KVM_CPUID_FLAG_STATEFUL_FUNC;
		break;
	case 4:
	case 7:
	case 0xb:
	case 0xd:
	case 0x14:
	case 0x8000001d:
		entry->flags |= KVM_CPUID_FLAG_SIGNIFCANT_INDEX;
		break;
	}
}
}


static int __do_cpuid_func_emulated(struct kvm_cpuid_entry2 *entry,
static int __do_cpuid_func_emulated(struct kvm_cpuid_entry2 *entry,
@@ -497,14 +511,12 @@ static inline int __do_cpuid_func(struct kvm_cpuid_entry2 *entry, u32 function,
	case 2: {
	case 2: {
		int t, times = entry->eax & 0xff;
		int t, times = entry->eax & 0xff;


		entry->flags |= KVM_CPUID_FLAG_STATEFUL_FUNC;
		entry->flags |= KVM_CPUID_FLAG_STATE_READ_NEXT;
		entry->flags |= KVM_CPUID_FLAG_STATE_READ_NEXT;
		for (t = 1; t < times; ++t) {
		for (t = 1; t < times; ++t) {
			if (*nent >= maxnent)
			if (*nent >= maxnent)
				goto out;
				goto out;


			do_cpuid_1_ent(&entry[t], function, 0);
			do_cpuid_1_ent(&entry[t], function, 0);
			entry[t].flags |= KVM_CPUID_FLAG_STATEFUL_FUNC;
			++*nent;
			++*nent;
		}
		}
		break;
		break;
@@ -514,7 +526,6 @@ static inline int __do_cpuid_func(struct kvm_cpuid_entry2 *entry, u32 function,
	case 0x8000001d: {
	case 0x8000001d: {
		int i, cache_type;
		int i, cache_type;


		entry->flags |= KVM_CPUID_FLAG_SIGNIFCANT_INDEX;
		/* read more entries until cache_type is zero */
		/* read more entries until cache_type is zero */
		for (i = 1; ; ++i) {
		for (i = 1; ; ++i) {
			if (*nent >= maxnent)
			if (*nent >= maxnent)
@@ -524,8 +535,6 @@ static inline int __do_cpuid_func(struct kvm_cpuid_entry2 *entry, u32 function,
			if (!cache_type)
			if (!cache_type)
				break;
				break;
			do_cpuid_1_ent(&entry[i], function, i);
			do_cpuid_1_ent(&entry[i], function, i);
			entry[i].flags |=
			       KVM_CPUID_FLAG_SIGNIFCANT_INDEX;
			++*nent;
			++*nent;
		}
		}
		break;
		break;
@@ -540,7 +549,6 @@ static inline int __do_cpuid_func(struct kvm_cpuid_entry2 *entry, u32 function,
	case 7: {
	case 7: {
		int i;
		int i;


		entry->flags |= KVM_CPUID_FLAG_SIGNIFCANT_INDEX;
		for (i = 0; ; ) {
		for (i = 0; ; ) {
			do_cpuid_7_mask(&entry[i], i);
			do_cpuid_7_mask(&entry[i], i);
			if (i == entry->eax)
			if (i == entry->eax)
@@ -550,8 +558,6 @@ static inline int __do_cpuid_func(struct kvm_cpuid_entry2 *entry, u32 function,


			++i;
			++i;
			do_cpuid_1_ent(&entry[i], function, i);
			do_cpuid_1_ent(&entry[i], function, i);
			entry[i].flags |=
			       KVM_CPUID_FLAG_SIGNIFCANT_INDEX;
			++*nent;
			++*nent;
		}
		}
		break;
		break;
@@ -595,7 +601,6 @@ static inline int __do_cpuid_func(struct kvm_cpuid_entry2 *entry, u32 function,
	case 0xb: {
	case 0xb: {
		int i, level_type;
		int i, level_type;


		entry->flags |= KVM_CPUID_FLAG_SIGNIFCANT_INDEX;
		/* read more entries until level_type is zero */
		/* read more entries until level_type is zero */
		for (i = 1; ; ++i) {
		for (i = 1; ; ++i) {
			if (*nent >= maxnent)
			if (*nent >= maxnent)
@@ -605,8 +610,6 @@ static inline int __do_cpuid_func(struct kvm_cpuid_entry2 *entry, u32 function,
			if (!level_type)
			if (!level_type)
				break;
				break;
			do_cpuid_1_ent(&entry[i], function, i);
			do_cpuid_1_ent(&entry[i], function, i);
			entry[i].flags |=
			       KVM_CPUID_FLAG_SIGNIFCANT_INDEX;
			++*nent;
			++*nent;
		}
		}
		break;
		break;
@@ -619,7 +622,6 @@ static inline int __do_cpuid_func(struct kvm_cpuid_entry2 *entry, u32 function,
		entry->ebx = xstate_required_size(supported, false);
		entry->ebx = xstate_required_size(supported, false);
		entry->ecx = entry->ebx;
		entry->ecx = entry->ebx;
		entry->edx &= supported >> 32;
		entry->edx &= supported >> 32;
		entry->flags |= KVM_CPUID_FLAG_SIGNIFCANT_INDEX;
		if (!supported)
		if (!supported)
			break;
			break;


@@ -645,8 +647,6 @@ static inline int __do_cpuid_func(struct kvm_cpuid_entry2 *entry, u32 function,
			}
			}
			entry[i].ecx = 0;
			entry[i].ecx = 0;
			entry[i].edx = 0;
			entry[i].edx = 0;
			entry[i].flags |=
			       KVM_CPUID_FLAG_SIGNIFCANT_INDEX;
			++*nent;
			++*nent;
			++i;
			++i;
		}
		}
@@ -659,12 +659,10 @@ static inline int __do_cpuid_func(struct kvm_cpuid_entry2 *entry, u32 function,
		if (!f_intel_pt)
		if (!f_intel_pt)
			break;
			break;


		entry->flags |= KVM_CPUID_FLAG_SIGNIFCANT_INDEX;
		for (t = 1; t <= times; ++t) {
		for (t = 1; t <= times; ++t) {
			if (*nent >= maxnent)
			if (*nent >= maxnent)
				goto out;
				goto out;
			do_cpuid_1_ent(&entry[t], function, t);
			do_cpuid_1_ent(&entry[t], function, t);
			entry[t].flags |= KVM_CPUID_FLAG_SIGNIFCANT_INDEX;
			++*nent;
			++*nent;
		}
		}
		break;
		break;