v3_mem_track_entry(info);
#endif
+#ifdef V3_CONFIG_HVM
+ v3_handle_hvm_entry(info);
+#endif
+
// Update timer devices late after being in the VM so that as much
// of the time in the VM is accounted for as possible. Also do it before
// updating IRQ entry state so that any interrupts the timers raise get
if (info->shdw_pg_mode == NESTED_PAGING) {
check_vmcs_read(VMCS_GUEST_PHYS_ADDR, &(exit_info.ept_fault_addr));
+ } else {
+ exit_info.ept_fault_addr = 0;
}
//PrintDebug(info->vm_info, info, "VMX Exit taken, id-qual: %u-%lu\n", exit_info.exit_reason, exit_info.exit_qual);
v3_handle_timeouts(info, guest_cycles);
}
+#ifdef V3_CONFIG_HVM
+ v3_handle_hvm_exit(info);
+#endif
+
#ifdef V3_CONFIG_MEM_TRACK
v3_mem_track_exit(info);
#endif
linear_addr = get_addr_linear(info, info->rip, &(info->segments.cs));
if (info->mem_mode == PHYSICAL_MEM) {
- v3_gpa_to_hva(info, linear_addr, &host_addr);
+ if (v3_gpa_to_hva(info, linear_addr, &host_addr)) {
+ PrintError(info->vm_info, info, "Cannot translate address\n");
+ return -1;
+ }
} else if (info->mem_mode == VIRTUAL_MEM) {
- v3_gva_to_hva(info, linear_addr, &host_addr);
+ if (v3_gva_to_hva(info, linear_addr, &host_addr)) {
+ PrintError(info->vm_info, info, "Cannot translate address\n");
+ return -1;
+ }
}
V3_Print(info->vm_info, info, "VMX core %u: Host Address of rip = 0x%p\n", info->vcpu_id, (void *)host_addr);