lkml.org 
[lkml]   [2010]   [Feb]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 02/10] KVM: SVM: Fix wrong interrupt injection in enable_irq_windows
    Date
    The nested_svm_intr() function does not execute the vmexit
    anymore. Therefore we may still be in the nested state after
    that function ran. This patch changes the nested_svm_intr()
    function to return wether the irq window could be enabled.

    Cc: stable@kernel.org
    Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
    ---
    arch/x86/kvm/svm.c | 17 ++++++++---------
    1 files changed, 8 insertions(+), 9 deletions(-)

    diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
    index 041ef6f..7c96b8b 100644
    --- a/arch/x86/kvm/svm.c
    +++ b/arch/x86/kvm/svm.c
    @@ -1389,16 +1389,17 @@ static int nested_svm_check_exception(struct vcpu_svm *svm, unsigned nr,
    return nested_svm_exit_handled(svm);
    }

    -static inline int nested_svm_intr(struct vcpu_svm *svm)
    +/* This function returns true if it is save to enable the irq window */
    +static inline bool nested_svm_intr(struct vcpu_svm *svm)
    {
    if (!is_nested(svm))
    - return 0;
    + return true;

    if (!(svm->vcpu.arch.hflags & HF_VINTR_MASK))
    - return 0;
    + return true;

    if (!(svm->vcpu.arch.hflags & HF_HIF_MASK))
    - return 0;
    + return false;

    svm->vmcb->control.exit_code = SVM_EXIT_INTR;

    @@ -1411,10 +1412,10 @@ static inline int nested_svm_intr(struct vcpu_svm *svm)
    */
    svm->nested.exit_required = true;
    trace_kvm_nested_intr_vmexit(svm->vmcb->save.rip);
    - return 1;
    + return false;
    }

    - return 0;
    + return true;
    }

    static void *nested_svm_map(struct vcpu_svm *svm, u64 gpa)
    @@ -2562,13 +2563,11 @@ static void enable_irq_window(struct kvm_vcpu *vcpu)
    {
    struct vcpu_svm *svm = to_svm(vcpu);

    - nested_svm_intr(svm);
    -
    /* In case GIF=0 we can't rely on the CPU to tell us when
    * GIF becomes 1, because that's a separate STGI/VMRUN intercept.
    * The next time we get that intercept, this function will be
    * called again though and we'll get the vintr intercept. */
    - if (gif_set(svm)) {
    + if (gif_set(svm) && nested_svm_intr(svm)) {
    svm_set_vintr(svm);
    svm_inject_irq(svm, 0x0);
    }
    --
    1.6.6



    \
     
     \ /
      Last update: 2010-02-18 12:43    [W:0.027 / U:30.288 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site