From patchwork Tue Jul 18 13:18:37 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zeng Guang X-Patchwork-Id: 122067 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:c923:0:b0:3e4:2afc:c1 with SMTP id j3csp1788986vqt; Tue, 18 Jul 2023 07:30:41 -0700 (PDT) X-Google-Smtp-Source: APBJJlFBUMzasg2YWXb2yeGQyXF1uSnbgLcMoYSMK8EuagKbhY2iaYnqg+aRfRGDFA2n3vLlkHx6 X-Received: by 2002:a05:6512:3e21:b0:4fd:cc8c:54e5 with SMTP id i33-20020a0565123e2100b004fdcc8c54e5mr1666985lfv.41.1689690641191; Tue, 18 Jul 2023 07:30:41 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1689690641; cv=none; d=google.com; s=arc-20160816; b=u8QcBEbuQYe4I866CGqCCPFaAXG15covNC4rCnY/eZFuMgWObIXdIoKmD0C0ey5zMI 7Yn8dMD5DSzXW7Z12lrbM7yy7tPsANzRgY1wJurehQ9yqNtuQ0mx11o9HSqQX0EZ24r7 ugd4TerKOi81PBytKcz3iHVi3CO7l7VBMOFtq+KEOF0BH/LfBu4ZgzYHnk94ifGD9HAF +yXVRIDzrcPBhiZKOIvoKaczoDRCmSZRm1ugsByr76LSmHh0d8x9gf7IPS9RoTQq8yDy yPRWKksKWb0+p+7nzVe4/7ueiZjD4Zcb+tHGBumCJJRH6mc4CLD6qfY5yrrTr2HDybpd 7gBw== 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=4yYu6ud1GDlrpqgUo3UwIi+PASRIJMevjsJLsar+2VI=; fh=Anq9OfXDpkFCOPFtgh8QgUfzP993MEtJnx/ssiwHMkk=; b=Q+WyMsHJXXVCOUTe7a4j5RpuiEKWss5FeGg+m/aVXfmlTSEveZpF0S5CpJ0869IUGq oT9+WGXjij4FycTzl8Y/5Ve8K//mDNjOcwPR5wo/Z5hq7uEPOEJwd3k8eS2XpVq3N99R rKLiyOD4YuI9t6oBpFxR6jATRL35MNoEnRuwGIxpkbVBg1HGghnM7L6OX/V3TCfsX1yY eK5ul1X8nqBgBIH24qS/pUA9KolMO62YR366z4WW+QAa2i6pNugGZ8d8g0/mLp7uu4gH PQ0kv9Bj3Z8LglXKW8c/7GBpYeV2XmWYQrMyWXhg8p7Pt5RHJ8XUnHsgAiIUkrvqWI1K 7KUQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=nQcXUTsq; 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: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id v22-20020aa7d9d6000000b0051e04e2e4b7si1307524eds.168.2023.07.18.07.30.17; Tue, 18 Jul 2023 07:30:41 -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=nQcXUTsq; 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 S233097AbjGROAR (ORCPT + 99 others); Tue, 18 Jul 2023 10:00:17 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58288 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232741AbjGROAI (ORCPT ); Tue, 18 Jul 2023 10:00:08 -0400 Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CDD9A199F; Tue, 18 Jul 2023 06:59:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1689688783; x=1721224783; h=from:to:cc:subject:date:message-id:in-reply-to: references; bh=ige1qJhMK8nxK8ysQ4ntbs6E03QAU78QiBh/RtIQ02Q=; b=nQcXUTsqpzn2r3cpt/7A4QyUClkI4K/G68gBaUewzJ9/XqZGRzvbf2L+ yYNxiCGV/bUo5H+vDrIvP1nu7LDfczYqRrQHA7oSZSK9UGQIjjDVsx6xX 94zFU/emSlQxYPLOiPFUDGx7wGeHhLGkJAv46RKglaG8FJwxfdgCuXK7R pUE9+VBTWfbqJZcriGIO6+ybieQSYmVpMQQY8U83eoGqRUN3mZRyejIlT BnVfd2XjT0R84Wfdk+HZpQx2V3UM3js+F4Jku5TAfvyo1vw5loJ+AgPfk gBXsJOTHG68WovLbuMfKp9am6UGrZlBpeuzkP5mE8FivnMbtuRgEeHnRt g==; X-IronPort-AV: E=McAfee;i="6600,9927,10775"; a="363676080" X-IronPort-AV: E=Sophos;i="6.01,214,1684825200"; d="scan'208";a="363676080" Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Jul 2023 06:58:43 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10775"; a="1054291116" X-IronPort-AV: E=Sophos;i="6.01,214,1684825200"; d="scan'208";a="1054291116" Received: from arthur-vostro-3668.sh.intel.com ([10.238.200.123]) by fmsmga005-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Jul 2023 06:58:40 -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 1/8] KVM: x86: Consolidate flags for __linearize() Date: Tue, 18 Jul 2023 21:18:37 +0800 Message-Id: <20230718131844.5706-2-guang.zeng@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20230718131844.5706-1-guang.zeng@intel.com> References: <20230718131844.5706-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 X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1771769053777929882 X-GMAIL-MSGID: 1771769053777929882 From: Binbin Wu Consolidate @write and @fetch of __linearize() into a set of flags so that additional flags can be added without needing more/new boolean parameters, to precisely identify the access type. No functional change intended. Signed-off-by: Binbin Wu Reviewed-by: Chao Gao Acked-by: Kai Huang Signed-off-by: Zeng Guang --- arch/x86/kvm/emulate.c | 21 +++++++++++---------- arch/x86/kvm/kvm_emulate.h | 4 ++++ 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index 936a397a08cd..3ddfbc99fa4f 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c @@ -687,8 +687,8 @@ static unsigned insn_alignment(struct x86_emulate_ctxt *ctxt, unsigned size) static __always_inline int __linearize(struct x86_emulate_ctxt *ctxt, struct segmented_address addr, unsigned *max_size, unsigned size, - bool write, bool fetch, - enum x86emul_mode mode, ulong *linear) + enum x86emul_mode mode, ulong *linear, + unsigned int flags) { struct desc_struct desc; bool usable; @@ -717,11 +717,11 @@ static __always_inline int __linearize(struct x86_emulate_ctxt *ctxt, if (!usable) goto bad; /* code segment in protected mode or read-only data segment */ - if ((((ctxt->mode != X86EMUL_MODE_REAL) && (desc.type & 8)) - || !(desc.type & 2)) && write) + if ((((ctxt->mode != X86EMUL_MODE_REAL) && (desc.type & 8)) || !(desc.type & 2)) && + (flags & X86EMUL_F_WRITE)) goto bad; /* unreadable code segment */ - if (!fetch && (desc.type & 8) && !(desc.type & 2)) + if (!(flags & X86EMUL_F_FETCH) && (desc.type & 8) && !(desc.type & 2)) goto bad; lim = desc_limit_scaled(&desc); if (!(desc.type & 8) && (desc.type & 4)) { @@ -757,8 +757,8 @@ static int linearize(struct x86_emulate_ctxt *ctxt, ulong *linear) { unsigned max_size; - return __linearize(ctxt, addr, &max_size, size, write, false, - ctxt->mode, linear); + return __linearize(ctxt, addr, &max_size, size, ctxt->mode, linear, + write ? X86EMUL_F_WRITE : 0); } static inline int assign_eip(struct x86_emulate_ctxt *ctxt, ulong dst) @@ -771,7 +771,8 @@ 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, false, true, ctxt->mode, &linear); + rc = __linearize(ctxt, addr, &max_size, 1, ctxt->mode, &linear, + X86EMUL_F_FETCH); if (rc == X86EMUL_CONTINUE) ctxt->_eip = addr.ea; return rc; @@ -907,8 +908,8 @@ static int __do_insn_fetch_bytes(struct x86_emulate_ctxt *ctxt, int op_size) * boundary check itself. Instead, we use max_size to check * against op_size. */ - rc = __linearize(ctxt, addr, &max_size, 0, false, true, ctxt->mode, - &linear); + rc = __linearize(ctxt, addr, &max_size, 0, ctxt->mode, &linear, + X86EMUL_F_FETCH); if (unlikely(rc != X86EMUL_CONTINUE)) return rc; diff --git a/arch/x86/kvm/kvm_emulate.h b/arch/x86/kvm/kvm_emulate.h index ab65f3a47dfd..86bbe997162d 100644 --- a/arch/x86/kvm/kvm_emulate.h +++ b/arch/x86/kvm/kvm_emulate.h @@ -88,6 +88,10 @@ struct x86_instruction_info { #define X86EMUL_IO_NEEDED 5 /* IO is needed to complete emulation */ #define X86EMUL_INTERCEPTED 6 /* Intercepted by nested VMCB/VMCS */ +/* x86-specific emulation flags */ +#define X86EMUL_F_WRITE BIT(0) +#define X86EMUL_F_FETCH BIT(1) + struct x86_emulate_ops { void (*vm_bugged)(struct x86_emulate_ctxt *ctxt); /*