diff options
Diffstat (limited to 'arch/x86/kvm/x86.c')
| -rw-r--r-- | arch/x86/kvm/x86.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index ae07d261527c..4fc80174191c 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
| @@ -42,6 +42,7 @@ | |||
| 42 | #define CREATE_TRACE_POINTS | 42 | #define CREATE_TRACE_POINTS |
| 43 | #include "trace.h" | 43 | #include "trace.h" |
| 44 | 44 | ||
| 45 | #include <asm/debugreg.h> | ||
| 45 | #include <asm/uaccess.h> | 46 | #include <asm/uaccess.h> |
| 46 | #include <asm/msr.h> | 47 | #include <asm/msr.h> |
| 47 | #include <asm/desc.h> | 48 | #include <asm/desc.h> |
| @@ -3643,14 +3644,15 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | |||
| 3643 | trace_kvm_entry(vcpu->vcpu_id); | 3644 | trace_kvm_entry(vcpu->vcpu_id); |
| 3644 | kvm_x86_ops->run(vcpu, kvm_run); | 3645 | kvm_x86_ops->run(vcpu, kvm_run); |
| 3645 | 3646 | ||
| 3646 | if (unlikely(vcpu->arch.switch_db_regs || test_thread_flag(TIF_DEBUG))) { | 3647 | /* |
| 3647 | set_debugreg(current->thread.debugreg0, 0); | 3648 | * If the guest has used debug registers, at least dr7 |
| 3648 | set_debugreg(current->thread.debugreg1, 1); | 3649 | * will be disabled while returning to the host. |
| 3649 | set_debugreg(current->thread.debugreg2, 2); | 3650 | * If we don't have active breakpoints in the host, we don't |
| 3650 | set_debugreg(current->thread.debugreg3, 3); | 3651 | * care about the messed up debug address registers. But if |
| 3651 | set_debugreg(current->thread.debugreg6, 6); | 3652 | * we have some of them active, restore the old state. |
| 3652 | set_debugreg(current->thread.debugreg7, 7); | 3653 | */ |
| 3653 | } | 3654 | if (hw_breakpoint_active()) |
| 3655 | hw_breakpoint_restore(); | ||
| 3654 | 3656 | ||
| 3655 | set_bit(KVM_REQ_KICK, &vcpu->requests); | 3657 | set_bit(KVM_REQ_KICK, &vcpu->requests); |
| 3656 | local_irq_enable(); | 3658 | local_irq_enable(); |
