lkml.org 
[lkml]   [2022]   [Aug]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    Subject[PATCH v5 05/27] KVM: x86: Suppress code #DBs on Intel if MOV/POP SS blocking is active
    From
    Suppress code breakpoints if MOV/POP SS blocking is active and the guest
    CPU is Intel, i.e. if the guest thinks it's running on an Intel CPU.
    Intel CPUs inhibit code #DBs when MOV/POP SS blocking is active, whereas
    AMD (and its descendents) do not.

    Signed-off-by: Sean Christopherson <seanjc@google.com>
    ---
    arch/x86/kvm/x86.c | 19 ++++++++++++++++++-
    1 file changed, 18 insertions(+), 1 deletion(-)

    diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
    index 7403221c868e..013580c355d7 100644
    --- a/arch/x86/kvm/x86.c
    +++ b/arch/x86/kvm/x86.c
    @@ -8542,6 +8542,23 @@ int kvm_skip_emulated_instruction(struct kvm_vcpu *vcpu)
    }
    EXPORT_SYMBOL_GPL(kvm_skip_emulated_instruction);

    +static bool kvm_is_code_breakpoint_inhibited(struct kvm_vcpu *vcpu)
    +{
    + u32 shadow;
    +
    + if (kvm_get_rflags(vcpu) & X86_EFLAGS_RF)
    + return true;
    +
    + /*
    + * Intel CPUs inhibit code #DBs when MOV/POP SS blocking is active,
    + * but AMD CPUs do not. MOV/POP SS blocking is rare, check that first
    + * to avoid the relatively expensive CPUID lookup.
    + */
    + shadow = static_call(kvm_x86_get_interrupt_shadow)(vcpu);
    + return (shadow & KVM_X86_SHADOW_INT_MOV_SS) &&
    + guest_cpuid_is_intel(vcpu);
    +}
    +
    static bool kvm_vcpu_check_code_breakpoint(struct kvm_vcpu *vcpu,
    int emulation_type, int *r)
    {
    @@ -8584,7 +8601,7 @@ static bool kvm_vcpu_check_code_breakpoint(struct kvm_vcpu *vcpu,
    }

    if (unlikely(vcpu->arch.dr7 & DR7_BP_EN_MASK) &&
    - !(kvm_get_rflags(vcpu) & X86_EFLAGS_RF)) {
    + !kvm_is_code_breakpoint_inhibited(vcpu)) {
    unsigned long eip = kvm_get_linear_rip(vcpu);
    u32 dr6 = kvm_vcpu_check_hw_bp(eip, 0,
    vcpu->arch.dr7,
    --
    2.37.2.672.g94769d06f0-goog
    \
     
     \ /
      Last update: 2022-08-31 01:20    [W:4.055 / U:0.128 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site