如何在linux x86_64上模拟一个iret

我正在写一个基于Intel VT的debugging器。

由于在NMI-Exiting = 1时,virex指令在vmx-guest中的性能发生了改变。 所以我应该自己处理vmx-host中的NMI,否则guest将会有nmi可重入的bug。

我查了英特尔手册:

当NMI中断处理程序正在执行时,处理器会禁用对NMI处理程序的额外调用,直到执行下一个IRET指令为止。 这种对后续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":); 

任何人都可以展示一些指南

Solutions Collecting From Web of "如何在linux x86_64上模拟一个iret"