Received: by 2002:a05:6358:c692:b0:131:369:b2a3 with SMTP id fe18csp406473rwb; Tue, 25 Jul 2023 18:18:05 -0700 (PDT) X-Google-Smtp-Source: APBJJlEfIQfjrki3viK6O5UtHdz94Y6QQcXpJzIW18xrzOUnOaKPQ/eEXcH2Jqr/c2l2oLAVFHhY X-Received: by 2002:a05:6402:205a:b0:51d:a2d9:85a3 with SMTP id bc26-20020a056402205a00b0051da2d985a3mr899871edb.8.1690334285656; Tue, 25 Jul 2023 18:18:05 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1690334285; cv=none; d=google.com; s=arc-20160816; b=MUUl2tDBXI2Nsg3/EbMYWKgDHa6J51B31GLNW2EztMs0KOZ/W8V3FWzFHjixCk7Auu scw5xMDtY/isiIX1K7GS4kim5di6bNsAIUViAq0Hn/g5Zb3iE9vnsPK8jA7MEiChQfx2 nhHD6EW692Lfc+LExrpVdEe33Edv1DZkq/iwKg7fKav7Rk4q8G8WLZLt01eWnYtQgeVW dTHWmqvXiZ6vkjll6Kc4f+o9Zy2gJyKX0Ejflql6HpoKgG7W2Atax9KnIxfw4tGBnz69 MV3w+uF2xy+dOD3gT+W6sGZEXx/i+lIxWsub6XC6QpLkfZSPYAYc0rU8jiQq2ubeP7Pv yJYw== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=JChcYgfKNFJTJn99t7qdMSYkXVhQYjJUyJ1yOXMh5PE=; fh=E1bxw31VVcEBr76WIqXfdV5vG/YqvWMYjFMgvHDq2Zc=; b=ADr0JySDusj6akZzgyOjQQAnSd6AA5Eoo/MapQMa0LIdPJo3aoHVBAWBBoxHrZhgzd gPxuafDgitzaZLTvKLG0fSz0BetavfOBivtgIFBPV5Oo0//8tKn5eH/dA2KRamBUjJUw Uc3+TOF2VEX9t+dwKJYC+FKjkQ2qcxXUkL8PGoKGVqU5sRrqwEZ4o367Xo20Mx8dTkft gUYczq4RjAdn4o1RKIIzREIHfuzXeCU8aHUZGbAGWMuPRRr3q1i0n60tzDRXdrN4uzDg RFiXIgXIUDgNKm3AzhdZSQuwE7j8D6AFZxH3QUjxK5tQNWwyR+FB00Cncl8CWqAFe7lm msKA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=VUvzbfLa; 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 o19-20020aa7c513000000b0051e0eba60bdsi9111275edq.456.2023.07.25.18.17.36; Tue, 25 Jul 2023 18:18:05 -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=VUvzbfLa; 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 S233185AbjGYWgd (ORCPT + 99 others); Tue, 25 Jul 2023 18:36:33 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52148 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231382AbjGYWf4 (ORCPT ); Tue, 25 Jul 2023 18:35:56 -0400 Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 613C74C01; Tue, 25 Jul 2023 15:29:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1690324161; x=1721860161; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=K7BFfCHdw8kPyZSa4QNVgpKRr0D/ccALA5l4L/mQ1bU=; b=VUvzbfLahsTvONnRDFZXepCUk/VRXuT45hVBWTXi2b0DvPHPhUXAoIcH FwaRciPcu/lpQx1QaBSYB/RYLTe24kkIpP6zG8tPrtF/T5bdBXcRqWAFp RkzGn9uuPi9MoBXBYFHDa34TiGQThp8o64+z4OQXq5YxaXcY4EgijIv0C h5b7x8oOcUTVRUfghCMUGKriFs4aVS8mRAGlYq7Lazj5Gp/8b+PT21lb3 7u+LVOpQ32Pzy0cv3dNSe3+VEgUDpDNCEIddqsQblwaYR+7w15rzJadUQ KlVc63uRwiCVqqGheUBiapw9F4pxtg4N6sbtUopQS1Ue9MWDJ/HrBcB4I Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10782"; a="371467139" X-IronPort-AV: E=Sophos;i="6.01,231,1684825200"; d="scan'208";a="371467139" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jul 2023 15:24:12 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10782"; a="972855819" X-IronPort-AV: E=Sophos;i="6.01,231,1684825200"; d="scan'208";a="972855819" Received: from ls.sc.intel.com (HELO localhost) ([172.25.112.31]) by fmsmga006-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jul 2023 15:24:11 -0700 From: isaku.yamahata@intel.com To: kvm@vger.kernel.org, linux-kernel@vger.kernel.org Cc: isaku.yamahata@intel.com, isaku.yamahata@gmail.com, Paolo Bonzini , erdemaktas@google.com, Sean Christopherson , Sagi Shahar , David Matlack , Kai Huang , Zhi Wang , chen.bo@intel.com, hang.yuan@intel.com, tina.zhang@intel.com, Xiaoyao Li Subject: [RFC PATCH v4 09/16] KVM: TDX: Pass desired page level in err code for page fault handler Date: Tue, 25 Jul 2023 15:23:55 -0700 Message-Id: <51453c4f6144066d8cbccc3779b603569d435b0a.1690323516.git.isaku.yamahata@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-4.4 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED, 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: Xiaoyao Li For TDX, EPT violation can happen when TDG.MEM.PAGE.ACCEPT. And TDG.MEM.PAGE.ACCEPT contains the desired accept page level of TD guest. 1. KVM can map it with 4KB page while TD guest wants to accept 2MB page. TD geust will get TDX_PAGE_SIZE_MISMATCH and it should try to accept 4KB size. 2. KVM can map it with 2MB page while TD guest wants to accept 4KB page. KVM needs to honor it because a) there is no way to tell guest KVM maps it as 2MB size. And b) guest accepts it in 4KB size since guest knows some other 4KB page in the same 2MB range will be used as shared page. For case 2, it need to pass desired page level to MMU's page_fault_handler. Use bit 29:31 of kvm PF error code for this purpose. Signed-off-by: Xiaoyao Li Signed-off-by: Isaku Yamahata --- arch/x86/include/asm/kvm_host.h | 2 ++ arch/x86/kvm/vmx/common.h | 2 +- arch/x86/kvm/vmx/tdx.c | 7 ++++++- arch/x86/kvm/vmx/tdx.h | 19 ------------------- arch/x86/kvm/vmx/tdx_arch.h | 19 +++++++++++++++++++ arch/x86/kvm/vmx/vmx.c | 2 +- 6 files changed, 29 insertions(+), 22 deletions(-) diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index 2326e48a8fcb..97c9a0d5a9e3 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -277,6 +277,8 @@ enum x86_intercept_stage; PFERR_WRITE_MASK | \ PFERR_PRESENT_MASK) +#define PFERR_LEVEL(err_code) (((err_code) & PFERR_LEVEL_MASK) >> PFERR_LEVEL_START_BIT) + /* apic attention bits */ #define KVM_APIC_CHECK_VAPIC 0 /* diff --git a/arch/x86/kvm/vmx/common.h b/arch/x86/kvm/vmx/common.h index 90db5ca45925..5ffcd4c64053 100644 --- a/arch/x86/kvm/vmx/common.h +++ b/arch/x86/kvm/vmx/common.h @@ -91,7 +91,7 @@ static inline int __vmx_handle_ept_violation(struct kvm_vcpu *vcpu, gpa_t gpa, if (kvm_is_private_gpa(vcpu->kvm, gpa)) error_code |= PFERR_GUEST_ENC_MASK; - if (err_page_level > 0) + if (err_page_level > PG_LEVEL_NONE) error_code |= (err_page_level << PFERR_LEVEL_START_BIT) & PFERR_LEVEL_MASK; return kvm_mmu_page_fault(vcpu, gpa, error_code, NULL, 0); diff --git a/arch/x86/kvm/vmx/tdx.c b/arch/x86/kvm/vmx/tdx.c index bd1582e6b693..d6d5a9020f99 100644 --- a/arch/x86/kvm/vmx/tdx.c +++ b/arch/x86/kvm/vmx/tdx.c @@ -2596,6 +2596,7 @@ static int tdx_init_mem_region(struct kvm *kvm, struct kvm_tdx_cmd *cmd) struct kvm_tdx_init_mem_region region; struct kvm_vcpu *vcpu; struct page *page; + u64 error_code; int idx, ret = 0; bool added = false; @@ -2652,7 +2653,11 @@ static int tdx_init_mem_region(struct kvm *kvm, struct kvm_tdx_cmd *cmd) kvm_tdx->source_pa = pfn_to_hpa(page_to_pfn(page)) | (cmd->flags & KVM_TDX_MEASURE_MEMORY_REGION); - ret = kvm_mmu_map_tdp_page(vcpu, region.gpa, TDX_SEPT_PFERR, + /* TODO: large page support. */ + error_code = TDX_SEPT_PFERR; + error_code |= (PG_LEVEL_4K << PFERR_LEVEL_START_BIT) & + PFERR_LEVEL_MASK; + ret = kvm_mmu_map_tdp_page(vcpu, region.gpa, error_code, PG_LEVEL_4K); put_page(page); if (ret) diff --git a/arch/x86/kvm/vmx/tdx.h b/arch/x86/kvm/vmx/tdx.h index 117a81d69cb4..aff740a775bd 100644 --- a/arch/x86/kvm/vmx/tdx.h +++ b/arch/x86/kvm/vmx/tdx.h @@ -72,25 +72,6 @@ union tdx_exit_reason { u64 full; }; -union tdx_ext_exit_qualification { - struct { - u64 type : 4; - u64 reserved0 : 28; - u64 req_sept_level : 3; - u64 err_sept_level : 3; - u64 err_sept_state : 8; - u64 err_sept_is_leaf : 1; - u64 reserved1 : 17; - }; - u64 full; -}; - -enum tdx_ext_exit_qualification_type { - EXT_EXIT_QUAL_NONE, - EXT_EXIT_QUAL_ACCEPT, - NUM_EXT_EXIT_QUAL, -}; - struct vcpu_tdx { struct kvm_vcpu vcpu; diff --git a/arch/x86/kvm/vmx/tdx_arch.h b/arch/x86/kvm/vmx/tdx_arch.h index 8860c7571b1f..73fa33e7c943 100644 --- a/arch/x86/kvm/vmx/tdx_arch.h +++ b/arch/x86/kvm/vmx/tdx_arch.h @@ -167,4 +167,23 @@ struct td_params { #define TDX_MIN_TSC_FREQUENCY_KHZ (100 * 1000) #define TDX_MAX_TSC_FREQUENCY_KHZ (10 * 1000 * 1000) +union tdx_ext_exit_qualification { + struct { + u64 type : 4; + u64 reserved0 : 28; + u64 req_sept_level : 3; + u64 err_sept_level : 3; + u64 err_sept_state : 8; + u64 err_sept_is_leaf : 1; + u64 reserved1 : 17; + }; + u64 full; +}; + +enum tdx_ext_exit_qualification_type { + EXT_EXIT_QUAL_NONE = 0, + EXT_EXIT_QUAL_ACCEPT, + NUM_EXT_EXIT_QUAL, +}; + #endif /* __KVM_X86_TDX_ARCH_H */ diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c index ac36c3618325..3605366317a2 100644 --- a/arch/x86/kvm/vmx/vmx.c +++ b/arch/x86/kvm/vmx/vmx.c @@ -5725,7 +5725,7 @@ static int handle_ept_violation(struct kvm_vcpu *vcpu) if (unlikely(allow_smaller_maxphyaddr && kvm_vcpu_is_illegal_gpa(vcpu, gpa))) return kvm_emulate_instruction(vcpu, 0); - return __vmx_handle_ept_violation(vcpu, gpa, exit_qualification, 0); + return __vmx_handle_ept_violation(vcpu, gpa, exit_qualification, PG_LEVEL_NONE); } static int handle_ept_misconfig(struct kvm_vcpu *vcpu) -- 2.25.1