Re: [PATCH v2] KVM: X86: Fix exception untrigger on ret to user

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Jul 6, 2021 at 4:06 PM stsp <stsp2@xxxxxxxxx> wrote:
>
> 07.07.2021 02:00, Maxim Levitsky пишет:
> > On Wed, 2021-07-07 at 00:50 +0300, stsp wrote:
> >> 06.07.2021 23:29, Maxim Levitsky пишет:
> >>> On Tue, 2021-07-06 at 15:06 +0300, stsp wrote:
> >>>> 06.07.2021 14:49, Maxim Levitsky пишет:
> >>>>> Now about the KVM's userspace API where this is exposed:
> >>>>>
> >>>>> I see now too that KVM_SET_REGS clears the pending exception.
> >>>>> This is new to me and it is IMHO *wrong* thing to do.
> >>>>> However I bet that someone somewhere depends on this,
> >>>>> since this behavior is very old.
> >>>> What alternative would you suggest?
> >>>> Check for ready_for_interrupt_injection
> >>>> and never call KVM_SET_REGS if it indicates
> >>>> "not ready"?
> >>>> But what if someone calls it nevertheless?
> >>>> Perhaps return an error from KVM_SET_REGS
> >>>> if exception is pending? Also KVM_SET_SREGS
> >>>> needs some treatment here too, as it can
> >>>> also be called when an exception is pending,
> >>>> leading to problems.
> >>> As I explained you can call KVM_GET_VCPU_EVENTS before calling
> >>> KVM_SET_REGS and then call KVM_SET_VCPU_EVENTS with the struct
> >>> that was filled by KVM_GET_VCPU_EVENTS.
> >>> That will preserve all the cpu events.
> >> The question is different.
> >> I wonder how _should_ the KVM
> >> API behave when someone calls
> >> KVM_SET_REGS/KVM_SET_SREGS
> > KVM_SET_REGS should not clear the pending exception.
> > but fixing this can break API compatibilitly if some
> > hypervisor (not qemu) relies on it.
> >
> > Thus either a new ioctl is needed or as I said,
> > KVM_GET_VCPU_EVENTS/KVM_SET_VCPU_EVENTS can be used
> > to preserve the events around that call as workaround.
> But I don't need to preserve
> events. Canceling is perfectly
> fine with me because, if I inject
> the interrupt at that point, the
> exception will be re-triggered
> anyway after interrupt handler
> returns.

The exception will not be re-triggered if it was a trap, because the
instruction that caused the exception will already have retired, and
RIP will have advanced.

Moreover, if the exception had any side-effects (#PF and sometimes
#DB), those side-effects have already happened, so if IDT vectoring is
cancelled, the vCPU is left in an architecturally unreachable state.

> What I ask is how SHOULD the
> KVM_SET_REGS and KVM_SET_SREGS
> behave when someone (mistakenly)
> calls them with the exception pending.
> Should they return an error
> instead of canceling exception?




[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux