On Thu, May 07, 2020 at 07:50:10AM -0400, Paolo Bonzini wrote: > diff --git a/arch/x86/kvm/svm/nested.c b/arch/x86/kvm/svm/nested.c > index 1a547e3ac0e5..9a2a62e5afeb 100644 > --- a/arch/x86/kvm/svm/nested.c > +++ b/arch/x86/kvm/svm/nested.c > @@ -633,10 +633,18 @@ static int nested_svm_intercept_db(struct vcpu_svm *svm) > > reflected_db: > /* > - * Synchronize guest DR6 here just like in db_interception; it will > - * be moved into the nested VMCB by nested_svm_vmexit. > + * Synchronize guest DR6 here just like in kvm_deliver_exception_payload; > + * it will be moved into the nested VMCB by nested_svm_vmexit. Once > + * exceptions will be moved to svm_check_nested_events, all this stuff > + * will just go away and we could just return NESTED_EXIT_HOST > + * unconditionally. db_interception will queue the exception, which > + * will be processed by svm_check_nested_events if a nested vmexit is > + * required, and we will just use kvm_deliver_exception_payload to copy > + * the payload to DR6 before vmexit. > */ > - svm->vcpu.arch.dr6 = dr6; > + WARN_ON(svm->vcpu.arch.switch_db_regs & KVM_DEBUGREG_WONT_EXIT); > + svm->vcpu.arch.dr6 &= ~(DR_TRAP_BITS | DR6_RTM); > + svm->vcpu.arch.dr6 |= dr6 & ~DR6_FIXED_1; I failed to figure out what the above calculation is going to do... E.g., I think the old "BT|BS|BD" bits in the old arch.dr6 cache will be leftover even if none of them is set in save.dr6, while we shouldn't? Thanks, -- Peter Xu