New: CPUID Leaf 0x40000000 return 0 in eax
https://bugzilla.kernel.org/show_bug.cgi?id=77271
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: [email protected]
Reporter: [email protected]
Regression: NoI 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 # ./cpusig0x40000000 KVM_CPUID_SIGNATURE 0 4b4d564b 564b4d56 4d
It looks like ebx,ecx,edx all contain right values, but eax does not.
Signature · 2 lines
You are receiving this mail because: You are watching the assignee of the bug.
[Bug 77271] CPUID Leaf 0x40000000 return 0 in eax
https://bugzilla.kernel.org/show_bug.cgi?id=77271
Alex Williamson <[email protected]> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |[email protected]
--- Comment #1 from Alex Williamson <[email protected]> --- Further up in cpuid.txt is the statement:
"This is not always guaranteed to work, since userspace can mask-out some, or even all KVM-related cpuid features before launching a guest."
Which is exactly what is happening here. QEMU sets eax = 0 for this leaf:
target-i386/kvm.c
memcpy(signature, "KVMKVMKVM\0\0\0", 12);
c = &cpuid_data.entries[cpuid_i++];
c->function = KVM_CPUID_SIGNATURE | kvm_base;
c->eax = 0;
c->ebx = signature[0];
c->ecx = signature[1];
c->edx = signature[2];So I don't think there's a bug here.
Signature · 2 lines
You are receiving this mail because: You are watching the assignee of the bug.
[Bug 77271] CPUID Leaf 0x40000000 return 0 in eax
In reply to [email protected]https://bugzilla.kernel.org/show_bug.cgi?id=77271
--- Comment #2 from Jidong Xiao <[email protected]> ---
Oh, thanks Alex. I think you are right here, it's not a bug. But do you think that, does it make sense to submit a patch to qemu, so as to make them consistent between userspace qemu and the kernel side kvm? Like this:
qemu-2.0.0/target-i386/kvm.c renamed from qemu-2.0.0/target-i386/kvm.c.orig +1 -1
@@ -530,7 +530,7 @@ int kvm_arch_init_vcpu(CPUState *cs)memcpy (signature,"KVMKVMKVM\0\0\0" ,12 ); c = &cpuid_data.entries[cpuid_i++]; c->function =KVM_CPUID_SIGNATURE | kvm_base; - c->eax =0 ; + c->eax =KVM_CPUID_FEATURES ; c->ebx = signature[0 ]; c->ecx = signature[1 ]; c->edx = signature[2 ];
Signature · 2 lines
You are receiving this mail because: You are watching the assignee of the bug.
[Bug 77271] CPUID Leaf 0x40000000 return 0 in eax
In reply to [email protected]https://bugzilla.kernel.org/show_bug.cgi?id=77271
--- Comment #3 from Alex Williamson <[email protected]> --- The best way to find out is to submit a patch.
Signature · 2 lines
You are receiving this mail because: You are watching the assignee of the bug.
[Bug 77271] CPUID Leaf 0x40000000 return 0 in eax
In reply to [email protected]https://bugzilla.kernel.org/show_bug.cgi?id=77271
Jidong Xiao <[email protected]> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|NEW |RESOLVED
Resolution|--- |INVALID--- Comment #4 from Jidong Xiao <[email protected]> ---
Great, thank Alex, I have submitted a patch to Qemu, I think this ticket can be closed now.
Signature · 2 lines
You are receiving this mail because: You are watching the assignee of the bug.