Received: by 2002:a05:6358:c692:b0:131:369:b2a3 with SMTP id fe18csp291756rwb; Tue, 25 Jul 2023 16:11:51 -0700 (PDT) X-Google-Smtp-Source: APBJJlFkTR+n+3cWUmuFBxixNjNEv/+6Kl4sK7IYBc08wO6P15eBh7Wk0DTF+RGbL4AUCfelX/1M X-Received: by 2002:a05:6a00:24d2:b0:686:254c:9d47 with SMTP id d18-20020a056a0024d200b00686254c9d47mr693325pfv.30.1690326710816; Tue, 25 Jul 2023 16:11:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1690326710; cv=none; d=google.com; s=arc-20160816; b=ZyJiYNGLOzOlHT3P+FristYYahcM/PKRdPPIHvsdiI5Gf4c/7kf2mbLPxMnsMXW84X AbhJScfxUGdOI2COKRkZX9+qY9WKJ55uOpGl+JZR6Z733i5T7cZ3MZjxYp0FupSmug0Q L4Z9MhPlmjGfJVMwdu8lFJuIDigDPgvmsJ9fJ3+ZQvR3UbvbqkebqyRLGga+wuQDP6r9 rHyJwXiJHwUqu77/3U6kunKT2v6ESOCjEwqC3nTBm5SVYBgSYG0NMnYs/NH9yS15P1qL vvaehr2HQ11aAQc1if8GcOZ2KlQyEr2/CTMQ71cKtMPC3UijMQn1XmWmWBSaAzSoSkXc CDfQ== 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=kKhRbWCOWTle9ewppYIho6rqrObztBmCofRVKGVzclw=; fh=ynyfusU2bKgmSmOOJYAdE/oKDs0SLZkPTCRdZMSf+xg=; b=kavT15dF1ivTp6q2uISKcgsWdxKT0VrjLBxTPx5+KwfWU7BXGa22fihoJDV/vmhJcB pupf4iLXFiwVVcH7uyCoZMRrKvwaD7gcGgUXteDxYolKruIvStNIDbhHW7KxLmT1t1Tn NRymDodNrvHQQy+S0RdT+hVlBDfwKXl0hJnKKxIqFcDgM6DRE2p/sR+U9ZjWII4128a/ Zwp88SJLcf3JRlikH/ShycfvUehSkTpl2dTF6ZNtv62qzO6OSTxWU2P3FFsWKUy4Ur8Q xX+D86F0mEZRfkb5ZCoA7ZYrujHVVFrxh5KKEndvyKesrjF5BBgz3P6lO8MO6nG+3zZ8 S/6w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=mcxnoOO5; 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 d6-20020a056a0010c600b006546d0d5832si12483439pfu.183.2023.07.25.16.11.38; Tue, 25 Jul 2023 16:11:50 -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=mcxnoOO5; 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 S232946AbjGYWYw (ORCPT + 99 others); Tue, 25 Jul 2023 18:24:52 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39264 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232844AbjGYWXD (ORCPT ); Tue, 25 Jul 2023 18:23:03 -0400 Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1E0445244; Tue, 25 Jul 2023 15:18:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1690323494; x=1721859494; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=6xccofk7PGEqoOCeiBTJlus7HLCsTUvyZb5exAlIw4A=; b=mcxnoOO5YiEKLaE0gkjA9uSgdIa2RJ8yJMsKLiELXx5a+E8TeAOI8qmF IfGdxKLRYIPnlHlfPYS6cCIsl3GU79VrsZgUB2mWq7DX/ELfI3DZDpzOK TprGJw2C+HJNyoil+An24PluP2WxQs2JKLmP8IiNl81CFi/nFJOOkJ/vU hvFxNn/qy1nhQVUdqdftfzwPpW/GGmIJDVDWiLBSwCs9Nzt9B1CgclKbq 1qJZ9Ia7gWluvw0PQ40OsrLqCC35TYXk3VjWhXlKPYjjSxGsDcbg1tE76 x6NCYPlsDHCHgcyrsDCPw8Fum2qza3H22z5D7VsGAu8Adk6AF4idAsYWZ A==; X-IronPort-AV: E=McAfee;i="6600,9927,10782"; a="367882685" X-IronPort-AV: E=Sophos;i="6.01,231,1684825200"; d="scan'208";a="367882685" Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jul 2023 15:16:01 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10782"; a="840001886" X-IronPort-AV: E=Sophos;i="6.01,231,1684825200"; d="scan'208";a="840001886" Received: from ls.sc.intel.com (HELO localhost) ([172.25.112.31]) by fmsmga002-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jul 2023 15:16:01 -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 , Sean Christopherson Subject: [PATCH v15 089/115] KVM: TDX: Add a place holder for handler of TDX hypercalls (TDG.VP.VMCALL) Date: Tue, 25 Jul 2023 15:14:40 -0700 Message-Id: <4b6737290264b1938f16f9de4ce7613a98de7454.1690322424.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: Isaku Yamahata The TDX module specification defines TDG.VP.VMCALL API (TDVMCALL for short) for the guest TD to call hypercall to VMM. When the guest TD issues TDG.VP.VMCALL, the guest TD exits to VMM with a new exit reason of TDVMCALL. The arguments from the guest TD and returned values from the VMM are passed in the guest registers. The guest RCX registers indicates which registers are used. Define helper functions to access those registers as ABI. Define the TDVMCALL exit reason, which is carved out from the VMX exit reason namespace as the TDVMCALL exit from TDX guest to TDX-SEAM is really just a VM-Exit. Add a place holder to handle TDVMCALL exit. Co-developed-by: Xiaoyao Li Signed-off-by: Xiaoyao Li Signed-off-by: Sean Christopherson Signed-off-by: Isaku Yamahata --- arch/x86/include/uapi/asm/vmx.h | 4 ++- arch/x86/kvm/vmx/tdx.c | 56 ++++++++++++++++++++++++++++++++- arch/x86/kvm/vmx/tdx.h | 13 ++++++++ 3 files changed, 71 insertions(+), 2 deletions(-) diff --git a/arch/x86/include/uapi/asm/vmx.h b/arch/x86/include/uapi/asm/vmx.h index b3a30ef3efdd..f0f4a4cf84a7 100644 --- a/arch/x86/include/uapi/asm/vmx.h +++ b/arch/x86/include/uapi/asm/vmx.h @@ -93,6 +93,7 @@ #define EXIT_REASON_TPAUSE 68 #define EXIT_REASON_BUS_LOCK 74 #define EXIT_REASON_NOTIFY 75 +#define EXIT_REASON_TDCALL 77 #define VMX_EXIT_REASONS \ { EXIT_REASON_EXCEPTION_NMI, "EXCEPTION_NMI" }, \ @@ -156,7 +157,8 @@ { EXIT_REASON_UMWAIT, "UMWAIT" }, \ { EXIT_REASON_TPAUSE, "TPAUSE" }, \ { EXIT_REASON_BUS_LOCK, "BUS_LOCK" }, \ - { EXIT_REASON_NOTIFY, "NOTIFY" } + { EXIT_REASON_NOTIFY, "NOTIFY" }, \ + { EXIT_REASON_TDCALL, "TDCALL" } #define VMX_EXIT_REASON_FLAGS \ { VMX_EXIT_REASONS_FAILED_VMENTRY, "FAILED_VMENTRY" } diff --git a/arch/x86/kvm/vmx/tdx.c b/arch/x86/kvm/vmx/tdx.c index e56eeb8d0ec7..0a1ccd16d17f 100644 --- a/arch/x86/kvm/vmx/tdx.c +++ b/arch/x86/kvm/vmx/tdx.c @@ -107,6 +107,41 @@ static __always_inline unsigned long tdexit_intr_info(struct kvm_vcpu *vcpu) return kvm_r9_read(vcpu); } +#define BUILD_TDVMCALL_ACCESSORS(param, gpr) \ +static __always_inline \ +unsigned long tdvmcall_##param##_read(struct kvm_vcpu *vcpu) \ +{ \ + return kvm_##gpr##_read(vcpu); \ +} \ +static __always_inline void tdvmcall_##param##_write(struct kvm_vcpu *vcpu, \ + unsigned long val) \ +{ \ + kvm_##gpr##_write(vcpu, val); \ +} +BUILD_TDVMCALL_ACCESSORS(a0, r12); +BUILD_TDVMCALL_ACCESSORS(a1, r13); +BUILD_TDVMCALL_ACCESSORS(a2, r14); +BUILD_TDVMCALL_ACCESSORS(a3, r15); + +static __always_inline unsigned long tdvmcall_exit_type(struct kvm_vcpu *vcpu) +{ + return kvm_r10_read(vcpu); +} +static __always_inline unsigned long tdvmcall_leaf(struct kvm_vcpu *vcpu) +{ + return kvm_r11_read(vcpu); +} +static __always_inline void tdvmcall_set_return_code(struct kvm_vcpu *vcpu, + long val) +{ + kvm_r10_write(vcpu, val); +} +static __always_inline void tdvmcall_set_return_val(struct kvm_vcpu *vcpu, + unsigned long val) +{ + kvm_r11_write(vcpu, val); +} + static inline bool is_td_vcpu_created(struct vcpu_tdx *tdx) { return tdx->tdvpr_pa; @@ -737,7 +772,8 @@ static noinstr void tdx_vcpu_enter_exit(struct kvm_vcpu *vcpu, struct vcpu_tdx *tdx) { guest_state_enter_irqoff(); - tdx->exit_reason.full = __tdx_vcpu_run(tdx->tdvpr_pa, vcpu->arch.regs, 0); + tdx->exit_reason.full = __tdx_vcpu_run(tdx->tdvpr_pa, vcpu->arch.regs, + tdx->tdvmcall.regs_mask); if ((u16)tdx->exit_reason.basic == EXIT_REASON_EXCEPTION_NMI && is_nmi(tdexit_intr_info(vcpu))) { kvm_before_interrupt(vcpu, KVM_HANDLING_NMI); @@ -778,6 +814,11 @@ fastpath_t tdx_vcpu_run(struct kvm_vcpu *vcpu) tdx_complete_interrupts(vcpu); + if (tdx->exit_reason.basic == EXIT_REASON_TDCALL) + tdx->tdvmcall.rcx = vcpu->arch.regs[VCPU_REGS_RCX]; + else + tdx->tdvmcall.rcx = 0; + return EXIT_FASTPATH_NONE; } @@ -848,6 +889,17 @@ static int tdx_handle_triple_fault(struct kvm_vcpu *vcpu) return 0; } +static int handle_tdvmcall(struct kvm_vcpu *vcpu) +{ + switch (tdvmcall_leaf(vcpu)) { + default: + break; + } + + tdvmcall_set_return_code(vcpu, TDG_VP_VMCALL_INVALID_OPERAND); + return 1; +} + void tdx_load_mmu_pgd(struct kvm_vcpu *vcpu, hpa_t root_hpa, int pgd_level) { td_vmcs_write64(to_tdx(vcpu), SHARED_EPT_POINTER, root_hpa & PAGE_MASK); @@ -1290,6 +1342,8 @@ int tdx_handle_exit(struct kvm_vcpu *vcpu, fastpath_t fastpath) return tdx_handle_exception(vcpu); case EXIT_REASON_EXTERNAL_INTERRUPT: return tdx_handle_external_interrupt(vcpu); + case EXIT_REASON_TDCALL: + return handle_tdvmcall(vcpu); case EXIT_REASON_EPT_VIOLATION: return tdx_handle_ept_violation(vcpu); case EXIT_REASON_EPT_MISCONFIG: diff --git a/arch/x86/kvm/vmx/tdx.h b/arch/x86/kvm/vmx/tdx.h index 45c1df7b2e40..e03f7192dfab 100644 --- a/arch/x86/kvm/vmx/tdx.h +++ b/arch/x86/kvm/vmx/tdx.h @@ -80,6 +80,19 @@ struct vcpu_tdx { struct list_head cpu_list; + union { + struct { + union { + struct { + u16 gpr_mask; + u16 xmm_mask; + }; + u32 regs_mask; + }; + u32 reserved; + }; + u64 rcx; + } tdvmcall; union tdx_exit_reason exit_reason; bool initialized; -- 2.25.1