[Bug 77271] New: CPUID Leaf 0x40000000 return 0 in eax

bugzilla-daemon
2014-06-03T19:48:09Z

Bug ID: 77271
Summary: CPUID Leaf 0x40000000 return 0 in eax
Product: Virtualization
Version: unspecified
Kernel Version: 3.14
Hardware: All
OS: Linux
Tree: Mainline
Status: NEW
Severity: normal
Priority: P1
Component: kvm
Assignee: virtualization_kvm@kernel-bugs.osdl.org
Reporter: jidong.xiao@gmail.com
Regression: No

I am using kernel 3.14 as the host OS. And using 2.6.34 as the guest OS kernel.

According to
https://github.com/torvalds/linux/commit/57c22e5f35aa4b9b2fe11f73f3e62bbf9ef36190

Since kernel 3.5, the cpuid instruction (in the Guest OS) with 0x40000000
function should return 0x40000001 in eax, instead of 0. But what I am seeing
is, it still returns 0.

To reproduce, use a program like this, run it in the Guest:
linux:~/code # cat cpusig.c
#include <stdio.h>

#define cpuid(func,eax,ebx,ecx,edx)\
__asm__ __volatile__ ("cpuid":\
"=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) : "a" (func));

main()
{
unsigned long a,b,c,d;
cpuid(0x40000000,a,b,c,d);
printf("0x40000000 KVM_CPUID_SIGNATURE %lx %lx %lx %lx\n",a,b,c,d);
}

What I saw is:
linux:~/code # ./cpusig
0x40000000 KVM_CPUID_SIGNATURE 0 4b4d564b 564b4d56 4d

It looks like ebx,ecx,edx all contain right values, but eax does not.