Messages in this thread | | | Date | Tue, 12 Mar 2024 10:59:25 +0800 | Subject | Re: [PATCH 01/16] KVM: x86/mmu: Exit to userspace with -EFAULT if private fault hits emulation | From | Binbin Wu <> |
| |
On 3/7/2024 8:52 PM, Gupta, Pankaj wrote: >> Exit to userspace with -EFAULT / KVM_EXIT_MEMORY_FAULT if a private >> fault >> triggers emulation of any kind, as KVM doesn't currently support >> emulating >> access to guest private memory. Practically speaking, private faults >> and >> emulation are already mutually exclusive, but there are edge cases upon >> edge cases where KVM can return RET_PF_EMULATE, and adding one last >> check > > edge cases upon edge cases? > > Just curious about the details of the edge cases scenarios?
Same question out of curiosity.
> >> to harden against weird, unexpected combinations is inexpensive. >> >> Suggested-by: Yan Zhao <yan.y.zhao@intel.com> >> Signed-off-by: Sean Christopherson <seanjc@google.com> >> --- >> arch/x86/kvm/mmu/mmu.c | 8 -------- >> arch/x86/kvm/mmu/mmu_internal.h | 13 +++++++++++++ >> 2 files changed, 13 insertions(+), 8 deletions(-) >> >> diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c >> index e4cc7f764980..e2fd74e06ff8 100644 >> --- a/arch/x86/kvm/mmu/mmu.c >> +++ b/arch/x86/kvm/mmu/mmu.c >> @@ -4309,14 +4309,6 @@ static inline u8 kvm_max_level_for_order(int >> order) >> return PG_LEVEL_4K; >> } >> -static void kvm_mmu_prepare_memory_fault_exit(struct kvm_vcpu *vcpu, >> - struct kvm_page_fault *fault) >> -{ >> - kvm_prepare_memory_fault_exit(vcpu, fault->gfn << PAGE_SHIFT, >> - PAGE_SIZE, fault->write, fault->exec, >> - fault->is_private); >> -} >> - >> static int kvm_faultin_pfn_private(struct kvm_vcpu *vcpu, >> struct kvm_page_fault *fault) >> { >> diff --git a/arch/x86/kvm/mmu/mmu_internal.h >> b/arch/x86/kvm/mmu/mmu_internal.h >> index 0669a8a668ca..0eea6c5a824d 100644 >> --- a/arch/x86/kvm/mmu/mmu_internal.h >> +++ b/arch/x86/kvm/mmu/mmu_internal.h >> @@ -279,6 +279,14 @@ enum { >> RET_PF_SPURIOUS, >> }; >> +static inline void kvm_mmu_prepare_memory_fault_exit(struct >> kvm_vcpu *vcpu, >> + struct kvm_page_fault *fault) >> +{ >> + kvm_prepare_memory_fault_exit(vcpu, fault->gfn << PAGE_SHIFT, >> + PAGE_SIZE, fault->write, fault->exec, >> + fault->is_private); >> +} >> + >> static inline int kvm_mmu_do_page_fault(struct kvm_vcpu *vcpu, >> gpa_t cr2_or_gpa, >> u32 err, bool prefetch, int *emulation_type) >> { >> @@ -320,6 +328,11 @@ static inline int kvm_mmu_do_page_fault(struct >> kvm_vcpu *vcpu, gpa_t cr2_or_gpa, >> else >> r = vcpu->arch.mmu->page_fault(vcpu, &fault); >> + if (r == RET_PF_EMULATE && fault.is_private) { >> + kvm_mmu_prepare_memory_fault_exit(vcpu, &fault); >> + return -EFAULT; >> + } >> + >> if (fault.write_fault_to_shadow_pgtable && emulation_type) >> *emulation_type |= EMULTYPE_WRITE_PF_TO_SP; > >
| |