From: Lai Jiangshan <laijs@xxxxxxxxxxxxxxxxx> When the host is using debug registers but the guest is not using them nor is the guest in guest-debug state, the kvm code does not reset the host debug registers before kvm_x86->run(). Rather, it relies on the hardware vmentry instruction to automatically reset the dr7 registers which ensures that the host breakpoints do not affect the guest. But there are still problems: o The addresses of the host breakpoints can leak into the guest and the guest may use these information to attack the host. o It violates the non-instrumentable nature around VM entry and exit. For example, when a host breakpoint is set on vcpu->arch.cr2, #DB will hit aftr kvm_guest_enter_irqoff(). Beside the problems, the logic is not consistent either. When the guest debug registers are active, the host breakpoints are reset before kvm_x86->run(). But when the guest debug registers are inactive, the host breakpoints are delayed to be disabled. The host tracing tools may see different results depending on there is any guest running or not. To fix the problems, we also reload the debug registers before kvm_x86->run() when the host is using them whenever the guest is using them or not. Signed-off-by: Lai Jiangshan <laijs@xxxxxxxxxxxxxxxxx> --- arch/x86/kvm/x86.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index b594275d49b5..cce316655d3c 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -9320,7 +9320,7 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu) if (test_thread_flag(TIF_NEED_FPU_LOAD)) switch_fpu_return(); - if (unlikely(vcpu->arch.switch_db_regs)) { + if (unlikely(vcpu->arch.switch_db_regs || hw_breakpoint_active())) { set_debugreg(0, 7); set_debugreg(vcpu->arch.eff_db[0], 0); set_debugreg(vcpu->arch.eff_db[1], 1); -- 2.19.1.6.gb485710b