check_vmcs_read(VMCS_GUEST_RFLAGS, &(info->ctrl_regs.rflags));
if (((struct vmx_data *)info->vmm_data)->ia32e_avail) {
+#ifdef __V3_64BIT__
check_vmcs_read(VMCS_GUEST_EFER, &(info->ctrl_regs.efer));
+#else
+ uint32_t hi, lo;
+ check_vmcs_read(VMCS_GUEST_EFER, &hi);
+ check_vmcs_read(VMCS_GUEST_EFER_HIGH, &lo);
+ info->ctrl_regs.efer = ((uint64_t) hi << 32) | lo;
+#endif
}
error = v3_read_vmcs_segments(&(info->segments));
case VMCS_GUEST_DBG_CTL_HIGH:
case VMCS_GUEST_PERF_GLOBAL_CTRL_HIGH:
case VMCS_HOST_PERF_GLOBAL_CTRL_HIGH:
+ case VMCS_GUEST_EFER_HIGH:
return 4;
/* Natural Width Control Fields */
case VMCS_HOST_SYSENTER_EIP:
case VMCS_HOST_RSP:
case VMCS_HOST_RIP:
+ case VMCS_GUEST_EFER:
return sizeof(addr_t);
default:
- PrintError("Invalid VMCS field\n");
+ PrintError("Invalid VMCS field: 0x%x\n", field);
return -1;
}
}