From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754053AbcHAPCJ (ORCPT ); Mon, 1 Aug 2016 11:02:09 -0400 Received: from mx1.redhat.com ([209.132.183.28]:41074 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752715AbcHAPB6 (ORCPT ); Mon, 1 Aug 2016 11:01:58 -0400 Subject: Re: [RFC PATCH 4/4] KVM: vmx: add support for emulating UMIP To: Wanpeng Li References: <1468351223-3250-1-git-send-email-pbonzini@redhat.com> <1468351223-3250-5-git-send-email-pbonzini@redhat.com> <20160713203006.GB16130@potion> <402de949-31fb-1733-9479-4803fce7de93@redhat.com> Cc: =?UTF-8?B?UmFkaW0gS3LEjW3DocWZ?= , "linux-kernel@vger.kernel.org" , kvm From: Paolo Bonzini Message-ID: Date: Mon, 1 Aug 2016 17:01:44 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.1.1 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Mon, 01 Aug 2016 15:01:48 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 31/07/2016 04:32, Wanpeng Li wrote: > 2016-07-14 16:09 GMT+08:00 Paolo Bonzini : > [...] >> >> 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