• Maxim Levitsky's avatar
    KVM: x86: implement KVM_GUESTDBG_BLOCKIRQ · 61e5f69e
    Maxim Levitsky authored
    KVM_GUESTDBG_BLOCKIRQ will allow KVM to block all interrupts
    while running.
    
    This change is mostly intended for more robust single stepping
    of the guest and it has the following benefits when enabled:
    
    * Resuming from a breakpoint is much more reliable.
      When resuming execution from a breakpoint, with interrupts enabled,
      more often than not, KVM would inject an interrupt and make the CPU
      jump immediately to the interrupt handler and eventually return to
      the breakpoint, to trigger it again.
    
      From the user point of view it looks like the CPU never executed a
      single instruction and in some cases that can even prevent forward
      progress, for example, when the breakpoint is placed by an automated
      script (e.g lx-symbols), which does something in response to the
      breakpoint and then continues the guest automatically.
      If the script execution takes enough time for another interrupt to
      arrive, the guest will be stuck on the same breakpoint RIP forever.
    
    * Normal single stepping is much more predictable, since it won't
      land the debugger into an interrupt handler.
    
    * RFLAGS.TF has less chance to be leaked to the guest:
    
      We set that flag behind the guest's back to do single stepping
      but if single step lands us into an interrupt/exception handler
      it will be leaked to the guest in the form of being pushed
      to the stack.
      This doesn't completely eliminate this problem as exceptions
      can still happen, but at least this reduces the chances
      of this happening.
    Signed-off-by: default avatarMaxim Levitsky <mlevitsk@redhat.com>
    Message-Id: <20210811122927.900604-6-mlevitsk@redhat.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    61e5f69e
x86.c 324 KB