vmcb_saved_state_t * guest_state = GET_VMCB_SAVE_STATE_AREA((vmcb_t*)(info->vmm_data));
addr_t exit_code = 0, exit_info1 = 0, exit_info2 = 0;
- v3_adjust_time(info);
-
// Conditionally yield the CPU if the timeslice has expired
v3_yield_cond(info);
+ v3_adjust_time(info);
+
// disable global interrupts for vm state transition
v3_clgi();
#endif
v3_update_timers(info);
+#ifdef CONFIG_TIME_HIDE_VM_COST
+ v3_restart_time(info);
+#endif
guest_ctrl->TSC_OFFSET = v3_tsc_host_offset(&info->time_state);
//V3_Print("Calling v3_svm_launch\n");
v3_last_exit = (uint32_t)(guest_ctrl->exit_code);
+#ifdef CONFIG_TIME_HIDE_VM_COST
+ v3_pause_time(info);
+#ifdef CONFIG_TIME_HIDE_EXIT_COST
+ v3_offset_time(info, -CONFIG_TIME_EXIT_COST_ADJUST);
+#endif
+#endif
+
//PrintDebug("SVM Returned\n");
info->num_exits++;
+void v3_deinit_svm_cpu(int cpu_id) {
+ reg_ex_t msr;
+ extern v3_cpu_arch_t v3_cpu_types[];
+
+ // reset SVM_VM_HSAVE_PA_MSR
+ // Does setting it to NULL disable??
+ msr.r_reg = 0;
+ v3_set_msr(SVM_VM_HSAVE_PA_MSR, msr.e_reg.high, msr.e_reg.low);
+ // Disable SVM?
+ v3_get_msr(EFER_MSR, &(msr.e_reg.high), &(msr.e_reg.low));
+ msr.e_reg.low &= ~EFER_MSR_svm_enable;
+ v3_set_msr(EFER_MSR, 0, msr.e_reg.low);
+
+ v3_cpu_types[cpu_id] = V3_INVALID_CPU;
+
+ V3_FreePages((void *)host_vmcbs[cpu_id], 4);
+
+ V3_Print("Host CPU %d host area freed, and SVM disabled\n", cpu_id);
+ return;
+}