diff options
| -rw-r--r-- | arch/x86/kvm/mmu.c | 4 | ||||
| -rw-r--r-- | arch/x86/kvm/svm.c | 12 | ||||
| -rw-r--r-- | arch/x86/kvm/vmx.c | 3 | ||||
| -rw-r--r-- | arch/x86/kvm/vmx.h | 2 |
4 files changed, 17 insertions, 4 deletions
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index 0bfe2bd305eb..3da2508eb22a 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c | |||
| @@ -711,6 +711,10 @@ static int kvm_age_rmapp(struct kvm *kvm, unsigned long *rmapp) | |||
| 711 | u64 *spte; | 711 | u64 *spte; |
| 712 | int young = 0; | 712 | int young = 0; |
| 713 | 713 | ||
| 714 | /* always return old for EPT */ | ||
| 715 | if (!shadow_accessed_mask) | ||
| 716 | return 0; | ||
| 717 | |||
| 714 | spte = rmap_next(kvm, rmapp, NULL); | 718 | spte = rmap_next(kvm, rmapp, NULL); |
| 715 | while (spte) { | 719 | while (spte) { |
| 716 | int _young; | 720 | int _young; |
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c index e2ee264740c7..8233b86c778c 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c | |||
| @@ -62,6 +62,7 @@ static int npt = 1; | |||
| 62 | module_param(npt, int, S_IRUGO); | 62 | module_param(npt, int, S_IRUGO); |
| 63 | 63 | ||
| 64 | static void kvm_reput_irq(struct vcpu_svm *svm); | 64 | static void kvm_reput_irq(struct vcpu_svm *svm); |
| 65 | static void svm_flush_tlb(struct kvm_vcpu *vcpu); | ||
| 65 | 66 | ||
| 66 | static inline struct vcpu_svm *to_svm(struct kvm_vcpu *vcpu) | 67 | static inline struct vcpu_svm *to_svm(struct kvm_vcpu *vcpu) |
| 67 | { | 68 | { |
| @@ -878,6 +879,10 @@ set: | |||
| 878 | static void svm_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4) | 879 | static void svm_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4) |
| 879 | { | 880 | { |
| 880 | unsigned long host_cr4_mce = read_cr4() & X86_CR4_MCE; | 881 | unsigned long host_cr4_mce = read_cr4() & X86_CR4_MCE; |
| 882 | unsigned long old_cr4 = to_svm(vcpu)->vmcb->save.cr4; | ||
| 883 | |||
| 884 | if (npt_enabled && ((old_cr4 ^ cr4) & X86_CR4_PGE)) | ||
| 885 | force_new_asid(vcpu); | ||
| 881 | 886 | ||
| 882 | vcpu->arch.cr4 = cr4; | 887 | vcpu->arch.cr4 = cr4; |
| 883 | if (!npt_enabled) | 888 | if (!npt_enabled) |
| @@ -1027,6 +1032,13 @@ static int pf_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run) | |||
| 1027 | KVMTRACE_3D(TDP_FAULT, &svm->vcpu, error_code, | 1032 | KVMTRACE_3D(TDP_FAULT, &svm->vcpu, error_code, |
| 1028 | (u32)fault_address, (u32)(fault_address >> 32), | 1033 | (u32)fault_address, (u32)(fault_address >> 32), |
| 1029 | handler); | 1034 | handler); |
| 1035 | /* | ||
| 1036 | * FIXME: Tis shouldn't be necessary here, but there is a flush | ||
| 1037 | * missing in the MMU code. Until we find this bug, flush the | ||
| 1038 | * complete TLB here on an NPF | ||
| 1039 | */ | ||
| 1040 | if (npt_enabled) | ||
| 1041 | svm_flush_tlb(&svm->vcpu); | ||
| 1030 | 1042 | ||
| 1031 | if (event_injection) | 1043 | if (event_injection) |
| 1032 | kvm_mmu_unprotect_page_virt(&svm->vcpu, fault_address); | 1044 | kvm_mmu_unprotect_page_virt(&svm->vcpu, fault_address); |
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index 2a69773e3b26..7041cc52b562 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c | |||
| @@ -3301,8 +3301,7 @@ static int __init vmx_init(void) | |||
| 3301 | kvm_mmu_set_base_ptes(VMX_EPT_READABLE_MASK | | 3301 | kvm_mmu_set_base_ptes(VMX_EPT_READABLE_MASK | |
| 3302 | VMX_EPT_WRITABLE_MASK | | 3302 | VMX_EPT_WRITABLE_MASK | |
| 3303 | VMX_EPT_DEFAULT_MT << VMX_EPT_MT_EPTE_SHIFT); | 3303 | VMX_EPT_DEFAULT_MT << VMX_EPT_MT_EPTE_SHIFT); |
| 3304 | kvm_mmu_set_mask_ptes(0ull, VMX_EPT_FAKE_ACCESSED_MASK, | 3304 | kvm_mmu_set_mask_ptes(0ull, 0ull, 0ull, 0ull, |
| 3305 | VMX_EPT_FAKE_DIRTY_MASK, 0ull, | ||
| 3306 | VMX_EPT_EXECUTABLE_MASK); | 3305 | VMX_EPT_EXECUTABLE_MASK); |
| 3307 | kvm_enable_tdp(); | 3306 | kvm_enable_tdp(); |
| 3308 | } else | 3307 | } else |
diff --git a/arch/x86/kvm/vmx.h b/arch/x86/kvm/vmx.h index 425a13436b3f..23e8373507ad 100644 --- a/arch/x86/kvm/vmx.h +++ b/arch/x86/kvm/vmx.h | |||
| @@ -370,8 +370,6 @@ enum vmcs_field { | |||
| 370 | #define VMX_EPT_READABLE_MASK 0x1ull | 370 | #define VMX_EPT_READABLE_MASK 0x1ull |
| 371 | #define VMX_EPT_WRITABLE_MASK 0x2ull | 371 | #define VMX_EPT_WRITABLE_MASK 0x2ull |
| 372 | #define VMX_EPT_EXECUTABLE_MASK 0x4ull | 372 | #define VMX_EPT_EXECUTABLE_MASK 0x4ull |
| 373 | #define VMX_EPT_FAKE_ACCESSED_MASK (1ull << 62) | ||
| 374 | #define VMX_EPT_FAKE_DIRTY_MASK (1ull << 63) | ||
| 375 | 373 | ||
| 376 | #define VMX_EPT_IDENTITY_PAGETABLE_ADDR 0xfffbc000ul | 374 | #define VMX_EPT_IDENTITY_PAGETABLE_ADDR 0xfffbc000ul |
| 377 | 375 | ||
