X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmx.c;h=4a8c0213aba81335461c02891e94f2137e7dd2b2;hp=2526f3dea8a5abd226d41a6b0111d2f77c25cff8;hb=9bc5c1ff326aa6ac111e1d3824c93770391aef23;hpb=4bdba551de0969275a9b3ea6db8d99c6c25548a3 diff --git a/palacios/src/palacios/vmx.c b/palacios/src/palacios/vmx.c index 2526f3d..4a8c021 100644 --- a/palacios/src/palacios/vmx.c +++ b/palacios/src/palacios/vmx.c @@ -652,6 +652,11 @@ int v3_vmx_enter(struct guest_info * info) { update_irq_entry_state(info); #endif + { + addr_t guest_cr3; + vmcs_read(VMCS_GUEST_CR3, &guest_cr3); + vmcs_write(VMCS_GUEST_CR3, guest_cr3); + } rdtscll(info->time_state.cached_host_tsc); @@ -682,6 +687,8 @@ int v3_vmx_enter(struct guest_info * info) { /* Update guest state */ v3_vmx_save_vmcs(info); + // info->cpl = info->segments.cs.selector & 0x3; + info->mem_mode = v3_get_vm_mem_mode(info); info->cpu_mode = v3_get_vm_cpu_mode(info); @@ -787,7 +794,7 @@ void v3_init_vmx_cpu(int cpu_id) { uint64_t ret = 0; v3_get_msr(VMX_CR4_FIXED0_MSR,&(tmp_msr.hi),&(tmp_msr.lo)); - +#ifdef __V3_64BIT__ __asm__ __volatile__ ( "movq %%cr4, %%rbx;" "orq $0x00002000, %%rbx;" @@ -816,6 +823,38 @@ void v3_init_vmx_cpu(int cpu_id) { : : "%rbx" ); +#elif __V3_32BIT__ + __asm__ __volatile__ ( + "movq %%cr4, %%ecx;" + "orq $0x00002000, %%ecx;" + "movq %%ecx, %0;" + : "=m"(ret) + : + : "%ecx" + ); + + if ((~ret & tmp_msr.value) == 0) { + __asm__ __volatile__ ( + "movq %0, %%cr4;" + : + : "q"(ret) + ); + } else { + PrintError("Invalid CR4 Settings!\n"); + return; + } + + __asm__ __volatile__ ( + "movq %%cr0, %%ecx; " + "orq $0x00000020,%%ecx; " + "movq %%ecx, %%cr0;" + : + : + : "%ecx" + ); + +#endif + // // Should check and return Error here....