[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <a627b86b-162c-ac17-37d9-28a49e3d5fab@redhat.com>
Date: Mon, 1 Aug 2016 17:01:44 +0200
From: Paolo Bonzini <pbonzini@...hat.com>
To: Wanpeng Li <kernellwp@...il.com>
Cc: Radim Krčmář <rkrcmar@...hat.com>,
"linux-kernel@...r.kernel.org" <linux-kernel@...r.kernel.org>,
kvm <kvm@...r.kernel.org>
Subject: Re: [RFC PATCH 4/4] KVM: vmx: add support for emulating UMIP
On 31/07/2016 04:32, Wanpeng Li wrote:
> 2016-07-14 16:09 GMT+08:00 Paolo Bonzini <pbonzini@...hat.com>:
> [...]
>>
>> This is not necessary because this is how KVM computes
>> CPUID[EAX=7,EBX=0].ECX:
>>
>> unsigned f_umip = kvm_x86_ops->umip_emulated() ? F(UMIP) : 0;
>> ...
>> const u32 kvm_cpuid_7_0_ecx_x86_features = F(PKU) | F(UMIP);
>> ...
>> // Mask userspace-provided value against supported features
>> entry->ecx &= kvm_cpuid_7_0_ecx_x86_features;
>> // Mask userspace-provided value against host features
>> cpuid_mask(&entry->ecx, CPUID_7_ECX);
>> // Finally add emulated features
>> entry->ecx |= f_umip;
>
> I think you mean:
>
> - entry->ecx -> userspace-provided value
> - kvm_cpuid_7_0_ecx_x86_features -> supported features
> - CPUID_7_ECX -> host features
>
> However, entry->ecx is returned by cpuid instruction
> (do_cpuid_1_ent()), so why it is a userspace-provided value?
You're right, it's this:
// Mask host processor value against supported features
entry->ecx &= kvm_cpuid_7_0_ecx_x86_features;
// Mask host processor value further, e.g. to drop
// features that the host kernel has blacklisted.
cpuid_mask(&entry->ecx, CPUID_7_ECX);
// Finally add emulated features
entry->ecx |= f_umip;
The idea is the same. :)
On the other hand, it is true that in many cases of the "switch
(function)" the call to do_cpuid_1_ent is unnecessary, and instead of
cpuid_mask you could just access boot_cpu_data.x86_capability[wordnum].
Paolo
Powered by blists - more mailing lists