int v3_chkpt_save(struct v3_chkpt_ctx * ctx, char * tag, uint64_t len, void * buf) {
- struct v3_chkpt * chkpt = ctx->chkpt;
+ struct v3_chkpt * chkpt;
int rc;
if (!ctx) {
return -1;
}
+ chkpt = ctx->chkpt;
+
if (chkpt->current_ctx != ctx) {
PrintError(VM_NONE, VCORE_NONE, "Attempt to save on context that is not the current context for the store\n");
return -1;
int v3_chkpt_load(struct v3_chkpt_ctx * ctx, char * tag, uint64_t len, void * buf) {
- struct v3_chkpt * chkpt = ctx->chkpt;
+ struct v3_chkpt * chkpt;
int rc;
if (!ctx) {
PrintError(VM_NONE, VCORE_NONE, "Attempt to load tag %s from null context\n",tag);
return -1;
}
+
+ chkpt = ctx->chkpt;
if (chkpt->current_ctx != ctx) {
PrintError(VM_NONE, VCORE_NONE, "Attempt to load from context that is not the current context for the store\n");
v3_invalidate_shadow_pts(&(vm->cores[i]));
}
} else if (vm->cores[0].shdw_pg_mode==NESTED_PAGING) {
- //v3_register_nested_paging_event_callback(vm,nested_paging_callback,m);
+ //v3_register_nested_paging_event_callback(vm,nested_paging_callback,m);
for (i=0;i<vm->num_cores;i++) {
//v3_invalidate_nested_addr_range(&(vm->cores[i]),0,vm->mem_size-1);
// Run state is needed to determine when AP cores need
// to be immediately run after resume
V3_CHKPT_LOAD(ctx,"run_state",info->core_run_state,loadfailout);
+ V3_CHKPT_LOAD(ctx,"cpu_mode",info->cpu_mode,loadfailout);
+ V3_CHKPT_LOAD(ctx,"mem_mode",info->mem_mode,loadfailout);
+
+ V3_CHKPT_LOAD(ctx,"CPL",info->cpl,loadfailout);
+
+ if (info->cpl != info->segments.ss.dpl) {
+ V3_Print(info->vm_info,info,"Strange, CPL=%d but ss.dpl=%d on core save\n",info->cpl,info->segments.ss.dpl);
+ }
+
V3_CHKPT_LOAD(ctx, "RIP", info->rip, loadfailout);
V3_CHKPT_LOAD(ctx, "GDTR", info->segments.gdtr, loadfailout);
V3_CHKPT_LOAD(ctx, "IDTR", info->segments.idtr, loadfailout);
V3_CHKPT_LOAD(ctx, "TR", info->segments.tr, loadfailout);
-
+
+ if (info->cpl != info->segments.ss.dpl) {
+ V3_Print(info->vm_info,info,"Strange, CPL=%d but ss.dpl=%d on core load\n",info->cpl,info->segments.ss.dpl);
+ }
+
// several MSRs...
V3_CHKPT_LOAD(ctx, "STAR", info->msrs.star, loadfailout);
V3_CHKPT_LOAD(ctx, "LSTAR", info->msrs.lstar, loadfailout);
}
V3_CHKPT_SAVE(ctx,"run_state",info->core_run_state,savefailout);
+ V3_CHKPT_SAVE(ctx,"cpu_mode",info->cpu_mode,savefailout);
+ V3_CHKPT_SAVE(ctx,"mem_mode",info->mem_mode,savefailout);
+
+ V3_CHKPT_SAVE(ctx,"CPL",info->cpl,savefailout);
V3_CHKPT_SAVE(ctx, "RIP", info->rip, savefailout);
-
+
// GPRs
V3_CHKPT_SAVE(ctx,"RDI",info->vm_regs.rdi, savefailout);
V3_CHKPT_SAVE(ctx,"RSI",info->vm_regs.rsi, savefailout);
int iter = 0;
bool last_modpage_iteration=false;
struct v3_bitmap modified_pages_to_send;
- uint64_t start_time;
+ uint64_t start_time=0;
uint64_t stop_time;
int num_mod_pages=0;
struct mem_migration_state *mm_state;