-----Original Message----- From: Kevin O'Connor [mailto:kevin@koconnor.net] Sent: Saturday, December 19, 2015 11:12 PM On Sat, Dec 19, 2015 at 12:03:15PM +0000, Gonglei (Arei) wrote:
Maybe the root cause is not NMI but INTR, so yield() can open hardware
interrupt,
And then execute interrupt handler, but the interrupt handler make the
SeaBIOS
stack broken, so that the BSP can't execute the instruction and occur
exception,
VM_EXIT to Kmod, which is an infinite loop. But I don't have any proofs except the surface phenomenon.
I can't see any reason why allowing interrupts at this location would be a problem.
Does it have any relationship with *extra stack* of SeaBIOS?
Kevin, can we drop yield() in smp_setup() ?
It's possible to eliminate this instance of yield, but I think it would just push the crash to the next time interrupts are enabled.
Perhaps. I'm not sure.
Is it really useful and allowable for SeaBIOS? Maybe for other components? I'm not sure. Because we found that when SeaBIOS is booting, if we inject a NMI by QMP, the guest will *stuck*. And the kvm tracing log is the same with the current problem.
If you apply the patches you had to prevent that NMI crash problem, does it also prevent the above crash?
Yes, but we cannot prevent the NMI injection (though I'll submit some patches to forbid users' NMI injection after NMI_EN disabled by RTC bit7 of port 0x70).
Regards, -Gonglei