Received: by 2002:a05:6359:c8b:b0:c7:702f:21d4 with SMTP id go11csp3421852rwb; Fri, 30 Sep 2022 03:26:30 -0700 (PDT) X-Google-Smtp-Source: AMsMyM5ibVdixresluWI/MyIBArzbeQgd7allCU1KYDgKSy3xEmwbvYURUGOlFltd23VLn8mxJlo X-Received: by 2002:a17:907:2672:b0:781:dc01:6c5a with SMTP id ci18-20020a170907267200b00781dc016c5amr6058615ejc.191.1664533589988; Fri, 30 Sep 2022 03:26:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1664533589; cv=none; d=google.com; s=arc-20160816; b=Fco2csutEJrBX9P/8VCq9Qhgdy395oxtUJHLaha6FQFJbIJHcehSxAqqtJPbOQA76u 20AnxVlRemaOjVH2hvgfjgCKuhl0ISWST0w2E2d7V1PN7JjqRMTXc4vhhpI4MNn8TGZl vQ+KeiedQ0TAspXxiF+6MVpyhtblkL/l2fBRD7YiPPD3h+ukkq+em7qSkOE+h6CMnd2Y /1qhNCIY/dIIImKyRbihG1K2vve3CDNMkhQ1EvYrUeApSe7BLc125KijMpsAZ1eE1HRC n1GwSDaGehG5bj/iQ1UW9LSU1qBHAb2DS2gOrIIkY1c+IrCzhmGzC+A9oE9owC8ennvd 7b9Q== 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=Qg/EXbUpZskHzacp3JFanI8OOYDXKA5bhIWFmeH6XkM=; b=GUmOP1oofyq9S36KFP82Htqe3YQJTNaDN7XK4A18yNkkKEnDa/PhOpZuS1SH368OmQ RLEiLmI/w01IJ1GmVXKxOxcyam35Q7gJqTSkTbG927f9f9Qz3tQprNmbsrWWAsGoeRPc WlxpRRZ3jU0nllZqORWf5Aa3tDpvfURURL8jXYglmlG0gEoKCtllUzhqhTbQ79EYnhic WWto2JUgvTeHN8E4k0HOxJ10oa8BBozH5FomxFHfBWbC0oXJiarR6uKPzUqTfumivGlO PRp/dqkEJ7OEhn9E2ESG+3haeC7c5+VazTAx9xi+fmHPIOe2OGZsBLPWwqZDm1zABK+5 llbw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=eA+9c+MO; 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 di19-20020a170906731300b0072b3cde0ce8si1573401ejc.471.2022.09.30.03.26.02; Fri, 30 Sep 2022 03:26:29 -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=eA+9c+MO; 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 S231375AbiI3KYT (ORCPT + 99 others); Fri, 30 Sep 2022 06:24:19 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34570 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231687AbiI3KTc (ORCPT ); Fri, 30 Sep 2022 06:19:32 -0400 Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B316C1EF60F; Fri, 30 Sep 2022 03:19:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1664533150; x=1696069150; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=b2WMrqjkDPXuRIBko4XFZYs8Te2ZXTbLGoZwNbxcH2o=; b=eA+9c+MOiGCsaRqBTev12WO3rvZ/ZTRtH/pnmPrkCDSVLIaGuUa4nW3v pztjLAGAXGcqPP3mkARxyyRwBYOxb7hYB8RGQAmVJchYU5JwSthbidvVu SeT9bLiFigZFM9ALy0Pa4Hpj3uYzuUNsPAUCXndOmcAnt4HEoIqNyVOub a8ecz8KBA0kI0Ee8QsK/FBqSHE1XmTzjfXEXA6YPREPWfEa/elhUcaAKw 8K8krQUNPkukZ7SImcJxPhdW8bGY7Ro9LCKBBZPgzLVMETJ9zaYrD/5D4 qAxPs8VyqptVSH4g8DEXna1ys6KnL2ibjG55nKTVhmF1LilrCq9+oX+tB Q==; X-IronPort-AV: E=McAfee;i="6500,9779,10485"; a="281870113" X-IronPort-AV: E=Sophos;i="5.93,358,1654585200"; d="scan'208";a="281870113" Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 30 Sep 2022 03:19:00 -0700 X-IronPort-AV: E=McAfee;i="6500,9779,10485"; a="726807670" X-IronPort-AV: E=Sophos;i="5.93,358,1654585200"; d="scan'208";a="726807670" Received: from ls.sc.intel.com (HELO localhost) ([143.183.96.54]) by fmsmga002-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 30 Sep 2022 03:19:00 -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 , Sean Christopherson Subject: [PATCH v9 052/105] KVM: TDX: Add load_mmu_pgd method for TDX Date: Fri, 30 Sep 2022 03:17:46 -0700 Message-Id: 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.5 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_PASS,SPF_NONE 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: Sean Christopherson For virtual IO, the guest TD shares guest pages with VMM without encryption. Shared EPT is used to map guest pages in unprotected way. Add the VMCS field encoding for the shared EPTP, which will be used by TDX to have separate EPT walks for private GPAs (existing EPTP) versus shared GPAs (new shared EPTP). Set shared EPT pointer value for the TDX guest to initialize TDX MMU. Signed-off-by: Sean Christopherson Signed-off-by: Isaku Yamahata Reviewed-by: Paolo Bonzini --- arch/x86/include/asm/vmx.h | 1 + arch/x86/kvm/vmx/main.c | 11 ++++++++++- arch/x86/kvm/vmx/tdx.c | 5 +++++ arch/x86/kvm/vmx/x86_ops.h | 4 ++++ 4 files changed, 20 insertions(+), 1 deletion(-) diff --git a/arch/x86/include/asm/vmx.h b/arch/x86/include/asm/vmx.h index f0f8eecf55ac..e169ace97e83 100644 --- a/arch/x86/include/asm/vmx.h +++ b/arch/x86/include/asm/vmx.h @@ -234,6 +234,7 @@ enum vmcs_field { TSC_MULTIPLIER_HIGH = 0x00002033, TERTIARY_VM_EXEC_CONTROL = 0x00002034, TERTIARY_VM_EXEC_CONTROL_HIGH = 0x00002035, + SHARED_EPT_POINTER = 0x0000203C, PID_POINTER_TABLE = 0x00002042, PID_POINTER_TABLE_HIGH = 0x00002043, GUEST_PHYSICAL_ADDRESS = 0x00002400, diff --git a/arch/x86/kvm/vmx/main.c b/arch/x86/kvm/vmx/main.c index 03fc1986227b..4d2717c64c62 100644 --- a/arch/x86/kvm/vmx/main.c +++ b/arch/x86/kvm/vmx/main.c @@ -100,6 +100,15 @@ static void vt_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event) return vmx_vcpu_reset(vcpu, init_event); } +static void vt_load_mmu_pgd(struct kvm_vcpu *vcpu, hpa_t root_hpa, + int pgd_level) +{ + if (is_td_vcpu(vcpu)) + return tdx_load_mmu_pgd(vcpu, root_hpa, pgd_level); + + vmx_load_mmu_pgd(vcpu, root_hpa, pgd_level); +} + static int vt_mem_enc_ioctl(struct kvm *kvm, void __user *argp) { if (!is_td(kvm)) @@ -219,7 +228,7 @@ struct kvm_x86_ops vt_x86_ops __initdata = { .write_tsc_offset = vmx_write_tsc_offset, .write_tsc_multiplier = vmx_write_tsc_multiplier, - .load_mmu_pgd = vmx_load_mmu_pgd, + .load_mmu_pgd = vt_load_mmu_pgd, .check_intercept = vmx_check_intercept, .handle_exit_irqoff = vmx_handle_exit_irqoff, diff --git a/arch/x86/kvm/vmx/tdx.c b/arch/x86/kvm/vmx/tdx.c index af99a46d1e75..0312172c98cb 100644 --- a/arch/x86/kvm/vmx/tdx.c +++ b/arch/x86/kvm/vmx/tdx.c @@ -384,6 +384,11 @@ void tdx_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event) vcpu->kvm->vm_bugged = true; } +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); +} + int tdx_dev_ioctl(void __user *argp) { struct kvm_tdx_capabilities __user *user_caps; diff --git a/arch/x86/kvm/vmx/x86_ops.h b/arch/x86/kvm/vmx/x86_ops.h index 37c74f325b97..d4e8fefc37d1 100644 --- a/arch/x86/kvm/vmx/x86_ops.h +++ b/arch/x86/kvm/vmx/x86_ops.h @@ -147,6 +147,8 @@ void tdx_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event); int tdx_vm_ioctl(struct kvm *kvm, void __user *argp); int tdx_vcpu_ioctl(struct kvm_vcpu *vcpu, void __user *argp); + +void tdx_load_mmu_pgd(struct kvm_vcpu *vcpu, hpa_t root_hpa, int root_level); #else static inline int tdx_hardware_setup(struct kvm_x86_ops *x86_ops) { return 0; } static inline bool tdx_is_vm_type_supported(unsigned long type) { return false; } @@ -165,6 +167,8 @@ static inline void tdx_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event) {} static inline int tdx_vm_ioctl(struct kvm *kvm, void __user *argp) { return -EOPNOTSUPP; } static inline int tdx_vcpu_ioctl(struct kvm_vcpu *vcpu, void __user *argp) { return -EOPNOTSUPP; } + +static inline void tdx_load_mmu_pgd(struct kvm_vcpu *vcpu, hpa_t root_hpa, int root_level) {} #endif #endif /* __KVM_X86_VMX_X86_OPS_H */ -- 2.25.1