Gleb Natapov wrote: > On Sat, Feb 13, 2010 at 08:20:41PM +0100, Jan Kiszka wrote: >> Gleb Natapov wrote: >>> On Sat, Feb 13, 2010 at 07:41:35PM +0100, Jan Kiszka wrote: >>>> Gleb Natapov wrote: >>>>> On Sat, Feb 13, 2010 at 06:49:44PM +0100, Jan Kiszka wrote: >>>>>> Gleb Natapov wrote: >>>>>>> On Sat, Feb 13, 2010 at 10:51:40AM +0100, Jan Kiszka wrote: >>>>>>>> From: Jan Kiszka <jan.kiszka@xxxxxxxxxxx> >>>>>>>> >>>>>>>> VMX requires a properly set instruction length VM entry field when >>>>>>>> trying to inject soft exception and interrupts. We have to preserve this >>>>>>>> state across VM save/restore to avoid breaking the re-injection of such >>>>>>>> events on Intel. So add it to the new VCPU event state. >>>>>>>> >>>>>>> We shouldn't re-inject soft exceptions/interrupts after migration, but >>>>>>> re-execute instruction instead. Instruction length field doesn't exist >>>>>>> on SVM and migration shouldn't expose implementation details. >>>>>>> >>>>>> Hmm, then I guess this totally untested patch should fly: >>>>>> >>>>> I don't understand what problem are you trying to solve by your patch. >>>>> During normal operation event_exit_inst_len will be set to correct >>>>> value. After migration rip will point to int instruction an no even will >>>>> be pending at all. Here is the patch: >>>> The patch will cause an endless loop if BP interception is enabled. >>>> >>> How? This code path is not executed normally. >> Oh, I read it the other way around, but it is supposed to mask soft >> exceptions/irqs (clearing *.injected is missing then). >> >>>> What is the purpose of keeping event_exit_inst_len around? Either we >>>> need it also across user space exists, then we have to save/restore or >>>> reconstruct it, or we don't need it, then simply drop it. >>>> >>> Why we need to save/restore is if we need it across user space exits? >>> We need to save/restore it only if we nedd it across migration. >>> >>> When exception happens during soft interrupt/exception delivery soft i/e >>> should be retried somehow. There are two ways to do that. First one is just >>> reenter guest with the same rip. Instruction will be reexecuted and >>> event redelivered. Another is to reinject event via event reinjection >>> mechanism and for that we need to tell CPU how to calculate rip of a next >>> instruction and this is done by providing event_exit_inst_len. The >> But I still fail to see the case where event_exit_inst_len is set to >> anything but 1 or 2 and where it is related to anything else than exits >> at INT3, INT X, or INTO. >> > You can't know real instruction length without decoding it or relying on > VMX exit info. What if prefix were used for INT X? > OK, makes sense now. Then let's go with your suggestion, will post it as a patch. Thanks for explaining, Jan
Attachment:
signature.asc
Description: OpenPGP digital signature