aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/kvm/svm.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/kvm/svm.c')
-rw-r--r--drivers/kvm/svm.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/drivers/kvm/svm.c b/drivers/kvm/svm.c
index 70f386e04cbe..eb175c5cd499 100644
--- a/drivers/kvm/svm.c
+++ b/drivers/kvm/svm.c
@@ -1470,6 +1470,11 @@ static void load_db_regs(unsigned long *db_regs)
1470 asm volatile ("mov %0, %%dr3" : : "r"(db_regs[3])); 1470 asm volatile ("mov %0, %%dr3" : : "r"(db_regs[3]));
1471} 1471}
1472 1472
1473static void svm_flush_tlb(struct kvm_vcpu *vcpu)
1474{
1475 force_new_asid(vcpu);
1476}
1477
1473static int svm_vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) 1478static int svm_vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
1474{ 1479{
1475 u16 fs_selector; 1480 u16 fs_selector;
@@ -1487,6 +1492,11 @@ again:
1487 1492
1488 clgi(); 1493 clgi();
1489 1494
1495 vcpu->guest_mode = 1;
1496 if (vcpu->requests)
1497 if (test_and_clear_bit(KVM_TLB_FLUSH, &vcpu->requests))
1498 svm_flush_tlb(vcpu);
1499
1490 pre_svm_run(vcpu); 1500 pre_svm_run(vcpu);
1491 1501
1492 save_host_msrs(vcpu); 1502 save_host_msrs(vcpu);
@@ -1618,6 +1628,8 @@ again:
1618#endif 1628#endif
1619 : "cc", "memory" ); 1629 : "cc", "memory" );
1620 1630
1631 vcpu->guest_mode = 0;
1632
1621 if (vcpu->fpu_active) { 1633 if (vcpu->fpu_active) {
1622 fx_save(vcpu->guest_fx_image); 1634 fx_save(vcpu->guest_fx_image);
1623 fx_restore(vcpu->host_fx_image); 1635 fx_restore(vcpu->host_fx_image);
@@ -1682,11 +1694,6 @@ again:
1682 return r; 1694 return r;
1683} 1695}
1684 1696
1685static void svm_flush_tlb(struct kvm_vcpu *vcpu)
1686{
1687 force_new_asid(vcpu);
1688}
1689
1690static void svm_set_cr3(struct kvm_vcpu *vcpu, unsigned long root) 1697static void svm_set_cr3(struct kvm_vcpu *vcpu, unsigned long root)
1691{ 1698{
1692 vcpu->svm->vmcb->save.cr3 = root; 1699 vcpu->svm->vmcb->save.cr3 = root;