如何在linux x86_64上模拟一个iret

时间:2012-08-01 09:22:09

标签: linux assembly linux-kernel x86

我正在编写一个基于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":);

任何人都可以出示一些指南吗?

0 个答案:

没有答案