diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index c9b6e33..3e32f9b 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c @@ -1200,7 +1200,7 @@ void kvm_mmu_write_protect_pt_masked(struct kvm *kvm, } } -static bool rmap_write_protect(struct kvm *kvm, u64 gfn) +bool rmap_write_protect(struct kvm *kvm, u64 gfn) { struct kvm_memory_slot *slot; unsigned long *rmapp; @@ -3296,6 +3296,8 @@ static bool try_async_pf(struct kvm_vcpu *vcpu, bool prefault, gfn_t gfn, return false; } +gfn_t filter_gfn; + static int tdp_page_fault(struct kvm_vcpu *vcpu, gva_t gpa, u32 error_code, bool prefault) { @@ -3311,6 +3313,11 @@ static int tdp_page_fault(struct kvm_vcpu *vcpu, gva_t gpa, u32 error_code, ASSERT(vcpu); ASSERT(VALID_PAGE(vcpu->arch.mmu.root_hpa)); + if (filter_gfn && (filter_gfn == gpa_to_gfn(gpa))) { + printk("Catch gfn %llx.\n", filter_gfn); + return 1; + } + if (unlikely(error_code & PFERR_RSVD_MASK)) return handle_mmio_page_fault(vcpu, gpa, error_code, true); diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index d44edaa..d3e266c 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -1759,6 +1759,24 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 data) return 1; vcpu->arch.osvw.status = data; break; + case 0x99999999: { + extern bool rmap_write_protect(struct kvm *kvm, u64 gfn); + extern gfn_t filter_gfn; + + gpa_t gpa = kvm_mmu_gva_to_gpa_write(vcpu, data, NULL); + if (gpa == UNMAPPED_GVA) { + printk("unmapped gva:%llx.\n", data); + } + + printk("GVA %llx -> GPA:%llx.\n", data, gpa); + filter_gfn = gpa_to_gfn(gpa); + spin_lock(&vcpu->kvm->mmu_lock); + if (rmap_write_protect(vcpu->kvm, filter_gfn)) + kvm_flush_remote_tlbs(vcpu->kvm); + spin_unlock(&vcpu->kvm->mmu_lock); + } + break; + default: if (msr && (msr == vcpu->kvm->arch.xen_hvm_config.msr)) return xen_hvm_config(vcpu, data);