Received: by 2002:a05:6358:7058:b0:131:369:b2a3 with SMTP id 24csp7687407rwp; Tue, 18 Jul 2023 21:18:09 -0700 (PDT) X-Google-Smtp-Source: APBJJlER9ezYDk4FuA0k3rwTO5NBBjSwVBo8btubjs0LmmkGtjUxcikYaG88hYkWFSU/KbGcyP4F X-Received: by 2002:a17:907:16a1:b0:992:a9ba:b8da with SMTP id hc33-20020a17090716a100b00992a9bab8damr1622765ejc.70.1689740289250; Tue, 18 Jul 2023 21:18:09 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1689740289; cv=none; d=google.com; s=arc-20160816; b=cdnSMZqb8ntzNHixpmU2F73vPZDgCDaijgsMHvmGO1dCdrP+mGP35yM4cainTS2cTo 0awqPq30EqBqk4weS+u85M5xfF13oZPP3tRNIhBILFpuwmrdRV6uxWZxKjIo5dTvk5Lf uI8lGOYkRuSu3a63O2HBdCdOqK9v/O75RaY9yF1sPopOGR5JpMjDH/Opl+Xw4MgbwW8r G8c0hgdeUY81x5JImwyZ3hYsTiZ5LLuHCEUvMakngoYnUVSOZ0rzalvdnYQXXRPPqbYI ErzaIScS9MqOU2DadjvQNCYfY7bnnQCycuCNiDzPKbGigJvgEXi/hCUwF2AdurSiyyxE uU5g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:references:in-reply-to:message-id:date:subject :cc:to:from:dkim-signature; bh=WXJ/AVtRi56tetzs9XfjudmzaPIWtzer/dctqDPJwqI=; fh=Anq9OfXDpkFCOPFtgh8QgUfzP993MEtJnx/ssiwHMkk=; b=st+3V6UPxMFDhcfNO5le90loVDE+L52SzOILriuyw93/8fXA541+OtOcqn6eRTvQvG QtXCLNtUa61inRKBGBk9Ri++7PgcBrvpZb2DWlxdFTThL7rnjA0iHrdVRSZJruiMFaD2 VguozmfrvfTegsCGcdo2WX5U4vEGm2p2GcCoVmyajWB1knS5xwtOtUKgXDFI9af3zKGK NhHtOVrilirrEbBXDSrgN8SjMt1pkPX5xc69wn2PHCwpB2hQL2f9828fbk30IcugweNB rixQsM5tY87unaZJOJVjIJJTdO17jLH0XiKxoMCHA5Ns0tEFBrrOPwKh4mOYeMJQYh7G tgbQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=dDido+62; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id u13-20020a170906408d00b009769ff4d234si2317101ejj.58.2023.07.18.21.17.44; Tue, 18 Jul 2023 21:18:09 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=dDido+62; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230450AbjGSD0B (ORCPT + 99 others); Tue, 18 Jul 2023 23:26:01 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48362 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230396AbjGSDZu (ORCPT ); Tue, 18 Jul 2023 23:25:50 -0400 Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 918E21BF0; Tue, 18 Jul 2023 20:25:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1689737149; x=1721273149; h=from:to:cc:subject:date:message-id:in-reply-to: references; bh=G5f5OxUaGuqF1xaVh2Um4pSh/J282MGxjVg91bM/270=; b=dDido+62IrzZOJPCuyABi54awAWmQjTzmLNWV7i3wxLqW/4/LBz88o9J QtXSC5eI4V8QeOIX+fJV+jNAbcvS2XL+HgUe1wkWwzic6KpUWGo7M7bJF 5fGVny4lIfPgpblTV9V8SJXovb/P78pHObyZ6/Y4fErTWJ+XT6vQ8T6ue DNVAG8Liy8DEPhN8vxHANEVuruaBl0QjwFP3EI2ZhcNzBbYOsioaikBgH j0YaQrVFGHJOEPQO+fmSbmVn1kasuTY0/U18WlR8CYtTKpina+noGrDsg 9snIwHaArmlGSXHHyoEctjmstbVLLyuGom5Yv/d4K4Wla85w7QgIb0lAB A==; X-IronPort-AV: E=McAfee;i="6600,9927,10775"; a="346665798" X-IronPort-AV: E=Sophos;i="6.01,215,1684825200"; d="scan'208";a="346665798" Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Jul 2023 20:25:49 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10775"; a="813980262" X-IronPort-AV: E=Sophos;i="6.01,215,1684825200"; d="scan'208";a="813980262" Received: from arthur-vostro-3668.sh.intel.com ([10.238.200.123]) by fmsmga003-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Jul 2023 20:25:46 -0700 From: Zeng Guang To: Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , H Peter Anvin , kvm@vger.kernel.org Cc: x86@kernel.org, linux-kernel@vger.kernel.org, Binbin Wu , Zeng Guang Subject: [PATCH v2 2/8] KVM: x86: Use a new flag for branch instructions Date: Wed, 19 Jul 2023 10:45:52 +0800 Message-Id: <20230719024558.8539-3-guang.zeng@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20230719024558.8539-1-guang.zeng@intel.com> References: <20230719024558.8539-1-guang.zeng@intel.com> X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF, RCVD_IN_DNSWL_BLOCKED,SPF_HELO_NONE,SPF_NONE,T_SCC_BODY_TEXT_LINE, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Binbin Wu Use the new flag X86EMUL_F_BRANCH instead of X86EMUL_F_FETCH in assign_eip(), since strictly speaking it is not behavior of instruction fetch. Another reason is to distinguish instruction fetch and execution of branch instruction for feature(s) that handle differently on them. Branch instruction is not data access instruction, so skip checking against execute-only code segment as instruction fetch. Signed-off-by: Binbin Wu Signed-off-by: Zeng Guang --- arch/x86/kvm/emulate.c | 5 +++-- arch/x86/kvm/kvm_emulate.h | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index 3ddfbc99fa4f..8e706d19ae45 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c @@ -721,7 +721,8 @@ static __always_inline int __linearize(struct x86_emulate_ctxt *ctxt, (flags & X86EMUL_F_WRITE)) goto bad; /* unreadable code segment */ - if (!(flags & X86EMUL_F_FETCH) && (desc.type & 8) && !(desc.type & 2)) + if (!(flags & (X86EMUL_F_FETCH | X86EMUL_F_BRANCH)) + && (desc.type & 8) && !(desc.type & 2)) goto bad; lim = desc_limit_scaled(&desc); if (!(desc.type & 8) && (desc.type & 4)) { @@ -772,7 +773,7 @@ static inline int assign_eip(struct x86_emulate_ctxt *ctxt, ulong dst) if (ctxt->op_bytes != sizeof(unsigned long)) addr.ea = dst & ((1UL << (ctxt->op_bytes << 3)) - 1); rc = __linearize(ctxt, addr, &max_size, 1, ctxt->mode, &linear, - X86EMUL_F_FETCH); + X86EMUL_F_BRANCH); if (rc == X86EMUL_CONTINUE) ctxt->_eip = addr.ea; return rc; diff --git a/arch/x86/kvm/kvm_emulate.h b/arch/x86/kvm/kvm_emulate.h index 86bbe997162d..9fc7d34a4ac1 100644 --- a/arch/x86/kvm/kvm_emulate.h +++ b/arch/x86/kvm/kvm_emulate.h @@ -91,6 +91,7 @@ struct x86_instruction_info { /* x86-specific emulation flags */ #define X86EMUL_F_WRITE BIT(0) #define X86EMUL_F_FETCH BIT(1) +#define X86EMUL_F_BRANCH BIT(2) struct x86_emulate_ops { void (*vm_bugged)(struct x86_emulate_ctxt *ctxt); -- 2.27.0