Patchwork CPU vendor in KVM

login
register
mail settings
Submitter 李春奇
Date May 4, 2013, 7:50 a.m.
Message ID <CABpY8MKmbU2Yj01x-Oa7GsLk1acf0q-iYDG8FHfY7zp_mFswwA@mail.gmail.com>
Download mbox | patch
Permalink /patch/241434/
State New
Headers show

Comments

李春奇 - May 4, 2013, 7:50 a.m.
Hi Jan and All,
I find that when enable KVM with qemu, vendor ID of simulated CPU will be
set the same as host, but other features such as level, family, model,
stepping are not changed. This may bring out a confusing result, the
simulated CPU has a vendor name of "GenuineIntel" but with family number
"16".

I disabled the related code in function cpu_x86_find_by_name:
                 x86_cpu_vendor_words2str(x86_cpu_def->vendor, ebx, edx,
ecx);

And the information of CPU remains consistent and the VM runs OK, even
though with nested environment.

Why should qemu set simulated cpu's vendor same as the host in KVM
environment?
Jan Kiszka - May 4, 2013, 8:05 a.m.
On 2013-05-04 09:50, 李春奇 <Arthur Chunqi Li> wrote:
> Hi Jan and All,
> I find that when enable KVM with qemu, vendor ID of simulated CPU will be
> set the same as host, but other features such as level, family, model,
> stepping are not changed. This may bring out a confusing result, the
> simulated CPU has a vendor name of "GenuineIntel" but with family number
> "16".
> 
> I disabled the related code in function cpu_x86_find_by_name:
> diff --git a/target-i386/cpu.c b/target-i386/cpu.c
> index e2302d8..df0e82e 100644
> --- a/target-i386/cpu.c
> +++ b/target-i386/cpu.c
> @@ -1295,7 +1295,8 @@ static int cpu_x86_find_by_name(x86_def_t
> *x86_cpu_def, const char *name)
>               * KVM's sysenter/syscall emulation in compatibility mode and
>               * when doing cross vendor migration
>               */
> -            if (kvm_enabled()) {
> +            //if (kvm_enabled()) {
> +            if (0) {
>                  uint32_t  ebx = 0, ecx = 0, edx = 0;
>                  host_cpuid(0, 0, NULL, &ebx, &ecx, &edx);
>                  x86_cpu_vendor_words2str(x86_cpu_def->vendor, ebx, edx,
> ecx);
> 
> And the information of CPU remains consistent and the VM runs OK, even
> though with nested environment.
> 
> Why should qemu set simulated cpu's vendor same as the host in KVM
> environment?

The reason (and a way out) is given in the comment above the cited code.

Jan
李春奇 - May 4, 2013, 8:45 a.m.
But will the difference between the vendor ID and family number cause
confusion to the OS in VM?

On Sat, May 4, 2013 at 4:05 PM, Jan Kiszka <jan.kiszka@web.de> wrote:
> On 2013-05-04 09:50, 李春奇 <Arthur Chunqi Li> wrote:
>> Hi Jan and All,
>> I find that when enable KVM with qemu, vendor ID of simulated CPU will be
>> set the same as host, but other features such as level, family, model,
>> stepping are not changed. This may bring out a confusing result, the
>> simulated CPU has a vendor name of "GenuineIntel" but with family number
>> "16".
>>
>> I disabled the related code in function cpu_x86_find_by_name:
>> diff --git a/target-i386/cpu.c b/target-i386/cpu.c
>> index e2302d8..df0e82e 100644
>> --- a/target-i386/cpu.c
>> +++ b/target-i386/cpu.c
>> @@ -1295,7 +1295,8 @@ static int cpu_x86_find_by_name(x86_def_t
>> *x86_cpu_def, const char *name)
>>               * KVM's sysenter/syscall emulation in compatibility mode and
>>               * when doing cross vendor migration
>>               */
>> -            if (kvm_enabled()) {
>> +            //if (kvm_enabled()) {
>> +            if (0) {
>>                  uint32_t  ebx = 0, ecx = 0, edx = 0;
>>                  host_cpuid(0, 0, NULL, &ebx, &ecx, &edx);
>>                  x86_cpu_vendor_words2str(x86_cpu_def->vendor, ebx, edx,
>> ecx);
>>
>> And the information of CPU remains consistent and the VM runs OK, even
>> though with nested environment.
>>
>> Why should qemu set simulated cpu's vendor same as the host in KVM
>> environment?
>
> The reason (and a way out) is given in the comment above the cited code.
>
> Jan
>
>
Jan Kiszka - May 4, 2013, 8:47 a.m.
Please don't top-post.

On 2013-05-04 10:45, 李春奇 <Arthur Chunqi Li> wrote:
> But will the difference between the vendor ID and family number cause
> confusion to the OS in VM?

The confusion is not yet clear to me. About which "-cpu ..." were you
talking?

Jan

> 
> On Sat, May 4, 2013 at 4:05 PM, Jan Kiszka <jan.kiszka@web.de> wrote:
>> On 2013-05-04 09:50, 李春奇 <Arthur Chunqi Li> wrote:
>>> Hi Jan and All,
>>> I find that when enable KVM with qemu, vendor ID of simulated CPU will be
>>> set the same as host, but other features such as level, family, model,
>>> stepping are not changed. This may bring out a confusing result, the
>>> simulated CPU has a vendor name of "GenuineIntel" but with family number
>>> "16".
>>>
>>> I disabled the related code in function cpu_x86_find_by_name:
>>> diff --git a/target-i386/cpu.c b/target-i386/cpu.c
>>> index e2302d8..df0e82e 100644
>>> --- a/target-i386/cpu.c
>>> +++ b/target-i386/cpu.c
>>> @@ -1295,7 +1295,8 @@ static int cpu_x86_find_by_name(x86_def_t
>>> *x86_cpu_def, const char *name)
>>>               * KVM's sysenter/syscall emulation in compatibility mode and
>>>               * when doing cross vendor migration
>>>               */
>>> -            if (kvm_enabled()) {
>>> +            //if (kvm_enabled()) {
>>> +            if (0) {
>>>                  uint32_t  ebx = 0, ecx = 0, edx = 0;
>>>                  host_cpuid(0, 0, NULL, &ebx, &ecx, &edx);
>>>                  x86_cpu_vendor_words2str(x86_cpu_def->vendor, ebx, edx,
>>> ecx);
>>>
>>> And the information of CPU remains consistent and the VM runs OK, even
>>> though with nested environment.
>>>
>>> Why should qemu set simulated cpu's vendor same as the host in KVM
>>> environment?
>>
>> The reason (and a way out) is given in the comment above the cited code.
>>
>> Jan
>>
>>
> 
> 
>
李春奇 - May 4, 2013, 8:52 a.m.
On Sat, May 4, 2013 at 4:47 PM, Jan Kiszka <jan.kiszka@web.de> wrote:
> Please don't top-post.
>
> On 2013-05-04 10:45, 李春奇 <Arthur Chunqi Li> wrote:
>> But will the difference between the vendor ID and family number cause
>> confusion to the OS in VM?
>
> The confusion is not yet clear to me. About which "-cpu ..." were you
> talking?
>
> Jan
>
>>
>> On Sat, May 4, 2013 at 4:05 PM, Jan Kiszka <jan.kiszka@web.de> wrote:
>>> On 2013-05-04 09:50, 李春奇 <Arthur Chunqi Li> wrote:
>>>> Hi Jan and All,
>>>> I find that when enable KVM with qemu, vendor ID of simulated CPU will be
>>>> set the same as host, but other features such as level, family, model,
>>>> stepping are not changed. This may bring out a confusing result, the
>>>> simulated CPU has a vendor name of "GenuineIntel" but with family number
>>>> "16".
>>>>
>>>> I disabled the related code in function cpu_x86_find_by_name:
>>>> diff --git a/target-i386/cpu.c b/target-i386/cpu.c
>>>> index e2302d8..df0e82e 100644
>>>> --- a/target-i386/cpu.c
>>>> +++ b/target-i386/cpu.c
>>>> @@ -1295,7 +1295,8 @@ static int cpu_x86_find_by_name(x86_def_t
>>>> *x86_cpu_def, const char *name)
>>>>               * KVM's sysenter/syscall emulation in compatibility mode and
>>>>               * when doing cross vendor migration
>>>>               */
>>>> -            if (kvm_enabled()) {
>>>> +            //if (kvm_enabled()) {
>>>> +            if (0) {
>>>>                  uint32_t  ebx = 0, ecx = 0, edx = 0;
>>>>                  host_cpuid(0, 0, NULL, &ebx, &ecx, &edx);
>>>>                  x86_cpu_vendor_words2str(x86_cpu_def->vendor, ebx, edx,
>>>> ecx);
>>>>
>>>> And the information of CPU remains consistent and the VM runs OK, even
>>>> though with nested environment.
>>>>
>>>> Why should qemu set simulated cpu's vendor same as the host in KVM
>>>> environment?
>>>
>>> The reason (and a way out) is given in the comment above the cited code.
>>>
>>> Jan
>>>
>>>
>>
>>
>>
>
>

I use -cpu Opteron_G1, and got the following message in VM:
root@kvm1:~# cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 15
model : 6
model name : AMD Opteron 240 (Gen 1 Class Opteron)
stepping : 1
microcode : 0x1
cpu MHz : 2393.998
cache size : 4096 KB
fpu : yes
fpu_exception : yes
cpuid level : 5
wp : yes
flags : fpu de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat
pse36 clflush mmx fxsr sse sse2 syscall nx lm constant_tsc nopl pni
hypervisor
bogomips : 4787.99
clflush size : 64
cache_alignment : 128
address sizes : 40 bits physical, 48 bits virtual
power management:

The vendor_id is not consistent to the following messages.

Thanks,
Arthur
Jan Kiszka - May 4, 2013, 9:01 a.m.
On 2013-05-04 10:52, 李春奇 <Arthur Chunqi Li> wrote:
> On Sat, May 4, 2013 at 4:47 PM, Jan Kiszka <jan.kiszka@web.de> wrote:
>> Please don't top-post.
>>
>> On 2013-05-04 10:45, 李春奇 <Arthur Chunqi Li> wrote:
>>> But will the difference between the vendor ID and family number cause
>>> confusion to the OS in VM?
>>
>> The confusion is not yet clear to me. About which "-cpu ..." were you
>> talking?
>>
>> Jan
>>
>>>
>>> On Sat, May 4, 2013 at 4:05 PM, Jan Kiszka <jan.kiszka@web.de> wrote:
>>>> On 2013-05-04 09:50, 李春奇 <Arthur Chunqi Li> wrote:
>>>>> Hi Jan and All,
>>>>> I find that when enable KVM with qemu, vendor ID of simulated CPU will be
>>>>> set the same as host, but other features such as level, family, model,
>>>>> stepping are not changed. This may bring out a confusing result, the
>>>>> simulated CPU has a vendor name of "GenuineIntel" but with family number
>>>>> "16".
>>>>>
>>>>> I disabled the related code in function cpu_x86_find_by_name:
>>>>> diff --git a/target-i386/cpu.c b/target-i386/cpu.c
>>>>> index e2302d8..df0e82e 100644
>>>>> --- a/target-i386/cpu.c
>>>>> +++ b/target-i386/cpu.c
>>>>> @@ -1295,7 +1295,8 @@ static int cpu_x86_find_by_name(x86_def_t
>>>>> *x86_cpu_def, const char *name)
>>>>>               * KVM's sysenter/syscall emulation in compatibility mode and
>>>>>               * when doing cross vendor migration
>>>>>               */
>>>>> -            if (kvm_enabled()) {
>>>>> +            //if (kvm_enabled()) {
>>>>> +            if (0) {
>>>>>                  uint32_t  ebx = 0, ecx = 0, edx = 0;
>>>>>                  host_cpuid(0, 0, NULL, &ebx, &ecx, &edx);
>>>>>                  x86_cpu_vendor_words2str(x86_cpu_def->vendor, ebx, edx,
>>>>> ecx);
>>>>>
>>>>> And the information of CPU remains consistent and the VM runs OK, even
>>>>> though with nested environment.
>>>>>
>>>>> Why should qemu set simulated cpu's vendor same as the host in KVM
>>>>> environment?
>>>>
>>>> The reason (and a way out) is given in the comment above the cited code.
>>>>
>>>> Jan
>>>>
>>>>
>>>
>>>
>>>
>>
>>
> 
> I use -cpu Opteron_G1, and got the following message in VM:
> root@kvm1:~# cat /proc/cpuinfo
> processor : 0
> vendor_id : GenuineIntel
> cpu family : 15
> model : 6
> model name : AMD Opteron 240 (Gen 1 Class Opteron)
> stepping : 1
> microcode : 0x1
> cpu MHz : 2393.998
> cache size : 4096 KB
> fpu : yes
> fpu_exception : yes
> cpuid level : 5
> wp : yes
> flags : fpu de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat
> pse36 clflush mmx fxsr sse sse2 syscall nx lm constant_tsc nopl pni
> hypervisor
> bogomips : 4787.99
> clflush size : 64
> cache_alignment : 128
> address sizes : 40 bits physical, 48 bits virtual
> power management:
> 
> The vendor_id is not consistent to the following messages.

The reason is what the comment says: Avoid that the guest picks a
suboptimal syscall mechanism that may have to be emulated by KVM all the
time. Obviously, this causes no problems with common guests as it is
done like this since day #1.

Jan

Patch

diff --git a/target-i386/cpu.c b/target-i386/cpu.c
index e2302d8..df0e82e 100644
--- a/target-i386/cpu.c
+++ b/target-i386/cpu.c
@@ -1295,7 +1295,8 @@  static int cpu_x86_find_by_name(x86_def_t
*x86_cpu_def, const char *name)
              * KVM's sysenter/syscall emulation in compatibility mode and
              * when doing cross vendor migration
              */
-            if (kvm_enabled()) {
+            //if (kvm_enabled()) {
+            if (0) {
                 uint32_t  ebx = 0, ecx = 0, edx = 0;
                 host_cpuid(0, 0, NULL, &ebx, &ecx, &edx);