Browse Source

kvm: x86: Introduce KVM_REQ_LOAD_CR3

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>
Junaid Shahid 7 years ago
parent
commit
6e42782f51
4 changed files with 11 additions and 2 deletions
  1. 1 0
      arch/x86/include/asm/kvm_host.h
  2. 1 2
      arch/x86/kvm/mmu.c
  3. 7 0
      arch/x86/kvm/mmu.h
  4. 2 0
      arch/x86/kvm/x86.c

+ 1 - 0
arch/x86/include/asm/kvm_host.h

@@ -54,6 +54,7 @@
 #define KVM_REQ_TRIPLE_FAULT		KVM_ARCH_REQ(2)
 #define KVM_REQ_TRIPLE_FAULT		KVM_ARCH_REQ(2)
 #define KVM_REQ_MMU_SYNC		KVM_ARCH_REQ(3)
 #define KVM_REQ_MMU_SYNC		KVM_ARCH_REQ(3)
 #define KVM_REQ_CLOCK_UPDATE		KVM_ARCH_REQ(4)
 #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_EVENT			KVM_ARCH_REQ(6)
 #define KVM_REQ_APF_HALT		KVM_ARCH_REQ(7)
 #define KVM_REQ_APF_HALT		KVM_ARCH_REQ(7)
 #define KVM_REQ_STEAL_UPDATE		KVM_ARCH_REQ(8)
 #define KVM_REQ_STEAL_UPDATE		KVM_ARCH_REQ(8)

+ 1 - 2
arch/x86/kvm/mmu.c

@@ -4847,8 +4847,7 @@ int kvm_mmu_load(struct kvm_vcpu *vcpu)
 	kvm_mmu_sync_roots(vcpu);
 	kvm_mmu_sync_roots(vcpu);
 	if (r)
 	if (r)
 		goto out;
 		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:
 out:
 	return r;
 	return r;
 }
 }

+ 7 - 0
arch/x86/kvm/mmu.h

@@ -85,6 +85,13 @@ static inline int kvm_mmu_reload(struct kvm_vcpu *vcpu)
 	return kvm_mmu_load(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
  * 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
  * write-protects guest page to sync the guest modification, b) another one is

+ 2 - 0
arch/x86/kvm/x86.c

@@ -7332,6 +7332,8 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu)
 		}
 		}
 		if (kvm_check_request(KVM_REQ_MMU_SYNC, vcpu))
 		if (kvm_check_request(KVM_REQ_MMU_SYNC, vcpu))
 			kvm_mmu_sync_roots(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))
 		if (kvm_check_request(KVM_REQ_TLB_FLUSH, vcpu))
 			kvm_vcpu_flush_tlb(vcpu, true);
 			kvm_vcpu_flush_tlb(vcpu, true);
 		if (kvm_check_request(KVM_REQ_REPORT_TPR_ACCESS, vcpu)) {
 		if (kvm_check_request(KVM_REQ_REPORT_TPR_ACCESS, vcpu)) {