lkml.org 
[lkml]   [2020]   [Nov]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC PATCH 29/67] KVM: x86: Add a switch_db_regs flag to handle TDX's auto-switched behavior
    Date
    From: Sean Christopherson <sean.j.christopherson@intel.com>

    Add a flag, KVM_DEBUGREG_AUTO_SWITCHED, to skip saving/restoring DRs
    irrespective of any other flags. TDX-SEAM unconditionally saves and
    restores host DRs, ergo there is nothing to do.

    Opportunistically convert the KVM_DEBUGREG_* definitions to use BIT().

    Reported-by: Xiaoyao Li <xiaoyao.li@intel.com>
    Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com>
    ---
    arch/x86/include/asm/kvm_host.h | 7 ++++---
    arch/x86/kvm/x86.c | 6 ++++--
    2 files changed, 8 insertions(+), 5 deletions(-)

    diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
    index a6c89666ec49..815469875445 100644
    --- a/arch/x86/include/asm/kvm_host.h
    +++ b/arch/x86/include/asm/kvm_host.h
    @@ -464,9 +464,10 @@ struct kvm_pmu {
    struct kvm_pmu_ops;

    enum {
    - KVM_DEBUGREG_BP_ENABLED = 1,
    - KVM_DEBUGREG_WONT_EXIT = 2,
    - KVM_DEBUGREG_RELOAD = 4,
    + KVM_DEBUGREG_BP_ENABLED = BIT(0),
    + KVM_DEBUGREG_WONT_EXIT = BIT(1),
    + KVM_DEBUGREG_RELOAD = BIT(2),
    + KVM_DEBUGREG_AUTO_SWITCHED = BIT(3),
    };

    struct kvm_mtrr_range {
    diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
    index 42bd24ba7fdd..098888edc3ad 100644
    --- a/arch/x86/kvm/x86.c
    +++ b/arch/x86/kvm/x86.c
    @@ -9009,7 +9009,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 & ~KVM_DEBUGREG_AUTO_SWITCHED)) {
    set_debugreg(0, 7);
    set_debugreg(vcpu->arch.eff_db[0], 0);
    set_debugreg(vcpu->arch.eff_db[1], 1);
    @@ -9029,6 +9029,7 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu)
    */
    if (unlikely(vcpu->arch.switch_db_regs & KVM_DEBUGREG_WONT_EXIT)) {
    WARN_ON(vcpu->guest_debug & KVM_GUESTDBG_USE_HW_BP);
    + WARN_ON(vcpu->arch.switch_db_regs & KVM_DEBUGREG_AUTO_SWITCHED);
    kvm_x86_ops.sync_dirty_debug_regs(vcpu);
    kvm_update_dr0123(vcpu);
    kvm_update_dr7(vcpu);
    @@ -9042,7 +9043,8 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu)
    * care about the messed up debug address registers. But if
    * we have some of them active, restore the old state.
    */
    - if (hw_breakpoint_active())
    + if (hw_breakpoint_active() &&
    + !(vcpu->arch.switch_db_regs & KVM_DEBUGREG_AUTO_SWITCHED))
    hw_breakpoint_restore();

    vcpu->arch.last_vmentry_cpu = vcpu->cpu;
    --
    2.17.1
    \
     
     \ /
      Last update: 2020-11-16 19:39    [W:4.347 / U:0.172 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site