31.3 VMX INSTRUCTIONS
INVEPT— Invalidate Translations Derived from EPT
if ( (不在VMX模式) | CR0.PE==0 | (rflags.vm==1) | (IA32EFFER.LMA==1 & cs.L==0) { #UD ;//无法识别的指令 } elseif( 在vmx non-root模式 ) { 发生VM-EXIT事件; } esleif( CPL>0 )//当前请求级别不是0环 { #GP(0);//异常 } else { INVEPT_TYPE =寄存器提供的值; if(IN32_VMX_EPT_VPID_CAP 寄存器表示不支持你传过来的 INVEPT_TYPE ) { VMfail( INVEPT/INVVPID 无效的操作); } else //INVEPT_TYPE必须时1和2 { NVEPT_DESC =内存操作数给的值; EPTP=NVEPT_DESC[63:0]; switch(INVEPT_TYPE) { case 1://单条目刷新 if(VM execution control. enable EPT==1 ) { if( EPTP value不符合要求) { VMfail( INVEPT/INVVPID 无效的操作); } } else { 使得EPTP[51:12]对于的映射失效; VMsucceed; } break; case 2://所有条目失效 使得所有的eptp映射失效 VMsucceed; } } }
VMsucceed;VMfail(ErrorNumber): VMfail(ErrorNumber):
参考31.2 CONVENTIONS
VMsucceed:
CF := 0;
PF := 0;
AF := 0;
ZF := 0;
SF := 0;
OF := 0;
VMfail(ErrorNumber):
IF VMCS pointer is valid
THEN VMfailValid(ErrorNumber);
ELSE VMfailInvalid;
FI;
VMfailInvalid:
CF := 1;
PF := 0;
AF := 0;
ZF := 0;
SF := 0;
OF := 0;
VMfailValid(ErrorNumber):// 仅在当前存在VMCS时执行
CF := 0;
PF := 0;
AF := 0;
ZF := 1;
SF := 0;
OF := 0;
Set the VM-instruction error field to ErrorNumber;
假如你不知道我在写什么,你就不知道我在写什么