检查vmwrite指令执行结果
MSVC
在msvc中使用__vmx_vmwrite执行vmwrite指令:
可以检查其返回值得到指令的执行结果,对于返回值为1的情况,可以通过vmread读取vmcs中VM-instruction error field字段得到操作失败的原因。
汇编层面
在汇编层面可以结合RFLAGS来得到vmwrite指令的执行结果。VMWRITE指令本身不通过通用寄存器返回结果,而是通过修改RFLAGS寄存器中的CF(进位标志)和ZF(零标志)来指示成功或失败。
处理器通过这两个标志位的不同组合,来区分三种执行结果:
CF(进位标志) | ZF(零标志) | 状态 | 含义与后续操作 |
|---|---|---|---|
| 0 | 0 | VMsucceed(成功) | 指令执行成功,VMCS 字段已正确写入。 |
| 1 | 0 | VMfailInvalid(指针无效) | 当前 VMCS 指针 (current-VMCS pointer) 无效。通常意味着 VMCS 区域未被正确初始化,或VMXON/VMPTRLD未成功执行。 |
| 0 | 1 | VMfailValid(指针有效但操作失败) | VMCS 指针有效,但指令因其他原因失败。详细错误码已保存在当前 VMCS 的VM-instruction error字段中,可通过VMREAD指令读取以诊断问题。 |