X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fsvm.c;h=5220c835a55be32c4321123df7b6311e13763311;hb=1316eb77b6d89245583446dab3345f749c415764;hp=76a57ddcb091f6f666de04c90bc677d173fb0ee1;hpb=6ce5a308d167ac392c0f0ca66811f51580358191;p=palacios.git diff --git a/palacios/src/palacios/svm.c b/palacios/src/palacios/svm.c index 76a57dd..5220c83 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)); @@ -386,7 +383,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 +396,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) { @@ -458,6 +455,72 @@ 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 {