• Sean Christopherson's avatar
    KVM: SVM: Unwind "speculative" RIP advancement if INTn injection "fails" · cd9e6da8
    Sean Christopherson authored
    
    
    Unwind the RIP advancement done by svm_queue_exception() when injecting
    an INT3 ultimately "fails" due to the CPU encountering a VM-Exit while
    vectoring the injected event, even if the exception reported by the CPU
    isn't the same event that was injected.  If vectoring INT3 encounters an
    exception, e.g. #NP, and vectoring the #NP encounters an intercepted
    exception, e.g. #PF when KVM is using shadow paging, then the #NP will
    be reported as the event that was in-progress.
    
    Note, this is still imperfect, as it will get a false positive if the
    INT3 is cleanly injected, no VM-Exit occurs before the IRET from the INT3
    handler in the guest, the instruction following the INT3 generates an
    exception (directly or indirectly), _and_ vectoring that exception
    encounters an exception that is intercepted by KVM.  The false positives
    could theoretically be solved by further analyzing the vectoring event,
    e.g. by comparing the error code against the expected error code were an
    exception to occur when vectoring the original injected exception, but
    SVM without NRIPS is a complete disaster, trying to make it 100% correct
    is a waste of time.
    Reviewed-by: default avatarMaxim Levitsky <mlevitsk@redhat.com>
    Fixes: 66b7138f
    
     ("KVM: SVM: Emulate nRIP feature when reinjecting INT3")
    Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
    Signed-off-by: default avatarMaciej S. Szmigiero <maciej.szmigiero@oracle.com>
    Message-Id: <450133cf0a026cb9825a2ff55d02cb136a1cb111.1651440202.git.maciej.szmigiero@oracle.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    cd9e6da8
svm.c 135 KB