kvm模块在初始化的时候,注册了reboot回调:
register_reboot_notifier(&kvm_reboot_notifier);
在系统reboot的时候,执行如下操作:
static int kvm_reboot(struct notifier_block *notifier, unsigned long val,
void *v)
{
/*
* Some (well, at least mine) BIOSes hang on reboot if
* in vmx root mode.
*
* And Intel TXT required VMX off for all cpu when system shutdown.
*/
printk(KERN_INFO "kvm: exiting hardware virtualization/n");
kvm_rebooting = true;
on_each_cpu(hardware_disable, NULL, 1);
return NOTIFY_OK;
}
关闭vmx,这样有可能导致其他cpu进入vmx失败。
执行失败后,会调用如下函数:
asmlinkage void kvm_handle_fault_on_reboot(void)
这个bug修复的就是其他cpu执行失败,打开中断,好完成重启过程。
待分析问题:
1.linux系统重启过程。
2.vmx失败,kvm代码如何处理,如何关闭中断的。
3.nop和C1状态的区别。