26.06.2021 03:15, Jim Mattson пишет:
If the squashed exception was a trap, it's now lost.
I am pretty sure this will do it: --- --- x86.c.old 2021-03-20 12:51:14.000000000 +0300 +++ x86.c 2021-06-27 15:02:45.126161812 +0300 @@ -9093,7 +9093,11 @@ cancel_injection: if (req_immediate_exit) kvm_make_request(KVM_REQ_EVENT, vcpu); - kvm_x86_ops.cancel_injection(vcpu); + if (vcpu->arch.exception.injected) { + kvm_x86_ops.cancel_injection(vcpu); + vcpu->arch.exception.injected = false; + vcpu->arch.exception.pending = true; + } if (unlikely(vcpu->arch.apic_attention)) kvm_lapic_sync_from_vapic(vcpu); out: @@ -9464,6 +9468,7 @@ kvm_rip_write(vcpu, regs->rip); kvm_set_rflags(vcpu, regs->rflags | X86_EFLAGS_FIXED); + WARN_ON_ONCE(vcpu->arch.exception.injected); vcpu->arch.exception.pending = false; kvm_make_request(KVM_REQ_EVENT, vcpu); --- In cancel_injection, the injected/pending members were getting out of sync with vmcs. We need to move it back to pending, and if user-space does SET_REGS, then it is cleared (not sure why SET_SREGS doesn't clear it also). But if the .injected member is stuck, then its not cleared by SET_REGS, and I added WARN_ON_ONCE() for that case. Does this make sense?