I've just noticed one thing I don't understand: On Wed, Jun 12, 2019 at 04:41:01PM +0800, Like Xu wrote: > The CPUID.1F as Intel V2 Extended Topology Enumeration Leaf would be > exposed if guests want to emulate multiple software-visible die within > each package. Per Intel's SDM, the 0x1f is a superset of 0xb, thus they > can be generated by almost same code as 0xb except die_offset setting. > > If the number of dies per package is less than 2, the qemu will not > expose CPUID.1F regardless of whether the host supports CPUID.1F. > > Signed-off-by: Like Xu <like...@linux.intel.com> > --- > target/i386/cpu.c | 37 +++++++++++++++++++++++++++++++++++++ > target/i386/cpu.h | 4 ++++ > target/i386/kvm.c | 12 ++++++++++++ > 3 files changed, 53 insertions(+) > > diff --git a/target/i386/cpu.c b/target/i386/cpu.c > index 09e20a2c3b..127aff74a6 100644 > --- a/target/i386/cpu.c > +++ b/target/i386/cpu.c > @@ -4437,6 +4437,42 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, > uint32_t count, > *ecx |= CPUID_TOPOLOGY_LEVEL_INVALID; > } > > + assert(!(*eax & ~0x1f)); > + *ebx &= 0xffff; /* The count doesn't need to be reliable. */ > + break; > + case 0x1F: > + /* V2 Extended Topology Enumeration Leaf */ > + if (env->nr_dies < 2 || !cpu->enable_cpuid_0x1f) { > + *eax = *ebx = *ecx = *edx = 0;
Why exactly do you need cpu->enable_cpuid_0x1f? When would it make sense to set dies > 1 but disable CPUID.1F? > + break; > + } [...] -- Eduardo