OSDN Git Service

kvm: x86: Introduce KVM_REQ_LOAD_CR3
authorJunaid Shahid <junaids@google.com>
Wed, 27 Jun 2018 21:59:08 +0000 (14:59 -0700)
committerPaolo Bonzini <pbonzini@redhat.com>
Mon, 6 Aug 2018 15:58:52 +0000 (17:58 +0200)
The KVM_REQ_LOAD_CR3 request loads the hardware CR3 using the
current root_hpa.

Signed-off-by: Junaid Shahid <junaids@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/include/asm/kvm_host.h
arch/x86/kvm/mmu.c
arch/x86/kvm/mmu.h
arch/x86/kvm/x86.c

index 290b7d0..c2b4df8 100644 (file)
@@ -54,6 +54,7 @@
 #define KVM_REQ_TRIPLE_FAULT           KVM_ARCH_REQ(2)
 #define KVM_REQ_MMU_SYNC               KVM_ARCH_REQ(3)
 #define KVM_REQ_CLOCK_UPDATE           KVM_ARCH_REQ(4)
+#define KVM_REQ_LOAD_CR3               KVM_ARCH_REQ(5)
 #define KVM_REQ_EVENT                  KVM_ARCH_REQ(6)
 #define KVM_REQ_APF_HALT               KVM_ARCH_REQ(7)
 #define KVM_REQ_STEAL_UPDATE           KVM_ARCH_REQ(8)
index afb865d..704f7df 100644 (file)
@@ -4847,8 +4847,7 @@ int kvm_mmu_load(struct kvm_vcpu *vcpu)
        kvm_mmu_sync_roots(vcpu);
        if (r)
                goto out;
-       /* set_cr3() should ensure TLB has been flushed */
-       vcpu->arch.mmu.set_cr3(vcpu, vcpu->arch.mmu.root_hpa);
+       kvm_mmu_load_cr3(vcpu);
 out:
        return r;
 }
index 5b408c0..16b7178 100644 (file)
@@ -85,6 +85,13 @@ static inline int kvm_mmu_reload(struct kvm_vcpu *vcpu)
        return kvm_mmu_load(vcpu);
 }
 
+static inline void kvm_mmu_load_cr3(struct kvm_vcpu *vcpu)
+{
+       /* set_cr3() should ensure TLB has been flushed */
+       if (VALID_PAGE(vcpu->arch.mmu.root_hpa))
+               vcpu->arch.mmu.set_cr3(vcpu, vcpu->arch.mmu.root_hpa);
+}
+
 /*
  * Currently, we have two sorts of write-protection, a) the first one
  * write-protects guest page to sync the guest modification, b) another one is
index 5a1e4f7..7748037 100644 (file)
@@ -7332,6 +7332,8 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu)
                }
                if (kvm_check_request(KVM_REQ_MMU_SYNC, vcpu))
                        kvm_mmu_sync_roots(vcpu);
+               if (kvm_check_request(KVM_REQ_LOAD_CR3, vcpu))
+                       kvm_mmu_load_cr3(vcpu);
                if (kvm_check_request(KVM_REQ_TLB_FLUSH, vcpu))
                        kvm_vcpu_flush_tlb(vcpu, true);
                if (kvm_check_request(KVM_REQ_REPORT_TPR_ACCESS, vcpu)) {