X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fsvm.c;h=6064855f3652ded4c25a18fc58e8d849b254248f;hb=c30d1b88a60c3a8df426ce81553675bbe4afef52;hp=d9b44f03ab704b08091fb52ab1756e6b507970ce;hpb=8e9c13c41b0244a8d0029e837a623591a22c5879;p=palacios.git diff --git a/palacios/src/palacios/svm.c b/palacios/src/palacios/svm.c index d9b44f0..6064855 100644 --- a/palacios/src/palacios/svm.c +++ b/palacios/src/palacios/svm.c @@ -37,6 +37,9 @@ #include #include +#ifdef V3_CONFIG_CHECKPOINT +#include +#endif #include @@ -339,6 +342,27 @@ int v3_deinit_svm_vmcb(struct guest_info * core) { } +#ifdef V3_CONFIG_CHECKPOINT +int v3_svm_save_core(struct guest_info * core, void * ctx){ + + v3_chkpt_save_8(ctx, "cpl", &(core->cpl)); + v3_chkpt_save(ctx, "vmcb_data", PAGE_SIZE, core->vmm_data); + + return 0; +} + +int v3_svm_load_core(struct guest_info * core, void * ctx){ + + v3_chkpt_load_8(ctx, "cpl", &(core->cpl)); + + if (v3_chkpt_load(ctx, "vmcb_data", PAGE_SIZE, core->vmm_data) == -1) { + return -1; + } + + return 0; +} +#endif + static int update_irq_exit_state(struct guest_info * info) { vmcb_ctrl_t * guest_ctrl = GET_VMCB_CTRL_AREA((vmcb_t*)(info->vmm_data)); @@ -545,31 +569,8 @@ int v3_svm_enter(struct guest_info * info) { #endif v3_time_enter_vm(info); - guest_ctrl->TSC_OFFSET = v3_tsc_host_offset(&info->time_state); - - if(info->core_move_state == CORE_MOVE_PENDING) { - v3_stgi(); - - if(V3_MOVE_THREAD_TO_CPU(info->target_pcpu_id, info->core_thread) != 0){ - PrintError("Failed to move Vcore %d to CPU %d\n", - info->vcpu_id, - info->target_pcpu_id); - } else { - info->pcpu_id = info->target_pcpu_id; - V3_Print("Core move done, vcore %d is running on CPU %d now\n", - info->vcpu_id, - V3_Get_CPU()); - } - - info->core_move_state = CORE_MOVE_DONE; - - /* disable global interrupts, - * NOTE now it is being running on a different CPU - */ - v3_clgi(); - } + // guest_ctrl->TSC_OFFSET = v3_tsc_host_offset(&info->time_state); - //V3_Print("Calling v3_svm_launch\n"); @@ -658,6 +659,9 @@ int v3_start_svm_guest(struct guest_info * info) { } PrintDebug("SVM core %u(on %u) initialized\n", info->vcpu_id, info->pcpu_id); + + // We'll be paranoid about race conditions here + v3_wait_at_barrier(info); } PrintDebug("SVM core %u(on %u): I am starting at CS=0x%x (base=0x%p, limit=0x%x), RIP=0x%p\n",