All of lore.kernel.org
 help / color / mirror / Atom feed
From: Yuan Yao <yuan.yao@linux.intel.com>
To: isaku.yamahata@intel.com
Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org,
	isaku.yamahata@gmail.com, Paolo Bonzini <pbonzini@redhat.com>,
	erdemaktas@google.com, Sean Christopherson <seanjc@google.com>,
	Sagi Shahar <sagis@google.com>
Subject: Re: [PATCH v8 033/103] KVM: x86/mmu: Track shadow MMIO value/mask on a per-VM basis
Date: Thu, 1 Sep 2022 13:54:41 +0800	[thread overview]
Message-ID: <20220901055441.nefl6qzitpbwerbs@yy-desk-7060> (raw)
In-Reply-To: <c734925961e4c0b93125c4af81e887df531305c7.1659854790.git.isaku.yamahata@intel.com>

On Sun, Aug 07, 2022 at 03:01:18PM -0700, isaku.yamahata@intel.com wrote:
> From: Sean Christopherson <sean.j.christopherson@intel.com>
>
> TDX will use a different shadow PTE entry value for MMIO from VMX.  Add
> members to kvm_arch and track value for MMIO per-VM instead of global
> variables.  By using the per-VM EPT entry value for MMIO, the existing VMX
> logic is kept working.  To untangle the logic to initialize
> shadow_mmio_access_mask, introduce a separate setter function.
>
> At the same time, disallow MMIO emulation path for protected guest because
> VMM can't parse instructions in protected guest memory.
>
> Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com>
> Signed-off-by: Isaku Yamahata <isaku.yamahata@intel.com>
> ---
>  arch/x86/include/asm/kvm_host.h |  4 +++
>  arch/x86/kvm/mmu.h              |  3 ++-
>  arch/x86/kvm/mmu/mmu.c          |  9 ++++---
>  arch/x86/kvm/mmu/spte.c         | 45 +++++++++------------------------
>  arch/x86/kvm/mmu/spte.h         | 10 +++-----
>  arch/x86/kvm/mmu/tdp_mmu.c      | 13 +++++++---
>  arch/x86/kvm/svm/svm.c          | 11 +++++---
>  arch/x86/kvm/vmx/vmx.c          | 26 +++++++++++++++++++
>  arch/x86/kvm/vmx/x86_ops.h      |  1 +
>  9 files changed, 70 insertions(+), 52 deletions(-)
>
> diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
> index 6787d5214fd8..3c4051d4512b 100644
> --- a/arch/x86/include/asm/kvm_host.h
> +++ b/arch/x86/include/asm/kvm_host.h
> @@ -1157,6 +1157,10 @@ struct kvm_arch {
>  	 */
>  	spinlock_t mmu_unsync_pages_lock;
>
> +	bool enable_mmio_caching;
> +	u64 shadow_mmio_value;
> +	u64 shadow_mmio_mask;
> +
>  	struct list_head assigned_dev_head;
>  	struct iommu_domain *iommu_domain;
>  	bool iommu_noncoherent;
> diff --git a/arch/x86/kvm/mmu.h b/arch/x86/kvm/mmu.h
> index df9f79ee07d4..dea9f2ed0177 100644
> --- a/arch/x86/kvm/mmu.h
> +++ b/arch/x86/kvm/mmu.h
> @@ -98,7 +98,8 @@ static inline u8 kvm_get_shadow_phys_bits(void)
>  	return boot_cpu_data.x86_phys_bits;
>  }
>
> -void kvm_mmu_set_mmio_spte_mask(u64 mmio_value, u64 mmio_mask, u64 access_mask);
> +void kvm_mmu_set_mmio_spte_mask(struct kvm *kvm, u64 mmio_value, u64 mmio_mask);
> +void kvm_mmu_set_mmio_access_mask(u64 mmio_access_mask);
>  void kvm_mmu_set_me_spte_mask(u64 me_value, u64 me_mask);
>  void kvm_mmu_set_ept_masks(bool has_ad_bits, bool has_exec_only);
>
> diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c
> index 216708a433e7..88fc2218fcc3 100644
> --- a/arch/x86/kvm/mmu/mmu.c
> +++ b/arch/x86/kvm/mmu/mmu.c
> @@ -2418,7 +2418,7 @@ static int mmu_page_zap_pte(struct kvm *kvm, struct kvm_mmu_page *sp,
>  				return kvm_mmu_prepare_zap_page(kvm, child,
>  								invalid_list);
>  		}
> -	} else if (is_mmio_spte(pte)) {
> +	} else if (is_mmio_spte(kvm, pte)) {
>  		mmu_spte_clear_no_track(spte);
>  	}
>  	return 0;
> @@ -3222,7 +3222,8 @@ static int handle_abnormal_pfn(struct kvm_vcpu *vcpu, struct kvm_page_fault *fau
>  		 * and only if L1's MAXPHYADDR is inaccurate with respect to
>  		 * the hardware's).
>  		 */
> -		if (unlikely(!enable_mmio_caching) ||
> +		if (unlikely(!vcpu->kvm->arch.enable_mmio_caching &&
> +			     !kvm_gfn_shared_mask(vcpu->kvm)) ||
>  		    unlikely(fault->gfn > kvm_mmu_max_gfn()))
>  			return RET_PF_EMULATE;
>  	}
> @@ -4074,7 +4075,7 @@ static int handle_mmio_page_fault(struct kvm_vcpu *vcpu, u64 addr, bool direct)
>  	if (WARN_ON(reserved))
>  		return -EINVAL;
>
> -	if (is_mmio_spte(spte)) {
> +	if (is_mmio_spte(vcpu->kvm, spte)) {
>  		gfn_t gfn = get_mmio_spte_gfn(spte);
>  		unsigned int access = get_mmio_spte_access(spte);
>
> @@ -4529,7 +4530,7 @@ static unsigned long get_cr3(struct kvm_vcpu *vcpu)
>  static bool sync_mmio_spte(struct kvm_vcpu *vcpu, u64 *sptep, gfn_t gfn,
>  			   unsigned int access)
>  {
> -	if (unlikely(is_mmio_spte(*sptep))) {
> +	if (unlikely(is_mmio_spte(vcpu->kvm, *sptep))) {
>  		if (gfn != get_mmio_spte_gfn(*sptep)) {
>  			mmu_spte_clear_no_track(sptep);
>  			return true;
> diff --git a/arch/x86/kvm/mmu/spte.c b/arch/x86/kvm/mmu/spte.c
> index 24cba35570ae..3ad16124eeeb 100644
> --- a/arch/x86/kvm/mmu/spte.c
> +++ b/arch/x86/kvm/mmu/spte.c
> @@ -29,8 +29,6 @@ u64 __read_mostly shadow_x_mask; /* mutual exclusive with nx_mask */
>  u64 __read_mostly shadow_user_mask;
>  u64 __read_mostly shadow_accessed_mask;
>  u64 __read_mostly shadow_dirty_mask;
> -u64 __read_mostly shadow_mmio_value;
> -u64 __read_mostly shadow_mmio_mask;
>  u64 __read_mostly shadow_mmio_access_mask;
>  u64 __read_mostly shadow_present_mask;
>  u64 __read_mostly shadow_memtype_mask;
> @@ -60,10 +58,10 @@ 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(!shadow_mmio_value);
> +	WARN_ON_ONCE(!vcpu->kvm->arch.shadow_mmio_value);
>
>  	access &= shadow_mmio_access_mask;
> -	spte |= shadow_mmio_value | access;
> +	spte |= vcpu->kvm->arch.shadow_mmio_value | access;
>  	spte |= gpa | shadow_nonpresent_or_rsvd_mask;
>  	spte |= (gpa & shadow_nonpresent_or_rsvd_mask)
>  		<< SHADOW_NONPRESENT_OR_RSVD_MASK_LEN;
> @@ -335,9 +333,8 @@ u64 mark_spte_for_access_track(u64 spte)
>  	return spte;
>  }
>
> -void kvm_mmu_set_mmio_spte_mask(u64 mmio_value, u64 mmio_mask, u64 access_mask)
> +void kvm_mmu_set_mmio_spte_mask(struct kvm *kvm, u64 mmio_value, u64 mmio_mask)
>  {
> -	BUG_ON((u64)(unsigned)access_mask != access_mask);
>  	WARN_ON(mmio_value & shadow_nonpresent_or_rsvd_lower_gfn_mask);
>
>  	if (!enable_mmio_caching)
> @@ -364,12 +361,9 @@ void kvm_mmu_set_mmio_spte_mask(u64 mmio_value, u64 mmio_mask, u64 access_mask)
>  	    WARN_ON(mmio_value && (REMOVED_SPTE & mmio_mask) == mmio_value))
>  		mmio_value = 0;
>
> -	if (!mmio_value)
> -		enable_mmio_caching = false;
> -
> -	shadow_mmio_value = mmio_value;
> -	shadow_mmio_mask  = mmio_mask;
> -	shadow_mmio_access_mask = access_mask;
> +	kvm->arch.enable_mmio_caching = !!mmio_value;
> +	kvm->arch.shadow_mmio_value = mmio_value;
> +	kvm->arch.shadow_mmio_mask = mmio_mask;
>  }
>  EXPORT_SYMBOL_GPL(kvm_mmu_set_mmio_spte_mask);
>
> @@ -404,20 +398,12 @@ void kvm_mmu_set_ept_masks(bool has_ad_bits, bool has_exec_only)
>  	shadow_acc_track_mask	= VMX_EPT_RWX_MASK;
>  	shadow_host_writable_mask = EPT_SPTE_HOST_WRITABLE;
>  	shadow_mmu_writable_mask  = EPT_SPTE_MMU_WRITABLE;
> -
> -	/*
> -	 * EPT Misconfigurations are generated if the value of bits 2:0
> -	 * of an EPT paging-structure entry is 110b (write/execute).
> -	 */
> -	kvm_mmu_set_mmio_spte_mask(VMX_EPT_MISCONFIG_WX_VALUE,
> -				   VMX_EPT_RWX_MASK, 0);
>  }
>  EXPORT_SYMBOL_GPL(kvm_mmu_set_ept_masks);
>
>  void kvm_mmu_reset_all_pte_masks(void)
>  {
>  	u8 low_phys_bits;
> -	u64 mask;
>
>  	shadow_phys_bits = kvm_get_shadow_phys_bits();
>
> @@ -464,18 +450,11 @@ void kvm_mmu_reset_all_pte_masks(void)
>
>  	shadow_host_writable_mask = DEFAULT_SPTE_HOST_WRITABLE;
>  	shadow_mmu_writable_mask  = DEFAULT_SPTE_MMU_WRITABLE;
> +}
>
> -	/*
> -	 * Set a reserved PA bit in MMIO SPTEs to generate page faults with
> -	 * PFEC.RSVD=1 on MMIO accesses.  64-bit PTEs (PAE, x86-64, and EPT
> -	 * paging) support a maximum of 52 bits of PA, i.e. if the CPU supports
> -	 * 52-bit physical addresses then there are no reserved PA bits in the
> -	 * PTEs and so the reserved PA approach must be disabled.
> -	 */
> -	if (shadow_phys_bits < 52)
> -		mask = BIT_ULL(51) | PT_PRESENT_MASK;
> -	else
> -		mask = 0;
> -
> -	kvm_mmu_set_mmio_spte_mask(mask, mask, ACC_WRITE_MASK | ACC_USER_MASK);
> +void kvm_mmu_set_mmio_access_mask(u64 mmio_access_mask)
> +{
> +	BUG_ON((u64)(unsigned)mmio_access_mask != mmio_access_mask);
> +	shadow_mmio_access_mask = mmio_access_mask;
>  }
> +EXPORT_SYMBOL(kvm_mmu_set_mmio_access_mask);
> diff --git a/arch/x86/kvm/mmu/spte.h b/arch/x86/kvm/mmu/spte.h
> index 30f456e59e58..824ab5490d5c 100644
> --- a/arch/x86/kvm/mmu/spte.h
> +++ b/arch/x86/kvm/mmu/spte.h
> @@ -5,8 +5,6 @@
>
>  #include "mmu_internal.h"
>
> -extern bool __read_mostly enable_mmio_caching;
> -
>  /*
>   * A MMU present SPTE is backed by actual memory and may or may not be present
>   * in hardware.  E.g. MMIO SPTEs are not considered present.  Use bit 11, as it
> @@ -156,8 +154,6 @@ extern u64 __read_mostly shadow_x_mask; /* mutual exclusive with nx_mask */
>  extern u64 __read_mostly shadow_user_mask;
>  extern u64 __read_mostly shadow_accessed_mask;
>  extern u64 __read_mostly shadow_dirty_mask;
> -extern u64 __read_mostly shadow_mmio_value;
> -extern u64 __read_mostly shadow_mmio_mask;
>  extern u64 __read_mostly shadow_mmio_access_mask;
>  extern u64 __read_mostly shadow_present_mask;
>  extern u64 __read_mostly shadow_memtype_mask;
> @@ -231,10 +227,10 @@ static inline int spte_index(u64 *sptep)
>   */
>  extern u64 __read_mostly shadow_nonpresent_or_rsvd_lower_gfn_mask;
>
> -static inline bool is_mmio_spte(u64 spte)
> +static inline bool is_mmio_spte(struct kvm *kvm, u64 spte)
>  {
> -	return (spte & shadow_mmio_mask) == shadow_mmio_value &&
> -	       likely(enable_mmio_caching);
> +	return (spte & kvm->arch.shadow_mmio_mask) == kvm->arch.shadow_mmio_value &&
> +		likely(kvm->arch.enable_mmio_caching || kvm_gfn_shared_mask(kvm));
>  }
>
>  static inline bool is_shadow_present_pte(u64 pte)
> diff --git a/arch/x86/kvm/mmu/tdp_mmu.c b/arch/x86/kvm/mmu/tdp_mmu.c
> index af510dd31ebc..8bc3a8d1803e 100644
> --- a/arch/x86/kvm/mmu/tdp_mmu.c
> +++ b/arch/x86/kvm/mmu/tdp_mmu.c
> @@ -569,8 +569,8 @@ static void __handle_changed_spte(struct kvm *kvm, int as_id, gfn_t gfn,
>  		 * impact the guest since both the former and current SPTEs
>  		 * are nonpresent.
>  		 */
> -		if (WARN_ON(!is_mmio_spte(old_spte) &&
> -			    !is_mmio_spte(new_spte) &&
> +		if (WARN_ON(!is_mmio_spte(kvm, old_spte) &&
> +			    !is_mmio_spte(kvm, new_spte) &&
>  			    !is_removed_spte(new_spte)))
>  			pr_err("Unexpected SPTE change! Nonpresent SPTEs\n"
>  			       "should not be replaced with another,\n"
> @@ -1094,7 +1094,7 @@ static int tdp_mmu_map_handle_target_level(struct kvm_vcpu *vcpu,
>  	}
>
>  	/* If a MMIO SPTE is installed, the MMIO will need to be emulated. */
> -	if (unlikely(is_mmio_spte(new_spte))) {
> +	if (unlikely(is_mmio_spte(vcpu->kvm, new_spte))) {
>  		vcpu->stat.pf_mmio_spte_created++;
>  		trace_mark_mmio_spte(rcu_dereference(iter->sptep), iter->gfn,
>  				     new_spte);
> @@ -1863,6 +1863,13 @@ int kvm_tdp_mmu_get_walk(struct kvm_vcpu *vcpu, u64 addr, u64 *sptes,
>
>  	*root_level = vcpu->arch.mmu->root_role.level;
>
> +	/*
> +	 * mmio page fault isn't supported for protected guest because
> +	 * instructions in protected guest memory can't be parsed by VMM.
> +	 */
> +	if (WARN_ON(kvm_gfn_shared_mask(vcpu->kvm)))
> +		return leaf;
> +
>  	tdp_mmu_for_each_pte(iter, mmu, gfn, gfn + 1) {
>  		leaf = iter.level;
>  		sptes[leaf] = iter.old_spte;
> diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c
> index 8aa3c95e8b6e..07829be93c93 100644
> --- a/arch/x86/kvm/svm/svm.c
> +++ b/arch/x86/kvm/svm/svm.c
> @@ -229,6 +229,7 @@ module_param(dump_invalid_vmcb, bool, 0644);
>  bool intercept_smi = true;
>  module_param(intercept_smi, bool, 0444);
>
> +static u64 __read_mostly svm_shadow_mmio_mask;
>
>  static bool svm_gp_erratum_intercept = true;
>
> @@ -4729,6 +4730,9 @@ static bool svm_is_vm_type_supported(unsigned long type)
>
>  static int svm_vm_init(struct kvm *kvm)
>  {
> +	kvm_mmu_set_mmio_spte_mask(kvm, svm_shadow_mmio_mask,
> +				   svm_shadow_mmio_mask);
> +
>  	if (!pause_filter_count || !pause_filter_thresh)
>  		kvm->arch.pause_in_guest = true;
>
> @@ -4878,7 +4882,7 @@ static struct kvm_x86_ops svm_x86_ops __initdata = {
>  static __init void svm_adjust_mmio_mask(void)
>  {
>  	unsigned int enc_bit, mask_bit;
> -	u64 msr, mask;
> +	u64 msr;
>
>  	/* If there is no memory encryption support, use existing mask */
>  	if (cpuid_eax(0x80000000) < 0x8000001f)
> @@ -4905,9 +4909,8 @@ static __init void svm_adjust_mmio_mask(void)
>  	 *
>  	 * If the mask bit location is 52 (or above), then clear the mask.
>  	 */
> -	mask = (mask_bit < 52) ? rsvd_bits(mask_bit, 51) | PT_PRESENT_MASK : 0;
> -
> -	kvm_mmu_set_mmio_spte_mask(mask, mask, PT_WRITABLE_MASK | PT_USER_MASK);
> +	svm_shadow_mmio_mask = (mask_bit < 52) ? rsvd_bits(mask_bit, 51) | PT_PRESENT_MASK : 0;
> +	kvm_mmu_set_mmio_access_mask(PT_WRITABLE_MASK | PT_USER_MASK);
>  }
>
>  static __init void svm_set_cpu_caps(void)
> diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
> index 0bce352f81b8..ec2bd4df0684 100644
> --- a/arch/x86/kvm/vmx/vmx.c
> +++ b/arch/x86/kvm/vmx/vmx.c
> @@ -141,6 +141,8 @@ module_param_named(preemption_timer, enable_preemption_timer, bool, S_IRUGO);
>  extern bool __read_mostly allow_smaller_maxphyaddr;
>  module_param(allow_smaller_maxphyaddr, bool, S_IRUGO);
>
> +u64 __ro_after_init vmx_shadow_mmio_mask;

I see only vmx.c uses it, it's possible to make it static
if no other users out of vmx.c, looks it's variable to
pass some decision made in vmx_init() to vmx_vm_init()
for per VM.

> +
>  #define KVM_VM_CR0_ALWAYS_OFF (X86_CR0_NW | X86_CR0_CD)
>  #define KVM_VM_CR0_ALWAYS_ON_UNRESTRICTED_GUEST X86_CR0_NE
>  #define KVM_VM_CR0_ALWAYS_ON				\
> @@ -7359,6 +7361,17 @@ int vmx_vm_init(struct kvm *kvm)
>  	if (!ple_gap)
>  		kvm->arch.pause_in_guest = true;
>
> +	/*
> +	 * EPT Misconfigurations can be generated if the value of bits 2:0
> +	 * of an EPT paging-structure entry is 110b (write/execute).
> +	 */
> +	if (enable_ept)
> +		kvm_mmu_set_mmio_spte_mask(kvm, VMX_EPT_MISCONFIG_WX_VALUE,
> +					   VMX_EPT_RWX_MASK);
> +	else
> +		kvm_mmu_set_mmio_spte_mask(kvm, vmx_shadow_mmio_mask,
> +					   vmx_shadow_mmio_mask);
> +
>  	if (boot_cpu_has(X86_BUG_L1TF) && enable_ept) {
>  		switch (l1tf_mitigation) {
>  		case L1TF_MITIGATION_OFF:
> @@ -8357,6 +8370,19 @@ int __init vmx_init(void)
>  	if (!enable_ept)
>  		allow_smaller_maxphyaddr = true;
>
> +	/*
> +	 * Set a reserved PA bit in MMIO SPTEs to generate page faults with
> +	 * PFEC.RSVD=1 on MMIO accesses.  64-bit PTEs (PAE, x86-64, and EPT
> +	 * paging) support a maximum of 52 bits of PA, i.e. if the CPU supports
> +	 * 52-bit physical addresses then there are no reserved PA bits in the
> +	 * PTEs and so the reserved PA approach must be disabled.
> +	 */
> +	if (kvm_get_shadow_phys_bits() < 52)
> +		vmx_shadow_mmio_mask = BIT_ULL(51) | PT_PRESENT_MASK;
> +	else
> +		vmx_shadow_mmio_mask = 0;
> +	kvm_mmu_set_mmio_access_mask(0);
> +
>  	return 0;
>  }
>
> diff --git a/arch/x86/kvm/vmx/x86_ops.h b/arch/x86/kvm/vmx/x86_ops.h
> index b4ffa1590d41..62f1d1cdd44b 100644
> --- a/arch/x86/kvm/vmx/x86_ops.h
> +++ b/arch/x86/kvm/vmx/x86_ops.h
> @@ -13,6 +13,7 @@ void hv_vp_assist_page_exit(void);
>  void __init vmx_init_early(void);
>  int __init vmx_init(void);
>  void vmx_exit(void);
> +extern u64 __ro_after_init vmx_shadow_mmio_mask;

Ditto.

>
>  __init int vmx_cpu_has_kvm_support(void);
>  __init int vmx_disabled_by_bios(void);
> --
> 2.25.1
>

  parent reply	other threads:[~2022-09-01  5:54 UTC|newest]

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

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=20220901055441.nefl6qzitpbwerbs@yy-desk-7060 \
    --to=yuan.yao@linux.intel.com \
    --cc=erdemaktas@google.com \
    --cc=isaku.yamahata@gmail.com \
    --cc=isaku.yamahata@intel.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.