Received: by 2002:a05:6a10:1a4d:0:0:0:0 with SMTP id nk13csp875645pxb; Tue, 1 Feb 2022 12:13:32 -0800 (PST) X-Google-Smtp-Source: ABdhPJzt4a/pvJii9MQtlQSWkBCMg9tC38uZt4J6wI7/j9j05aZlufGZBGEiTmJbaypAboFxQXsq X-Received: by 2002:a63:2c46:: with SMTP id s67mr19373353pgs.430.1643746411784; Tue, 01 Feb 2022 12:13:31 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643746411; cv=none; d=google.com; s=arc-20160816; b=pr4frTz65b7jF9fKoOmXTGAA3ImeA6xoIY+Pf6sSFJEsyFxkQQ3LLzzkbKCiqlWFUk 91R7lvf8mqk88TsJDerE/sr9idkY129flHMWCs1/TNRTa7U37JCVicFFHz/ZnxQfsGor 1j0OgpVZ+gOiyw1xjvbdYOm1+aCt/fG+QH5v3qWFSRxXJnmiQ9qlsEIoznuLEzpvWKm7 FgvS4IdJ/5k4duRkj/Z0MUcpkxYRBAJ7KkEhwCGDmF8mR/mmy3ozmMvQvbRzinJqcj7A Zp471xYWTjTUkcgzMEjmsSlqtMk0A4/FJQYs/LkIwbbf9xI7yePbY566sR2EaCK0R8+t i6/Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=sJbFoP+QtFkxNvlGXGE02D34alXPqAMXk3WkKtx+SYY=; b=Gnk8oxLffkiUJ2CjVipoUwhEBq/AXjs8AKROydyYkmVNy7Fzu2aqvex9X1ZZyK7mTn zuIMacMfVQ5B0GCg+klsOtyTBMhsZLql/KOhPYXktvR0nRZwd68GQomTBvZJt1FF3bOA xc7kafWod3bjSanWWTuHER/mMLykFrmyFdzzmghZ87QqDrRmHWll54a/Oeov/E58Uv8u oeP/4iojN995kVSUrmrQ1ZorKkHrnCSPDQOpUL/yPXDypB7Ig10XOd4txUYfptJjQ7Ro /ymNmK9FgMblkw/CKNeOvGqVYnlzieyN58LrkhvqNF5WcTnNCtxPe9JoBclX8NEJtTRz McGQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=fSyzHouF; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id z22si16467157pfc.304.2022.02.01.12.13.18; Tue, 01 Feb 2022 12:13:31 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=fSyzHouF; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1359775AbiAaLuw (ORCPT + 99 others); Mon, 31 Jan 2022 06:50:52 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52582 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1347966AbiAaLkU (ORCPT ); Mon, 31 Jan 2022 06:40:20 -0500 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1D0ABC02B74F; Mon, 31 Jan 2022 03:25:36 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id B2052612DE; Mon, 31 Jan 2022 11:25:35 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 73843C340E8; Mon, 31 Jan 2022 11:25:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1643628335; bh=2xzL8Ftr/S5iP2Y9dkrb08xfKDdPckbKShVNwmsT17k=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=fSyzHouFV+UG0fbYiCSmUH+Y28mSd/g4k68U1De/6U4yCButZVNNM1Z9QG2TizWbM cmXcWuh/NYmjAlNdJZP2MpThZv4UoPJMWXtP9JYjyv45GNEBLRyuMosQG/gm/r2+aQ y/BPzNzgu78XNTDl5vmveue+3Z6Jm5F9kAFBjBYc= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Vitaly Kuznetsov , Paolo Bonzini Subject: [PATCH 5.16 198/200] KVM: nVMX: Implement evmcs_field_offset() suitable for handle_vmread() Date: Mon, 31 Jan 2022 11:57:41 +0100 Message-Id: <20220131105240.190536836@linuxfoundation.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220131105233.561926043@linuxfoundation.org> References: <20220131105233.561926043@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Vitaly Kuznetsov commit 892a42c10ddb945d3a4dcf07dccdf9cb98b21548 upstream. In preparation to allowing reads from Enlightened VMCS from handle_vmread(), implement evmcs_field_offset() to get the correct read offset. get_evmcs_offset(), which is being used by KVM-on-Hyper-V, is almost what's needed but a few things need to be adjusted. First, WARN_ON() is unacceptable for handle_vmread() as any field can (in theory) be supplied by the guest and not all fields are defined in eVMCS v1. Second, we need to handle 'holes' in eVMCS (missing fields). It also sounds like a good idea to WARN_ON() if such fields are ever accessed by KVM-on-Hyper-V. Implement dedicated evmcs_field_offset() helper. No functional change intended. Signed-off-by: Vitaly Kuznetsov Message-Id: <20220112170134.1904308-5-vkuznets@redhat.com> Signed-off-by: Paolo Bonzini Signed-off-by: Greg Kroah-Hartman --- arch/x86/kvm/vmx/evmcs.c | 3 +-- arch/x86/kvm/vmx/evmcs.h | 32 ++++++++++++++++++++++++-------- 2 files changed, 25 insertions(+), 10 deletions(-) --- a/arch/x86/kvm/vmx/evmcs.c +++ b/arch/x86/kvm/vmx/evmcs.c @@ -12,8 +12,6 @@ DEFINE_STATIC_KEY_FALSE(enable_evmcs); -#if IS_ENABLED(CONFIG_HYPERV) - #define EVMCS1_OFFSET(x) offsetof(struct hv_enlightened_vmcs, x) #define EVMCS1_FIELD(number, name, clean_field)[ROL16(number, 6)] = \ {EVMCS1_OFFSET(name), clean_field} @@ -296,6 +294,7 @@ const struct evmcs_field vmcs_field_to_e }; const unsigned int nr_evmcs_1_fields = ARRAY_SIZE(vmcs_field_to_evmcs_1); +#if IS_ENABLED(CONFIG_HYPERV) __init void evmcs_sanitize_exec_ctrls(struct vmcs_config *vmcs_conf) { vmcs_conf->pin_based_exec_ctrl &= ~EVMCS1_UNSUPPORTED_PINCTRL; --- a/arch/x86/kvm/vmx/evmcs.h +++ b/arch/x86/kvm/vmx/evmcs.h @@ -63,8 +63,6 @@ DECLARE_STATIC_KEY_FALSE(enable_evmcs); #define EVMCS1_UNSUPPORTED_VMENTRY_CTRL (VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL) #define EVMCS1_UNSUPPORTED_VMFUNC (VMX_VMFUNC_EPTP_SWITCHING) -#if IS_ENABLED(CONFIG_HYPERV) - struct evmcs_field { u16 offset; u16 clean_field; @@ -73,26 +71,44 @@ struct evmcs_field { extern const struct evmcs_field vmcs_field_to_evmcs_1[]; extern const unsigned int nr_evmcs_1_fields; -static __always_inline int get_evmcs_offset(unsigned long field, - u16 *clean_field) +static __always_inline int evmcs_field_offset(unsigned long field, + u16 *clean_field) { unsigned int index = ROL16(field, 6); const struct evmcs_field *evmcs_field; - if (unlikely(index >= nr_evmcs_1_fields)) { - WARN_ONCE(1, "KVM: accessing unsupported EVMCS field %lx\n", - field); + if (unlikely(index >= nr_evmcs_1_fields)) return -ENOENT; - } evmcs_field = &vmcs_field_to_evmcs_1[index]; + /* + * Use offset=0 to detect holes in eVMCS. This offset belongs to + * 'revision_id' but this field has no encoding and is supposed to + * be accessed directly. + */ + if (unlikely(!evmcs_field->offset)) + return -ENOENT; + if (clean_field) *clean_field = evmcs_field->clean_field; return evmcs_field->offset; } +#if IS_ENABLED(CONFIG_HYPERV) + +static __always_inline int get_evmcs_offset(unsigned long field, + u16 *clean_field) +{ + int offset = evmcs_field_offset(field, clean_field); + + WARN_ONCE(offset < 0, "KVM: accessing unsupported EVMCS field %lx\n", + field); + + return offset; +} + static __always_inline void evmcs_write64(unsigned long field, u64 value) { u16 clean_field;