X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fsvm.c;h=c7da4a406e5a9154e71df71b1f4e2f2156ecee88;hb=e058c75f238c6662f6ae1cd517bbca030cc130ab;hp=76a57ddcb091f6f666de04c90bc677d173fb0ee1;hpb=6ce5a308d167ac392c0f0ca66811f51580358191;p=palacios.git diff --git a/palacios/src/palacios/svm.c b/palacios/src/palacios/svm.c index 76a57dd..c7da4a4 100644 --- a/palacios/src/palacios/svm.c +++ b/palacios/src/palacios/svm.c @@ -266,9 +266,6 @@ static int init_svm_guest(struct guest_info * info, struct v3_vm_config * config return 0; } - - -// can we start a kernel thread here... static int start_svm_guest(struct guest_info *info) { // vmcb_saved_state_t * guest_state = GET_VMCB_SAVE_STATE_AREA((vmcb_t*)(info->vmm_data)); // vmcb_ctrl_t * guest_ctrl = GET_VMCB_CTRL_AREA((vmcb_t*)(info->vmm_data)); @@ -340,13 +337,14 @@ static int start_svm_guest(struct guest_info *info) { PrintDebug("exit_info2 low = 0x%.8x\n", *(uint_t*)&(guest_ctrl->exit_info2)); PrintDebug("exit_info2 high = 0x%.8x\n", *(uint_t *)(((uchar_t *)&(guest_ctrl->exit_info2)) + 4)); + linear_addr = get_addr_linear(info, info->rip, &(info->segments.cs)); + if (info->mem_mode == PHYSICAL_MEM) { guest_pa_to_host_va(info, linear_addr, &host_addr); } else if (info->mem_mode == VIRTUAL_MEM) { guest_va_to_host_va(info, linear_addr, &host_addr); } - PrintDebug("Host Address of rip = 0x%p\n", (void *)host_addr); PrintDebug("Instr (15 bytes) at %p:\n", (void *)host_addr); @@ -386,7 +384,7 @@ int v3_is_svm_capable() { v3_cpuid(CPUID_SVM_REV_AND_FEATURE_IDS, &eax, &ebx, &ecx, &edx); - PrintDebug("CPUID_FEATURE_IDS_edx=%p\n", (void *)edx); + PrintDebug("CPUID_SVM_REV_AND_FEATURE_IDS_edx=%p\n", (void *)edx); if ((edx & CPUID_SVM_REV_AND_FEATURE_IDS_edx_svml) == 0) { PrintDebug("SVM BIOS Disabled, not unlockable\n"); @@ -399,10 +397,10 @@ int v3_is_svm_capable() { PrintDebug("SVM is available and enabled.\n"); v3_cpuid(CPUID_SVM_REV_AND_FEATURE_IDS, &eax, &ebx, &ecx, &edx); - PrintDebug("CPUID_FEATURE_IDS_eax=%p\n", (void *)eax); - PrintDebug("CPUID_FEATURE_IDS_ebx=%p\n", (void *)ebx); - PrintDebug("CPUID_FEATURE_IDS_ecx=%p\n", (void *)ecx); - PrintDebug("CPUID_FEATURE_IDS_edx=%p\n", (void *)edx); + PrintDebug("CPUID_SVM_REV_AND_FEATURE_IDS_eax=%p\n", (void *)eax); + PrintDebug("CPUID_SVM_REV_AND_FEATURE_IDS_ebx=%p\n", (void *)ebx); + PrintDebug("CPUID_SVM_REV_AND_FEATURE_IDS_ecx=%p\n", (void *)ecx); + PrintDebug("CPUID_SVM_REV_AND_FEATURE_IDS_edx=%p\n", (void *)edx); if ((edx & CPUID_SVM_REV_AND_FEATURE_IDS_edx_np) == 0) { @@ -445,11 +443,9 @@ void v3_init_SVM(struct v3_ctrl_ops * vmm_ops) { PrintDebug("SVM Enabled\n"); - // Setup the host state save area host_vmcb = V3_AllocPages(4); - /* 64-BIT-ISSUE */ // msr.e_reg.high = 0; //msr.e_reg.low = (uint_t)host_vmcb; @@ -458,6 +454,61 @@ void v3_init_SVM(struct v3_ctrl_ops * vmm_ops) { PrintDebug("Host State being saved at %p\n", (void *)(addr_t)host_vmcb); v3_set_msr(SVM_VM_HSAVE_PA_MSR, msr.e_reg.high, msr.e_reg.low); + /* + * Test VMSAVE/VMLOAD Latency + */ +#define vmsave ".byte 0x0F,0x01,0xDB ; " +#define vmload ".byte 0x0F,0x01,0xDA ; " + { + uint32_t start_lo, start_hi; + uint32_t end_lo, end_hi; + uint64_t start, end; + + __asm__ __volatile__ ( + "rdtsc ; " + "movl %%eax, %%esi ; " + "movl %%edx, %%edi ; " + "movq %%rcx, %%rax ; " + vmsave + "rdtsc ; " + : "=D"(start_hi), "=S"(start_lo), "=a"(end_lo),"=d"(end_hi) + : "c"(host_vmcb), "0"(0), "1"(0), "2"(0), "3"(0) + ); + + start = start_hi; + start <<= 32; + start += start_lo; + + end = end_hi; + end <<= 32; + end += end_lo; + + PrintDebug("VMSave Cycle Latency: %d\n", (uint32_t)(end - start)); + + __asm__ __volatile__ ( + "rdtsc ; " + "movl %%eax, %%esi ; " + "movl %%edx, %%edi ; " + "movq %%rcx, %%rax ; " + vmload + "rdtsc ; " + : "=D"(start_hi), "=S"(start_lo), "=a"(end_lo),"=d"(end_hi) + : "c"(host_vmcb), "0"(0), "1"(0), "2"(0), "3"(0) + ); + + start = start_hi; + start <<= 32; + start += start_lo; + + end = end_hi; + end <<= 32; + end += end_lo; + + + PrintDebug("VMLoad Cycle Latency: %d\n", (uint32_t)(end - start)); + } + /* End Latency Test */ + if (has_svm_nested_paging() == 1) { v3_cpu_type = V3_SVM_REV3_CPU; } else {