linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
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 <pbonzini@redhat.com>,
	erdemaktas@google.com, Sean Christopherson <seanjc@google.com>,
	Sagi Shahar <sagis@google.com>
Subject: [PATCH v9 055/105] KVM: TDX: TDP MMU TDX support
Date: Fri, 30 Sep 2022 03:17:49 -0700	[thread overview]
Message-ID: <41aa5461e9df28a45826389bb319d30c2b26560d.1664530908.git.isaku.yamahata@intel.com> (raw)
In-Reply-To: <cover.1664530907.git.isaku.yamahata@intel.com>

From: Isaku Yamahata <isaku.yamahata@intel.com>

Implement hooks of TDP MMU for TDX backend.  TLB flush, TLB shootdown,
propagating the change private EPT entry to Secure EPT and freeing Secure
EPT page. TLB flush handles both shared EPT and private EPT.  It flushes
shared EPT same as VMX.  It also waits for the TDX TLB shootdown.  For the
hook to free Secure EPT page, unlinks the Secure EPT page from the Secure
EPT so that the page can be freed to OS.

Propagate the entry change to Secure EPT.  The possible entry changes are
present -> non-present(zapping) and non-present -> present(population).  On
population just link the Secure EPT page or the private guest page to the
Secure EPT by TDX SEAMCALL. Because TDP MMU allows concurrent
zapping/population, zapping requires synchronous TLB shoot down with the
frozen EPT entry.  It zaps the secure entry, increments TLB counter, sends
IPI to remote vcpus to trigger TLB flush, and then unlinks the private
guest page from the Secure EPT. For simplicity, batched zapping with
exclude lock is handled as concurrent zapping.  Although it's inefficient,
it can be optimized in the future.

For MMIO SPTE, the spte value changes as follows.
initial value (suppress VE bit is set)
-> Guest issues MMIO and triggers EPT violation
-> KVM updates SPTE value to MMIO value (suppress VE bit is cleared)
-> Guest MMIO resumes.  It triggers VE exception in guest TD
-> Guest VE handler issues TDG.VP.VMCALL<MMIO>
-> KVM handles MMIO
-> Guest VE handler resumes its execution after MMIO instruction

Signed-off-by: Isaku Yamahata <isaku.yamahata@intel.com>
---
 arch/x86/kvm/mmu/spte.c    |   3 +-
 arch/x86/kvm/mmu/tdp_mmu.c |   4 +
 arch/x86/kvm/vmx/main.c    |  61 +++++++-
 arch/x86/kvm/vmx/tdx.c     | 289 ++++++++++++++++++++++++++++++++++++-
 arch/x86/kvm/vmx/tdx.h     |  21 +++
 arch/x86/kvm/vmx/x86_ops.h |   4 +
 6 files changed, 374 insertions(+), 8 deletions(-)

diff --git a/arch/x86/kvm/mmu/spte.c b/arch/x86/kvm/mmu/spte.c
index 8f468ee2b985..3167c12d9c74 100644
--- a/arch/x86/kvm/mmu/spte.c
+++ b/arch/x86/kvm/mmu/spte.c
@@ -74,7 +74,8 @@ u64 make_mmio_spte(struct kvm_vcpu *vcpu, u64 gfn, unsigned int access)
 	u64 spte = generation_mmio_spte_mask(gen);
 	u64 gpa = gfn << PAGE_SHIFT;
 
-	WARN_ON_ONCE(!vcpu->kvm->arch.shadow_mmio_value);
+	WARN_ON_ONCE(!vcpu->kvm->arch.shadow_mmio_value &&
+		     !kvm_gfn_shared_mask(vcpu->kvm));
 
 	access &= shadow_mmio_access_mask;
 	spte |= vcpu->kvm->arch.shadow_mmio_value | access;
diff --git a/arch/x86/kvm/mmu/tdp_mmu.c b/arch/x86/kvm/mmu/tdp_mmu.c
index cb25168dbbd5..784dcfaed505 100644
--- a/arch/x86/kvm/mmu/tdp_mmu.c
+++ b/arch/x86/kvm/mmu/tdp_mmu.c
@@ -566,6 +566,10 @@ static void handle_changed_private_spte(struct kvm *kvm, gfn_t gfn,
 	} else if (was_leaf) {
 		/* non-present -> non-present doesn't make sense. */
 		KVM_BUG_ON(!was_present, kvm);
+		/*
+		 * Zap private leaf SPTE.  Zapping private table is done
+		 * below in handle_removed_tdp_mmu_page().
+		 */
 		static_call(kvm_x86_zap_private_spte)(kvm, gfn, level);
 		static_call(kvm_x86_remove_private_spte)(kvm, gfn, level, old_pfn);
 	}
diff --git a/arch/x86/kvm/vmx/main.c b/arch/x86/kvm/vmx/main.c
index 025315e0934b..10aacde3a40a 100644
--- a/arch/x86/kvm/vmx/main.c
+++ b/arch/x86/kvm/vmx/main.c
@@ -100,6 +100,55 @@ static void vt_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event)
 	return vmx_vcpu_reset(vcpu, init_event);
 }
 
+static void vt_flush_tlb_all(struct kvm_vcpu *vcpu)
+{
+	if (is_td_vcpu(vcpu))
+		return tdx_flush_tlb(vcpu);
+
+	vmx_flush_tlb_all(vcpu);
+}
+
+static void vt_flush_tlb_current(struct kvm_vcpu *vcpu)
+{
+	if (is_td_vcpu(vcpu))
+		return tdx_flush_tlb(vcpu);
+
+	vmx_flush_tlb_current(vcpu);
+}
+
+static int vt_tlb_remote_flush(struct kvm *kvm)
+{
+	if (is_td(kvm))
+		return tdx_sept_tlb_remote_flush(kvm);
+
+	return vmx_tlb_remote_flush(kvm);
+}
+
+static int vt_tlb_remote_flush_with_range(struct kvm *kvm,
+					  struct kvm_tlb_range *range)
+{
+	if (is_td(kvm))
+		return -EOPNOTSUPP; /* fall back to tlb_remote_flush */
+
+	return vmx_tlb_remote_flush_with_range(kvm, range);
+}
+
+static void vt_flush_tlb_gva(struct kvm_vcpu *vcpu, gva_t addr)
+{
+	if (KVM_BUG_ON(is_td_vcpu(vcpu), vcpu->kvm))
+		return;
+
+	vmx_flush_tlb_gva(vcpu, addr);
+}
+
+static void vt_flush_tlb_guest(struct kvm_vcpu *vcpu)
+{
+	if (is_td_vcpu(vcpu))
+		return;
+
+	vmx_flush_tlb_guest(vcpu);
+}
+
 static void vt_load_mmu_pgd(struct kvm_vcpu *vcpu, hpa_t root_hpa,
 			int pgd_level)
 {
@@ -176,12 +225,12 @@ struct kvm_x86_ops vt_x86_ops __initdata = {
 	.set_rflags = vmx_set_rflags,
 	.get_if_flag = vmx_get_if_flag,
 
-	.flush_tlb_all = vmx_flush_tlb_all,
-	.flush_tlb_current = vmx_flush_tlb_current,
-	.tlb_remote_flush = vmx_tlb_remote_flush,
-	.tlb_remote_flush_with_range = vmx_tlb_remote_flush_with_range,
-	.flush_tlb_gva = vmx_flush_tlb_gva,
-	.flush_tlb_guest = vmx_flush_tlb_guest,
+	.flush_tlb_all = vt_flush_tlb_all,
+	.flush_tlb_current = vt_flush_tlb_current,
+	.tlb_remote_flush = vt_tlb_remote_flush,
+	.tlb_remote_flush_with_range = vt_tlb_remote_flush_with_range,
+	.flush_tlb_gva = vt_flush_tlb_gva,
+	.flush_tlb_guest = vt_flush_tlb_guest,
 
 	.vcpu_pre_run = vmx_vcpu_pre_run,
 	.vcpu_run = vmx_vcpu_run,
diff --git a/arch/x86/kvm/vmx/tdx.c b/arch/x86/kvm/vmx/tdx.c
index 0312172c98cb..e08ead40c964 100644
--- a/arch/x86/kvm/vmx/tdx.c
+++ b/arch/x86/kvm/vmx/tdx.c
@@ -6,7 +6,9 @@
 #include "capabilities.h"
 #include "x86_ops.h"
 #include "tdx.h"
+#include "vmx.h"
 #include "x86.h"
+#include "mmu.h"
 
 #undef pr_fmt
 #define pr_fmt(fmt) "tdx: " fmt
@@ -283,10 +285,28 @@ int tdx_vm_init(struct kvm *kvm)
 {
 	struct kvm_tdx *kvm_tdx = to_kvm_tdx(kvm);
 
+	/*
+	 * Because guest TD is protected, VMM can't parse the instruction in TD.
+	 * Instead, guest uses MMIO hypercall.  For unmodified device driver,
+	 * #VE needs to be injected for MMIO and #VE handler in TD converts MMIO
+	 * instruction into MMIO hypercall.
+	 *
+	 * SPTE value for MMIO needs to be setup so that #VE is injected into
+	 * TD instead of triggering EPT MISCONFIG.
+	 * - RWX=0 so that EPT violation is triggered.
+	 * - suppress #VE bit is cleared to inject #VE.
+	 */
+	kvm_mmu_set_mmio_spte_value(kvm, 0);
+
+	/* TODO: Enable 2mb and 1gb large page support. */
+	kvm->arch.tdp_max_page_level = PG_LEVEL_4K;
+
 	/* vCPUs can't be created until after KVM_TDX_INIT_VM. */
 	kvm->max_vcpus = 0;
 	kvm_tdx->hkid = -1;
 
+	spin_lock_init(&kvm_tdx->seamcall_lock);
+
 	/*
 	 * This function initializes only KVM software construct.  It doesn't
 	 * initialize TDX stuff, e.g. TDCS, TDR, TDCX, HKID etc.
@@ -389,6 +409,246 @@ 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);
 }
 
+static void tdx_unpin_pfn(struct kvm *kvm, kvm_pfn_t pfn)
+{
+	struct page *page = pfn_to_page(pfn);
+
+	put_page(page);
+}
+
+static void __tdx_sept_set_private_spte(struct kvm *kvm, gfn_t gfn,
+					enum pg_level level, kvm_pfn_t pfn)
+{
+	struct kvm_tdx *kvm_tdx = to_kvm_tdx(kvm);
+	hpa_t hpa = pfn_to_hpa(pfn);
+	gpa_t gpa = gfn_to_gpa(gfn);
+	struct tdx_module_output out;
+	u64 err;
+
+	if (WARN_ON_ONCE(is_error_noslot_pfn(pfn) ||
+			 !kvm_pfn_to_refcounted_page(pfn)))
+		return;
+
+	/* TODO: handle large pages. */
+	if (KVM_BUG_ON(level != PG_LEVEL_4K, kvm))
+		return;
+
+	/* To prevent page migration, do nothing on mmu notifier. */
+	get_page(pfn_to_page(pfn));
+
+	if (likely(is_td_finalized(kvm_tdx))) {
+		err = tdh_mem_page_aug(kvm_tdx->tdr.pa, gpa, hpa, &out);
+		if (KVM_BUG_ON(err, kvm)) {
+			pr_tdx_error(TDH_MEM_PAGE_AUG, err, &out);
+			put_page(pfn_to_page(pfn));
+		}
+		return;
+	}
+}
+
+static void tdx_sept_set_private_spte(struct kvm *kvm, gfn_t gfn,
+				      enum pg_level level, kvm_pfn_t pfn)
+{
+	struct kvm_tdx *kvm_tdx = to_kvm_tdx(kvm);
+
+	spin_lock(&kvm_tdx->seamcall_lock);
+	__tdx_sept_set_private_spte(kvm, gfn, level, pfn);
+	spin_unlock(&kvm_tdx->seamcall_lock);
+}
+
+static void tdx_sept_drop_private_spte(struct kvm *kvm, gfn_t gfn,
+				       enum pg_level level, kvm_pfn_t pfn)
+{
+	int tdx_level = pg_level_to_tdx_sept_level(level);
+	struct kvm_tdx *kvm_tdx = to_kvm_tdx(kvm);
+	gpa_t gpa = gfn_to_gpa(gfn);
+	hpa_t hpa = pfn_to_hpa(pfn);
+	hpa_t hpa_with_hkid;
+	struct tdx_module_output out;
+	u64 err = 0;
+
+	/* TODO: handle large pages. */
+	if (KVM_BUG_ON(level != PG_LEVEL_4K, kvm))
+		return;
+
+	spin_lock(&kvm_tdx->seamcall_lock);
+	if (is_hkid_assigned(kvm_tdx)) {
+		err = tdh_mem_page_remove(kvm_tdx->tdr.pa, gpa, tdx_level, &out);
+		if (KVM_BUG_ON(err, kvm)) {
+			pr_tdx_error(TDH_MEM_PAGE_REMOVE, err, &out);
+			goto unlock;
+		}
+
+		hpa_with_hkid = set_hkid_to_hpa(hpa, (u16)kvm_tdx->hkid);
+		err = tdh_phymem_page_wbinvd(hpa_with_hkid);
+		if (WARN_ON_ONCE(err)) {
+			pr_tdx_error(TDH_PHYMEM_PAGE_WBINVD, err, NULL);
+			goto unlock;
+		}
+	} else
+		/*
+		 * The HKID assigned to this TD was already freed and cache
+		 * was already flushed. We don't have to flush again.
+		 */
+		err = tdx_reclaim_page((unsigned long)__va(hpa), hpa, false, 0);
+
+unlock:
+	spin_unlock(&kvm_tdx->seamcall_lock);
+
+	if (!err)
+		tdx_unpin_pfn(kvm, pfn);
+}
+
+static int tdx_sept_link_private_spt(struct kvm *kvm, gfn_t gfn,
+				     enum pg_level level, void *private_spt)
+{
+	int tdx_level = pg_level_to_tdx_sept_level(level);
+	struct kvm_tdx *kvm_tdx = to_kvm_tdx(kvm);
+	gpa_t gpa = gfn_to_gpa(gfn);
+	hpa_t hpa = __pa(private_spt);
+	struct tdx_module_output out;
+	u64 err;
+
+	spin_lock(&kvm_tdx->seamcall_lock);
+	err = tdh_mem_sept_add(kvm_tdx->tdr.pa, gpa, tdx_level, hpa, &out);
+	spin_unlock(&kvm_tdx->seamcall_lock);
+	if (KVM_BUG_ON(err, kvm)) {
+		pr_tdx_error(TDH_MEM_SEPT_ADD, err, &out);
+		return -EIO;
+	}
+
+	return 0;
+}
+
+static void tdx_sept_zap_private_spte(struct kvm *kvm, gfn_t gfn,
+				      enum pg_level level)
+{
+	int tdx_level = pg_level_to_tdx_sept_level(level);
+	struct kvm_tdx *kvm_tdx = to_kvm_tdx(kvm);
+	gpa_t gpa = gfn_to_gpa(gfn);
+	struct tdx_module_output out;
+	u64 err;
+
+	/* For now large page isn't supported yet. */
+	WARN_ON_ONCE(level != PG_LEVEL_4K);
+	spin_lock(&kvm_tdx->seamcall_lock);
+	err = tdh_mem_range_block(kvm_tdx->tdr.pa, gpa, tdx_level, &out);
+	spin_unlock(&kvm_tdx->seamcall_lock);
+	if (KVM_BUG_ON(err, kvm))
+		pr_tdx_error(TDH_MEM_RANGE_BLOCK, err, &out);
+}
+
+/*
+ * TLB shoot down procedure:
+ * There is a global epoch counter and each vcpu has local epoch counter.
+ * - TDH.MEM.RANGE.BLOCK(TDR. level, range) on one vcpu
+ *   This blocks the subsequenct creation of TLB translation on that range.
+ *   This corresponds to clear the present bit(all RXW) in EPT entry
+ * - TDH.MEM.TRACK(TDR): advances the epoch counter which is global.
+ * - IPI to remote vcpus
+ * - TDExit and re-entry with TDH.VP.ENTER on remote vcpus
+ * - On re-entry, TDX module compares the local epoch counter with the global
+ *   epoch counter.  If the local epoch counter is older than the global epoch
+ *   counter, update the local epoch counter and flushes TLB.
+ */
+static void tdx_track(struct kvm_tdx *kvm_tdx)
+{
+	u64 err;
+
+	KVM_BUG_ON(!is_hkid_assigned(kvm_tdx), &kvm_tdx->kvm);
+	/* If TD isn't finalized, it's before any vcpu running. */
+	if (unlikely(!is_td_finalized(kvm_tdx)))
+		return;
+
+	/*
+	 * tdx_flush_tlb() waits for this function to issue TDH.MEM.TRACK() by
+	 * the counter.  The counter is used instead of bool because multiple
+	 * TDH_MEM_TRACK() can be issued concurrently by multiple vcpus.
+	 */
+	atomic_inc(&kvm_tdx->tdh_mem_track);
+	/*
+	 * KVM_REQ_TLB_FLUSH waits for the empty IPI handler, ack_flush(), with
+	 * KVM_REQUEST_WAIT.
+	 */
+	kvm_make_all_cpus_request(&kvm_tdx->kvm, KVM_REQ_TLB_FLUSH);
+
+	spin_lock(&kvm_tdx->seamcall_lock);
+	err = tdh_mem_track(kvm_tdx->tdr.pa);
+	spin_unlock(&kvm_tdx->seamcall_lock);
+
+	/* Release remote vcpu waiting for TDH.MEM.TRACK in tdx_flush_tlb(). */
+	atomic_dec(&kvm_tdx->tdh_mem_track);
+
+	if (KVM_BUG_ON(err, &kvm_tdx->kvm))
+		pr_tdx_error(TDH_MEM_TRACK, err, NULL);
+
+}
+
+static int tdx_sept_free_private_spt(struct kvm *kvm, gfn_t gfn,
+				     enum pg_level level, void *private_spt)
+{
+	struct kvm_tdx *kvm_tdx = to_kvm_tdx(kvm);
+	int ret;
+
+	/*
+	 * free_private_spt() is (obviously) called when a shadow page is being
+	 * zapped.  KVM doesn't (yet) zap private SPs while the TD is active.
+	 * Note: This function is for private shadow page.  Not for private
+	 * guest page.   private guest page can be zapped during TD is active.
+	 * shared <-> private conversion and slot move/deletion.
+	 *
+	 * TODO: large page support.  If large page is supported, S-EPT page
+	 * can be freed when promoting 4K page to 2M/1G page during TD running.
+	 * In such case, flush cache and TDH.PAGE.RECLAIM.
+	 */
+	if (KVM_BUG_ON(is_hkid_assigned(to_kvm_tdx(kvm)), kvm))
+		return -EINVAL;
+
+	/*
+	 * The HKID assigned to this TD was already freed and cache was
+	 * already flushed. We don't have to flush again.
+	 */
+	spin_lock(&kvm_tdx->seamcall_lock);
+	ret = tdx_reclaim_page((unsigned long)private_spt, __pa(private_spt), false, 0);
+	spin_unlock(&kvm_tdx->seamcall_lock);
+
+	return ret;
+}
+
+int tdx_sept_tlb_remote_flush(struct kvm *kvm)
+{
+	struct kvm_tdx *kvm_tdx;
+
+	if (!is_td(kvm))
+		return -EOPNOTSUPP;
+
+	kvm_tdx = to_kvm_tdx(kvm);
+	if (is_hkid_assigned(kvm_tdx))
+		tdx_track(kvm_tdx);
+
+	return 0;
+}
+
+static void tdx_sept_remove_private_spte(struct kvm *kvm, gfn_t gfn,
+					 enum pg_level level, kvm_pfn_t pfn)
+{
+	/*
+	 * TDX requires TLB tracking before dropping private page.  Do
+	 * it here, although it is also done later.
+	 * If hkid isn't assigned, the guest is destroying and no vcpu
+	 * runs further.  TLB shootdown isn't needed.
+	 *
+	 * TODO: implement with_range version for optimization.
+	 * kvm_flush_remote_tlbs_with_address(kvm, gfn, 1);
+	 *   => tdx_sept_tlb_remote_flush_with_range(kvm, gfn,
+	 *                                 KVM_PAGES_PER_HPAGE(level));
+	 */
+	if (is_hkid_assigned(to_kvm_tdx(kvm)))
+		kvm_flush_remote_tlbs(kvm);
+
+	tdx_sept_drop_private_spte(kvm, gfn, level, pfn);
+}
+
 int tdx_dev_ioctl(void __user *argp)
 {
 	struct kvm_tdx_capabilities __user *user_caps;
@@ -801,6 +1061,25 @@ static int tdx_td_init(struct kvm *kvm, struct kvm_tdx_cmd *cmd)
 	return ret;
 }
 
+void tdx_flush_tlb(struct kvm_vcpu *vcpu)
+{
+	struct kvm_tdx *kvm_tdx = to_kvm_tdx(vcpu->kvm);
+	struct kvm_mmu *mmu = vcpu->arch.mmu;
+	u64 root_hpa = mmu->root.hpa;
+
+	/* Flush the shared EPTP, if it's valid. */
+	if (VALID_PAGE(root_hpa))
+		ept_sync_context(construct_eptp(vcpu, root_hpa,
+						mmu->root_role.level));
+
+	/*
+	 * See tdx_track().  Wait for tlb shootdown initiater to finish
+	 * TDH_MEM_TRACK() so that TLB is flushed on the next TDENTER.
+	 */
+	while (atomic_read(&kvm_tdx->tdh_mem_track))
+		cpu_relax();
+}
+
 int tdx_vm_ioctl(struct kvm *kvm, void __user *argp)
 {
 	struct kvm_tdx_cmd tdx_cmd;
@@ -1010,8 +1289,16 @@ int __init tdx_hardware_setup(struct kvm_x86_ops *x86_ops)
 	if (!r)
 		r = tdx_module_setup();
 	vmxoff_all();
+	if (r)
+		return r;
 
-	return r;
+	x86_ops->link_private_spt = tdx_sept_link_private_spt;
+	x86_ops->free_private_spt = tdx_sept_free_private_spt;
+	x86_ops->set_private_spte = tdx_sept_set_private_spte;
+	x86_ops->remove_private_spte = tdx_sept_remove_private_spte;
+	x86_ops->zap_private_spte = tdx_sept_zap_private_spte;
+
+	return 0;
 }
 
 void tdx_hardware_unsetup(void)
diff --git a/arch/x86/kvm/vmx/tdx.h b/arch/x86/kvm/vmx/tdx.h
index 4ce236a0cab2..5f25f866291e 100644
--- a/arch/x86/kvm/vmx/tdx.h
+++ b/arch/x86/kvm/vmx/tdx.h
@@ -24,8 +24,23 @@ struct kvm_tdx {
 	int hkid;
 
 	bool finalized;
+	atomic_t tdh_mem_track;
 
 	u64 tsc_offset;
+
+	/*
+	 * Some SEAMCALLs try to lock TD resources (e.g. Secure-EPT) they use or
+	 * update.  If TDX module fails to obtain the lock, it returns
+	 * TDX_OPERAND_BUSY error without spinning.  It's VMM/OS responsibility
+	 * to retry or guarantee no contention because TDX module has the
+	 * restriction on cpu cycles it can spend and VMM/OS knows better
+	 * vcpu scheduling.
+	 *
+	 * TDP MMU uses read lock of kvm.arch.mmu_lock so TDP MMU code can be
+	 * run concurrently with multiple vCPUs.   Lock to prevent seamcalls from
+	 * running concurrently when TDP MMU is enabled.
+	 */
+	spinlock_t seamcall_lock;
 };
 
 struct vcpu_tdx {
@@ -181,6 +196,12 @@ static __always_inline u64 td_tdcs_exec_read64(struct kvm_tdx *kvm_tdx, u32 fiel
 	return out.r8;
 }
 
+static __always_inline int pg_level_to_tdx_sept_level(enum pg_level level)
+{
+	WARN_ON_ONCE(level == PG_LEVEL_NONE);
+	return level - 1;
+}
+
 #else
 struct kvm_tdx {
 	struct kvm kvm;
diff --git a/arch/x86/kvm/vmx/x86_ops.h b/arch/x86/kvm/vmx/x86_ops.h
index f3c6ab7e517f..7d6d9a6c2562 100644
--- a/arch/x86/kvm/vmx/x86_ops.h
+++ b/arch/x86/kvm/vmx/x86_ops.h
@@ -151,6 +151,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_flush_tlb(struct kvm_vcpu *vcpu);
+int tdx_sept_tlb_remote_flush(struct kvm *kvm);
 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; }
@@ -171,6 +173,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_flush_tlb(struct kvm_vcpu *vcpu) {}
+static inline int tdx_sept_tlb_remote_flush(struct kvm *kvm) { return 0; }
 static inline void tdx_load_mmu_pgd(struct kvm_vcpu *vcpu, hpa_t root_hpa, int root_level) {}
 #endif
 
-- 
2.25.1


  parent reply	other threads:[~2022-09-30 10:26 UTC|newest]

Thread overview: 111+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-09-30 10:16 [PATCH v9 000/105] KVM TDX basic feature support isaku.yamahata
2022-09-30 10:16 ` [PATCH v9 001/105] KVM: VMX: Move out vmx_x86_ops to 'main.c' to wrap VMX and TDX isaku.yamahata
2022-09-30 10:16 ` [PATCH v9 002/105] KVM: x86: Refactor KVM VMX module init/exit functions isaku.yamahata
2022-09-30 10:16 ` [PATCH v9 003/105] KVM: TDX: Add placeholders for TDX VM/vcpu structure isaku.yamahata
2022-09-30 10:16 ` [PATCH v9 004/105] x86/virt/tdx: Add a helper function to return system wide info about TDX module isaku.yamahata
2022-09-30 10:16 ` [PATCH v9 005/105] KVM: TDX: Initialize the TDX module when loading the KVM intel kernel module isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 006/105] KVM: x86: Introduce vm_type to differentiate default VMs from confidential VMs isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 007/105] KVM: TDX: Make TDX VM type supported isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 008/105] [MARKER] The start of TDX KVM patch series: TDX architectural definitions isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 009/105] KVM: TDX: Define " isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 010/105] KVM: TDX: Add TDX "architectural" error codes isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 011/105] KVM: TDX: Add C wrapper functions for SEAMCALLs to the TDX module isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 012/105] KVM: TDX: Add helper functions to print TDX SEAMCALL error isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 013/105] [MARKER] The start of TDX KVM patch series: TD VM creation/destruction isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 014/105] KVM: TDX: Stub in tdx.h with structs, accessors, and VMCS helpers isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 015/105] x86/cpu: Add helper functions to allocate/free TDX private host key id isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 016/105] KVM: TDX: create/destroy VM structure isaku.yamahata
2022-10-12 22:30   ` Sagi Shahar
2022-10-13  8:55     ` Isaku Yamahata
2022-09-30 10:17 ` [PATCH v9 017/105] KVM: TDX: Refuse to unplug the last cpu on the package isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 018/105] KVM: TDX: x86: Add ioctl to get TDX systemwide parameters isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 019/105] KVM: TDX: Add place holder for TDX VM specific mem_enc_op ioctl isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 020/105] KVM: TDX: initialize VM with TDX specific parameters isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 021/105] KVM: TDX: Make pmu_intel.c ignore guest TD case isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 022/105] [MARKER] The start of TDX KVM patch series: TD vcpu creation/destruction isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 023/105] KVM: TDX: allocate/free TDX vcpu structure isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 024/105] KVM: TDX: Do TDX specific vcpu initialization isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 025/105] KVM: TDX: Use private memory for TDX isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 026/105] [MARKER] The start of TDX KVM patch series: KVM MMU GPA shared bits isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 027/105] KVM: x86/mmu: introduce config for PRIVATE KVM MMU isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 028/105] KVM: x86/mmu: Add address conversion functions for TDX shared bit of GPA isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 029/105] [MARKER] The start of TDX KVM patch series: KVM TDP refactoring for TDX isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 030/105] KVM: x86/mmu: Replace hardcoded value 0 for the initial value for SPTE isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 031/105] KVM: x86/mmu: Make sync_page not use hard-coded 0 as the initial SPTE value isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 032/105] KVM: x86/mmu: Allow non-zero value for non-present SPTE and removed SPTE isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 033/105] KVM: x86/mmu: Add Suppress VE bit to shadow_mmio_{value, mask} isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 034/105] KVM: x86/mmu: Track shadow MMIO value on a per-VM basis isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 035/105] KVM: TDX: Enable mmio spte caching always for TDX isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 036/105] KVM: x86/mmu: Disallow fast page fault on private GPA isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 037/105] KVM: x86/mmu: Allow per-VM override of the TDP max page level isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 038/105] KVM: VMX: Introduce test mode related to EPT violation VE isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 039/105] [MARKER] The start of TDX KVM patch series: KVM TDP MMU hooks isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 040/105] KVM: x86/tdp_mmu: refactor kvm_tdp_mmu_map() isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 041/105] KVM: x86/tdp_mmu: Init role member of struct kvm_mmu_page at allocation isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 042/105] KVM: x86/mmu: Require TDP MMU for TDX isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 043/105] KVM: x86/mmu: Add a new is_private member for union kvm_mmu_page_role isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 044/105] KVM: x86/mmu: Add a private pointer to struct kvm_mmu_page isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 045/105] KVM: x86/tdp_mmu: Don't zap private pages for unsupported cases isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 046/105] KVM: x86/tdp_mmu: Support TDX private mapping for TDP MMU isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 047/105] [MARKER] The start of TDX KVM patch series: TDX EPT violation isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 048/105] KVM: x86/mmu: Disallow dirty logging for x86 TDX isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 049/105] KVM: x86/tdp_mmu: Ignore unsupported mmu operation on private GFNs isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 050/105] KVM: VMX: Split out guts of EPT violation to common/exposed function isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 051/105] KVM: VMX: Move setting of EPT MMU masks to common VT-x code isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 052/105] KVM: TDX: Add load_mmu_pgd method for TDX isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 053/105] KVM: TDX: don't request KVM_REQ_APIC_PAGE_RELOAD isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 054/105] KVM: x86/VMX: introduce vmx tlb_remote_flush and tlb_remote_flush_with_range isaku.yamahata
2022-09-30 10:17 ` isaku.yamahata [this message]
2022-09-30 10:17 ` [PATCH v9 056/105] [MARKER] The start of TDX KVM patch series: KVM TDP MMU MapGPA isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 057/105] KVM: Add functions to set GFN to private or shared isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 058/105] KVM: x86/mmu: Introduce kvm_mmu_map_tdp_page() for use by TDX isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 059/105] KVM: x86/tdp_mmu: implement MapGPA hypercall for TDX isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 060/105] [MARKER] The start of TDX KVM patch series: TD finalization isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 061/105] KVM: TDX: Create initial guest memory isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 062/105] KVM: TDX: Finalize VM initialization isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 063/105] [MARKER] The start of TDX KVM patch series: TD vcpu enter/exit isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 064/105] KVM: TDX: Add helper assembly function to TDX vcpu isaku.yamahata
2022-09-30 10:17 ` [PATCH v9 065/105] KVM: TDX: Implement TDX vcpu enter/exit path isaku.yamahata
2022-09-30 10:18 ` [PATCH v9 066/105] KVM: TDX: vcpu_run: save/restore host state(host kernel gs) isaku.yamahata
2022-09-30 10:18 ` [PATCH v9 067/105] KVM: TDX: restore host xsave state when exit from the guest TD isaku.yamahata
2022-09-30 10:18 ` [PATCH v9 068/105] KVM: x86: Allow to update cached values in kvm_user_return_msrs w/o wrmsr isaku.yamahata
2022-09-30 10:18 ` [PATCH v9 069/105] KVM: TDX: restore user ret MSRs isaku.yamahata
2022-09-30 10:18 ` [PATCH v9 070/105] [MARKER] The start of TDX KVM patch series: TD vcpu exits/interrupts/hypercalls isaku.yamahata
2022-09-30 10:18 ` [PATCH v9 071/105] KVM: TDX: complete interrupts after tdexit isaku.yamahata
2022-09-30 10:18 ` [PATCH v9 072/105] KVM: TDX: restore debug store when TD exit isaku.yamahata
2022-09-30 10:18 ` [PATCH v9 073/105] KVM: TDX: handle vcpu migration over logical processor isaku.yamahata
2022-09-30 10:18 ` [PATCH v9 074/105] KVM: x86: Add a switch_db_regs flag to handle TDX's auto-switched behavior isaku.yamahata
2022-09-30 10:18 ` [PATCH v9 075/105] KVM: TDX: Add support for find pending IRQ in a protected local APIC isaku.yamahata
2022-09-30 10:18 ` [PATCH v9 076/105] KVM: x86: Assume timer IRQ was injected if APIC state is proteced isaku.yamahata
2022-09-30 10:18 ` [PATCH v9 077/105] KVM: TDX: remove use of struct vcpu_vmx from posted_interrupt.c isaku.yamahata
2022-09-30 10:18 ` [PATCH v9 078/105] KVM: TDX: Implement interrupt injection isaku.yamahata
2022-09-30 10:18 ` [PATCH v9 079/105] KVM: TDX: Implements vcpu request_immediate_exit isaku.yamahata
2022-09-30 10:18 ` [PATCH v9 080/105] KVM: TDX: Implement methods to inject NMI isaku.yamahata
2022-09-30 10:18 ` [PATCH v9 081/105] KVM: VMX: Modify NMI and INTR handlers to take intr_info as function argument isaku.yamahata
2022-09-30 10:18 ` [PATCH v9 082/105] KVM: VMX: Move NMI/exception handler to common helper isaku.yamahata
2022-09-30 10:18 ` [PATCH v9 083/105] KVM: x86: Split core of hypercall emulation to helper function isaku.yamahata
2022-09-30 10:18 ` [PATCH v9 084/105] KVM: TDX: Add a place holder to handle TDX VM exit isaku.yamahata
2022-09-30 10:18 ` [PATCH v9 085/105] KVM: TDX: Retry seamcall when TDX_OPERAND_BUSY with operand SEPT isaku.yamahata
2022-09-30 10:18 ` [PATCH v9 086/105] KVM: TDX: handle EXIT_REASON_OTHER_SMI isaku.yamahata
2022-09-30 10:18 ` [PATCH v9 087/105] KVM: TDX: handle ept violation/misconfig exit isaku.yamahata
2022-09-30 10:18 ` [PATCH v9 088/105] KVM: TDX: handle EXCEPTION_NMI and EXTERNAL_INTERRUPT isaku.yamahata
2022-09-30 10:18 ` [PATCH v9 089/105] KVM: TDX: Add a place holder for handler of TDX hypercalls (TDG.VP.VMCALL) isaku.yamahata
2022-09-30 10:18 ` [PATCH v9 090/105] KVM: TDX: handle KVM hypercall with TDG.VP.VMCALL isaku.yamahata
2022-09-30 10:18 ` [PATCH v9 091/105] KVM: TDX: Handle TDX PV CPUID hypercall isaku.yamahata
2022-09-30 10:18 ` [PATCH v9 092/105] KVM: TDX: Handle TDX PV HLT hypercall isaku.yamahata
2022-09-30 10:18 ` [PATCH v9 093/105] KVM: TDX: Handle TDX PV port io hypercall isaku.yamahata
2022-09-30 10:18 ` [PATCH v9 094/105] KVM: TDX: Handle TDX PV MMIO hypercall isaku.yamahata
2022-09-30 10:18 ` [PATCH v9 095/105] KVM: TDX: Implement callbacks for MSR operations for TDX isaku.yamahata
2022-09-30 10:18 ` [PATCH v9 096/105] KVM: TDX: Handle TDX PV rdmsr/wrmsr hypercall isaku.yamahata
2022-09-30 10:18 ` [PATCH v9 097/105] KVM: TDX: Handle TDX PV report fatal error hypercall isaku.yamahata
2022-09-30 10:18 ` [PATCH v9 098/105] KVM: TDX: Handle TDX PV map_gpa hypercall isaku.yamahata
2022-09-30 10:18 ` [PATCH v9 099/105] KVM: TDX: Handle TDG.VP.VMCALL<GetTdVmCallInfo> hypercall isaku.yamahata
2022-09-30 10:18 ` [PATCH v9 100/105] KVM: TDX: Silently discard SMI request isaku.yamahata
2022-09-30 10:18 ` [PATCH v9 101/105] KVM: TDX: Silently ignore INIT/SIPI isaku.yamahata
2022-09-30 10:18 ` [PATCH v9 102/105] KVM: TDX: Add methods to ignore accesses to CPU state isaku.yamahata
2022-09-30 10:18 ` [PATCH v9 103/105] Documentation/virt/kvm: Document on Trust Domain Extensions(TDX) isaku.yamahata
2022-09-30 10:18 ` [PATCH v9 104/105] KVM: x86: design documentation on TDX support of x86 KVM TDP MMU isaku.yamahata
2022-09-30 10:18 ` [PATCH v9 105/105] [MARKER] the end of (the first phase of) TDX KVM patch series isaku.yamahata
2022-10-01  8:30 ` [PATCH v9 000/105] KVM TDX basic feature support Bagas Sanjaya
2022-10-03 18:29   ` Isaku Yamahata
2022-10-03 20:08     ` Huang, Kai

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=41aa5461e9df28a45826389bb319d30c2b26560d.1664530908.git.isaku.yamahata@intel.com \
    --to=isaku.yamahata@intel.com \
    --cc=erdemaktas@google.com \
    --cc=isaku.yamahata@gmail.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=pbonzini@redhat.com \
    --cc=sagis@google.com \
    --cc=seanjc@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).