X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmx.c;h=b9f99bd04f3e99228eb236aac641932da30a6c67;hb=0c31bb41ac41d04a891a6eeff5bae398fa89b419;hp=2a461b972bcfdd9dfe00cb5096d7ddb8134fbd35;hpb=3e5e5a12e64630d7a37ed32b8d7e2d993c79f7e0;p=palacios.git diff --git a/palacios/src/palacios/vmx.c b/palacios/src/palacios/vmx.c index 2a461b9..b9f99bd 100644 --- a/palacios/src/palacios/vmx.c +++ b/palacios/src/palacios/vmx.c @@ -199,10 +199,7 @@ static int init_vmcs_bios(struct guest_info * info, struct vmx_data * vmx_state) /********** Setup and VMX Control Fields from MSR ***********/ /* Setup IO map */ - /***** THEES NEED TO BE MOVED TO A GLOBAL LOCATION ***/ - v3_init_vmx_io_map(info->vm_info); - v3_init_vmx_msr_map(info->vm_info); - /**** ****/ + struct v3_msr tmp_msr; @@ -344,7 +341,7 @@ static int init_vmcs_bios(struct guest_info * info, struct vmx_data * vmx_state) #define VMXASSIST_GDT 0x10000 addr_t vmxassist_gdt = 0; - if (guest_pa_to_host_va(info, VMXASSIST_GDT, &vmxassist_gdt) == -1) { + if (v3_gpa_to_hva(info, VMXASSIST_GDT, &vmxassist_gdt) == -1) { PrintError("Could not find VMXASSIST GDT destination\n"); return -1; } @@ -378,7 +375,7 @@ static int init_vmcs_bios(struct guest_info * info, struct vmx_data * vmx_state) extern uint8_t v3_vmxassist_end[]; addr_t vmxassist_dst = 0; - if (guest_pa_to_host_va(info, VMXASSIST_START, &vmxassist_dst) == -1) { + if (v3_gpa_to_hva(info, VMXASSIST_START, &vmxassist_dst) == -1) { PrintError("Could not find VMXASSIST destination\n"); return -1; } @@ -497,7 +494,7 @@ static int update_irq_entry_state(struct guest_info * info) { int_info.valid = 1; #ifdef CONFIG_DEBUG_INTERRUPTS - PrintDebug("Injecting exception %d (EIP=%p)\n", int_info.vector, (void *)info->rip); + PrintDebug("Injecting exception %d (EIP=%p)\n", int_info.vector, (void *)(addr_t)info->rip); #endif check_vmcs_write(VMCS_ENTRY_INT_INFO, int_info.value); @@ -539,7 +536,7 @@ static int update_irq_entry_state(struct guest_info * info) { PrintDebug("Injecting Interrupt %d at exit %u(EIP=%p)\n", info->intr_core_state.irq_vector, (uint32_t)info->num_exits, - (void *)info->rip); + (void *)(addr_t)info->rip); #endif check_vmcs_write(VMCS_ENTRY_INT_INFO, ent_int.value); @@ -647,8 +644,8 @@ int v3_vmx_enter(struct guest_info * info) { v3_vmx_restore_vmcs(info); -#ifdef CONFIG_SYMBIOTIC - if (info->vm_info->sym_state.symcalls[info->cpu_id].sym_call_active == 0) { +#ifdef CONFIG_SYMCALL + if (info->sym_core_state.symcall_state.sym_call_active == 0) { update_irq_entry_state(info); } #else @@ -661,6 +658,9 @@ int v3_vmx_enter(struct guest_info * info) { vmcs_write(VMCS_GUEST_CR3, guest_cr3); } + // We do timer injection here to track real host time. + rdtscll(tmp_tsc); + v3_update_time(info, tmp_tsc - info->time_state.cached_host_tsc); rdtscll(info->time_state.cached_host_tsc); if (info->vm_info->run_state == VM_STOPPED) { @@ -681,11 +681,11 @@ int v3_vmx_enter(struct guest_info * info) { return -1; } - rdtscll(tmp_tsc); + // rdtscll(tmp_tsc); + // v3_update_time(info, tmp_tsc - info->time_state.cached_host_tsc); info->num_exits++; - v3_update_time(info, tmp_tsc - info->time_state.cached_host_tsc); /* Update guest state */ v3_vmx_save_vmcs(info); @@ -709,8 +709,8 @@ int v3_vmx_enter(struct guest_info * info) { exit_log[info->num_exits % 10] = exit_info; -#ifdef CONFIG_SYMBIOTIC - if (info->vm_info->sym_state.symcalls[info->cpu_id].sym_call_active == 0) { +#ifdef CONFIG_SYMCALL + if (info->sym_core_state.symcall_state.sym_call_active == 0) { update_irq_exit_state(info); } #else @@ -797,7 +797,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;" @@ -826,6 +826,38 @@ void v3_init_vmx_cpu(int cpu_id) { : : "%rbx" ); +#elif __V3_32BIT__ + __asm__ __volatile__ ( + "movl %%cr4, %%ecx;" + "orl $0x00002000, %%ecx;" + "movl %%ecx, %0;" + : "=m"(ret) + : + : "%ecx" + ); + + if ((~ret & tmp_msr.value) == 0) { + __asm__ __volatile__ ( + "movl %0, %%cr4;" + : + : "q"(ret) + ); + } else { + PrintError("Invalid CR4 Settings!\n"); + return; + } + + __asm__ __volatile__ ( + "movl %%cr0, %%ecx; " + "orl $0x00000020,%%ecx; " + "movl %%ecx, %%cr0;" + : + : + : "%ecx" + ); + +#endif + // // Should check and return Error here....