我正在编写一个基于英特尔VT的调试器。
当NMI-Exiting=1时,vmx-guest中的iret指令的性能会发生变化。因此,我应该自己处理vmx-host中的NMI,否则guest将出现nmi可重入错误。
我查了英特尔手册:
在执行NMI中断处理程序时,处理器禁用对NMI处理程序得其它调用,直到执行下一条IRET指令为止.这种对后续NMI得阻塞可防止对NMI处理程序得调用堆积.
因此,我尝试在vmx主机中模拟一个iret。CPL保持ring 0,并保持堆栈和代码段不变。
下面我写了一个示例代码,它是在vmx-exit之后由NMI引起的:
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":);
有谁能给我看看导游吗?
1条答案
按热度按时间guz6ccqo1#
看起来你的代码缺少推送SS和RSP。下面是我的i386和x86_64的代码:https://github.com/lxylxy123456/uberxmhf/blob/6b56acef71528b29e503ec66a2d305ba1b0c65f9/xmhf/src/xmhf-core/xmhf-runtime/xmhf-smpguest/arch/x86/vmx/smpg-x86vmx.c#L500