X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmx_ctrl_regs.c;h=6bbde364fcf7b29c04c18f55b0431b0dda9ba3a9;hb=1f9fa9cd9662a600f49a3b12fcc02fd2ffca93c8;hp=eb12760009d79599c2f8d3c8b1206b1eed90e0e3;hpb=b1f2d60bdd24fb6f758ad049c0a6859966a38955;p=palacios.git diff --git a/palacios/src/palacios/vmx_ctrl_regs.c b/palacios/src/palacios/vmx_ctrl_regs.c index eb12760..6bbde36 100644 --- a/palacios/src/palacios/vmx_ctrl_regs.c +++ b/palacios/src/palacios/vmx_ctrl_regs.c @@ -27,6 +27,11 @@ #include #include +#ifndef V3_CONFIG_DEBUG_VMX +#undef PrintDebug +#define PrintDebug(fmt, args...) +#endif + static v3_reg_t * get_reg_ptr(struct guest_info * info, struct vmx_exit_cr_qual * cr_qual); static int handle_mov_to_cr0(struct guest_info * info, v3_reg_t * new_val, struct vmx_exit_info * exit_info); static int handle_mov_to_cr3(struct guest_info * info, v3_reg_t * cr3_reg); @@ -156,7 +161,7 @@ static int handle_mov_to_cr0(struct guest_info * info, v3_reg_t * new_cr0, struc return -1; } - if (vmx_info->state == VMXASSIST_ENABLED) { + if (vmx_info->assist_state == VMXASSIST_ENABLED) { PrintDebug("Loading VMXASSIST at RIP: %p\n", (void *)(addr_t)info->rip); } else { PrintDebug("Leaving VMXASSIST and entering protected mode at RIP: %p\n", @@ -187,7 +192,7 @@ static int handle_mov_to_cr0(struct guest_info * info, v3_reg_t * new_cr0, struc guest_cr0->pg = 1; guest_cr0->ne = 1; - if (paging_transition) { + if ((paging_transition)) { // Paging transition if (v3_get_vm_mem_mode(info) == VIRTUAL_MEM) { @@ -204,14 +209,24 @@ static int handle_mov_to_cr0(struct guest_info * info, v3_reg_t * new_cr0, struc // PrintDebug("Activating Shadow Page tables\n"); - if (v3_activate_shadow_pt(info) == -1) { - PrintError("Failed to activate shadow page tables\n"); - return -1; + if (info->shdw_pg_mode == SHADOW_PAGING) { + 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; + } else { + + if (info->shdw_pg_mode == SHADOW_PAGING) { + if (v3_activate_passthrough_pt(info) == -1) { + PrintError("Failed to activate passthrough page tables\n"); + return -1; + } + } else { + // This is hideous... Let's hope that the 1to1 page table has not been nuked... + info->ctrl_regs.cr3 = VMXASSIST_1to1_PT; + } } } }