On 02/05/20 06:32, Sean Christopherson wrote: > Make get_dr6() and set_dr6() optional and drop the VMX implementations, > which are for all intents and purposes nops. This avoids a retpoline on > VMX when reading/writing DR6, at minimal cost (~1 uop) to SVM. Can't get_dr6 be killed off completely here, since vcpu->arch.dr6 is the only value that is ever passed to set_dr6? OTOH no complaint about adding the if for vmx_set_dr6, since that will also be covered nicely by DEFINE_STATIC_COND_CALL. Paolo > Signed-off-by: Sean Christopherson <sean.j.christopherson@xxxxxxxxx> > --- > arch/x86/kvm/vmx/vmx.c | 11 ----------- > arch/x86/kvm/x86.c | 6 ++++-- > 2 files changed, 4 insertions(+), 13 deletions(-) > > diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c > index de18cd386bb1..e157bdc218ea 100644 > --- a/arch/x86/kvm/vmx/vmx.c > +++ b/arch/x86/kvm/vmx/vmx.c > @@ -5008,15 +5008,6 @@ static int handle_dr(struct kvm_vcpu *vcpu) > return kvm_skip_emulated_instruction(vcpu); > } > > -static u64 vmx_get_dr6(struct kvm_vcpu *vcpu) > -{ > - return vcpu->arch.dr6; > -} > - > -static void vmx_set_dr6(struct kvm_vcpu *vcpu, unsigned long val) > -{ > -} > - > static void vmx_sync_dirty_debug_regs(struct kvm_vcpu *vcpu) > { > get_debugreg(vcpu->arch.db[0], 0); > @@ -7799,8 +7790,6 @@ static struct kvm_x86_ops vmx_x86_ops __initdata = { > .set_idt = vmx_set_idt, > .get_gdt = vmx_get_gdt, > .set_gdt = vmx_set_gdt, > - .get_dr6 = vmx_get_dr6, > - .set_dr6 = vmx_set_dr6, > .set_dr7 = vmx_set_dr7, > .sync_dirty_debug_regs = vmx_sync_dirty_debug_regs, > .cache_reg = vmx_cache_reg, > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c > index 8ec356ac1e6e..eccbfcb6a4e5 100644 > --- a/arch/x86/kvm/x86.c > +++ b/arch/x86/kvm/x86.c > @@ -1069,7 +1069,8 @@ static void kvm_update_dr0123(struct kvm_vcpu *vcpu) > > static void kvm_update_dr6(struct kvm_vcpu *vcpu) > { > - if (!(vcpu->guest_debug & KVM_GUESTDBG_USE_HW_BP)) > + if (!(vcpu->guest_debug & KVM_GUESTDBG_USE_HW_BP) && > + kvm_x86_ops.set_dr6) > kvm_x86_ops.set_dr6(vcpu, vcpu->arch.dr6); > } > > @@ -1148,7 +1149,8 @@ int kvm_get_dr(struct kvm_vcpu *vcpu, int dr, unsigned long *val) > case 4: > /* fall through */ > case 6: > - if (vcpu->guest_debug & KVM_GUESTDBG_USE_HW_BP) > + if ((vcpu->guest_debug & KVM_GUESTDBG_USE_HW_BP) || > + !kvm_x86_ops.get_dr6) > *val = vcpu->arch.dr6; > else > *val = kvm_x86_ops.get_dr6(vcpu); >