我正在编写一个基于Intel VT的调试器。
由于iret指令在vmx-guest中的性能发生了变化,而NMI-Exiting = 1。 所以我应该自己处理vmx-host中的NMI,否则,guest会有nmi可重入的错误。
我查看了英特尔手册:
当NMI中断处理程序正在执行时,处理器将禁用 在下一个IRET指令之前调用NMI处理程序 被执行。阻止后续NMI会阻止堆叠 调用NMI处理程序。
所以我试图在vmx-host中模拟一个iret。 CPL保持为ring0并保持堆栈和代码段不变。
我在下面写了一个示例代码,它是在由NMI引起的vmx-exit之后:
asm volatile(
"pushfq \n\t"
"mov %%cs.%%ax \n\t"
"push %%rax\n\t"
"mov $._restart_code,%%rax \n\t"
"push %%rax \n\t"
"iret \n\t"/*manully iret in the host before vmx-entry.*/
"._restart_code:"
"nop":);
任何人都可以出示一些指南吗?