X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_checkpoint.c;h=3258779a7d452ccc9b433171c67879edf0049be4;hb=c30d1b88a60c3a8df426ce81553675bbe4afef52;hp=fbe922de75442585d183e5d013d5c2e5dae39df8;hpb=5d1bbcc86de011e3f0d115b6f10fd8645cdf855e;p=palacios.git diff --git a/palacios/src/palacios/vmm_checkpoint.c b/palacios/src/palacios/vmm_checkpoint.c index fbe922d..3258779 100644 --- a/palacios/src/palacios/vmm_checkpoint.c +++ b/palacios/src/palacios/vmm_checkpoint.c @@ -26,6 +26,7 @@ #include #include #include +#include #include @@ -310,6 +311,8 @@ static int load_core(struct guest_info * info, struct v3_chkpt * chkpt) { ctx = v3_chkpt_open_ctx(chkpt, NULL, key_name); + v3_chkpt_load_64(ctx, "RIP", &(info->rip)); + V3_CHKPT_STD_LOAD(ctx, info->vm_regs); V3_CHKPT_STD_LOAD(ctx, info->ctrl_regs.cr0); @@ -331,6 +334,20 @@ static int load_core(struct guest_info * info, struct v3_chkpt * chkpt) { info->cpu_mode = v3_get_vm_cpu_mode(info); info->mem_mode = v3_get_vm_mem_mode(info); + if (info->shdw_pg_mode == SHADOW_PAGING) { + if (v3_get_vm_mem_mode(info) == VIRTUAL_MEM) { + if (v3_activate_shadow_pt(info) == -1) { + PrintError("Failed to activate shadow page tables\n"); + return -1; + } + } else { + if (v3_activate_passthrough_pt(info) == -1) { + PrintError("Failed to activate passthrough page tables\n"); + return -1; + } + } + } + switch (cpu_type) { case V3_SVM_CPU: @@ -371,6 +388,8 @@ static int load_core(struct guest_info * info, struct v3_chkpt * chkpt) { return -1; } + v3_print_guest_state(info); + return 0; } @@ -382,11 +401,15 @@ static int save_core(struct guest_info * info, struct v3_chkpt * chkpt) { memset(key_name, 0, 16); + v3_print_guest_state(info); + snprintf(key_name, 16, "guest_info%d", info->vcpu_id); ctx = v3_chkpt_open_ctx(chkpt, NULL, key_name); + v3_chkpt_save_64(ctx, "RIP", &(info->rip)); + V3_CHKPT_STD_SAVE(ctx, info->vm_regs); V3_CHKPT_STD_SAVE(ctx, info->ctrl_regs.cr0); @@ -475,12 +498,12 @@ int v3_chkpt_save_vm(struct v3_vm_info * vm, char * store, char * url) { goto out; } - /* - if ((ret = v3_chkpt_save_dev(vm)) == -1) { + + if ((ret = v3_save_vm_devices(vm, chkpt)) == -1) { PrintError("Unable to save devices\n"); goto out; } - */ + if ((ret = save_header(vm, chkpt)) == -1) { PrintError("Unable to save header\n"); @@ -530,12 +553,11 @@ int v3_chkpt_load_vm(struct v3_vm_info * vm, char * store, char * url) { } - /* Don't handle devices just yet - if (v3_chkpt_load_dev(vm) == -1) { + if ((ret = v3_load_vm_devices(vm, chkpt)) == -1) { PrintError("Unable to load devies\n"); + goto out; } - */ if ((ret = load_header(vm, chkpt)) == -1) { PrintError("Unable to load header\n"); @@ -550,7 +572,7 @@ int v3_chkpt_load_vm(struct v3_vm_info * vm, char * store, char * url) { } } - out: + out: /* Resume the guest if it was running and we didn't just trash the state*/ if (vm->run_state == VM_RUNNING) {