We don't need to store any CPUID data for function we know nothing
about. However, this limit may need to be increased in the future when
libvirt learns features described by a CPUID function greater than 10.
The comparison is done after subtracting high-bits prefix, so currently
functions 0x00000000 to 0x0000000a and 0x80000000 to 0x8000000a are
stored.
---
src/cpu/cpu_x86.c | 5 +++++
src/cpu/cpu_x86_data.h | 1 +
2 files changed, 6 insertions(+)
diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c
index dbbcfd2..bd3f2b0 100644
--- a/src/cpu/cpu_x86.c
+++ b/src/cpu/cpu_x86.c
@@ -314,6 +314,11 @@ x86DataAddCpuid(struct cpuX86Data *data,
cpuids = &data->extended;
}
+ if (pos > CPUX86_MAX_FUNCTION) {
+ VIR_DEBUG("Ignoring unhandled function 0x%x", cpuid->function);
+ return 0;
+ }
+
if (x86DataExpand(data, basic_by, extended_by) < 0)
return -1;
diff --git a/src/cpu/cpu_x86_data.h b/src/cpu/cpu_x86_data.h
index dc972a6..af470e4 100644
--- a/src/cpu/cpu_x86_data.h
+++ b/src/cpu/cpu_x86_data.h
@@ -36,6 +36,7 @@ struct cpuX86cpuid {
# define CPUX86_BASIC 0x0
# define CPUX86_EXTENDED 0x80000000
+# define CPUX86_MAX_FUNCTION 10
struct cpuX86Data {
size_t basic_len;
--
1.8.3.2