X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fsvm.c;h=9fd33ceefb3dc4f6dab5eab46964c49a636329bb;hb=8c8a7e80f9706d4f0af27164ad3b4d26fd36b8fa;hp=986bec8f2e5772ab714eccee1e3c84b961bd76da;hpb=362391accc505b29d938e9d0a21bf6a28a8cee34;p=palacios.git diff --git a/palacios/src/palacios/svm.c b/palacios/src/palacios/svm.c index 986bec8..9fd33ce 100644 --- a/palacios/src/palacios/svm.c +++ b/palacios/src/palacios/svm.c @@ -41,9 +41,11 @@ #include +#include extern void v3_stgi(); extern void v3_clgi(); +//extern int v3_svm_launch(vmcb_t * vmcb, struct v3_gprs * vm_regs, uint64_t * fs, uint64_t * gs); extern int v3_svm_launch(vmcb_t * vmcb, struct v3_gprs * vm_regs); @@ -212,7 +214,7 @@ static void Init_VMCB_BIOS(vmcb_t * vmcb, struct guest_info *vm_info) { ushort_t port = iter->port; uchar_t * bitmap = (uchar_t *)io_port_bitmap; - PrintDebug("%d: Hooking Port %d\n", i, port); + //PrintDebug("%d: Hooking Port %d\n", i, port); bitmap += (port / 8); // PrintDebug("Setting Bit for port 0x%x\n", port); @@ -240,7 +242,7 @@ static void Init_VMCB_BIOS(vmcb_t * vmcb, struct guest_info *vm_info) { /* Testing 64 bit page tables for long paged real mode guests */ // vm_info->direct_map_pt = (addr_t)V3_PAddr(create_passthrough_pts_64(vm_info)); - vm_info->direct_map_pt = (addr_t)V3_PAddr(create_passthrough_pts_32(vm_info)); + vm_info->direct_map_pt = (addr_t)V3_PAddr(v3_create_direct_passthrough_pts(vm_info)); /* End Test */ vm_info->shdw_pg_state.guest_cr0 = 0x0000000000000010LL; @@ -298,6 +300,11 @@ static void Init_VMCB_BIOS(vmcb_t * vmcb, struct guest_info *vm_info) { } + /* Safety locations for fs/gs */ + vm_info->fs = 0; + vm_info->gs = 0; + + } @@ -340,7 +347,7 @@ static int init_svm_guest(struct guest_info *info) { // 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)); + // vmcb_ctrl_t * guest_ctrl = GET_VMCB_CTRL_AREA((vmcb_t*)(info->vmm_data)); uint_t num_exits = 0; @@ -352,7 +359,23 @@ static int start_svm_guest(struct guest_info *info) { while (1) { ullong_t tmp_tsc; - uint_t vm_cr_low = 0, vm_cr_high = 0; + + + +#define MSR_STAR 0xc0000081 +#define MSR_LSTAR 0xc0000082 +#define MSR_CSTAR 0xc0000083 +#define MSR_SF_MASK 0xc0000084 +#define MSR_GS_BASE 0xc0000101 +#define MSR_KERNGS_BASE 0xc0000102 + + + struct v3_msr host_cstar; + struct v3_msr host_star; + struct v3_msr host_lstar; + struct v3_msr host_syscall_mask; + struct v3_msr host_gs_base; + struct v3_msr host_kerngs_base; v3_enable_ints(); v3_clgi(); @@ -364,16 +387,30 @@ static int start_svm_guest(struct guest_info *info) { (void *)(addr_t)info->rip); */ - v3_get_msr(0xc0000101, &vm_cr_high, &vm_cr_low); - rdtscll(info->time_state.cached_host_tsc); + v3_get_msr(MSR_STAR, &(host_star.hi), &(host_star.lo)); + v3_get_msr(MSR_LSTAR, &(host_lstar.hi), &(host_lstar.lo)); + v3_get_msr(MSR_CSTAR, &(host_cstar.hi), &(host_cstar.lo)); + v3_get_msr(MSR_SF_MASK, &(host_syscall_mask.hi), &(host_syscall_mask.lo)); + v3_get_msr(MSR_GS_BASE, &(host_gs_base.hi), &(host_gs_base.lo)); + v3_get_msr(MSR_KERNGS_BASE, &(host_kerngs_base.hi), &(host_kerngs_base.lo)); + - guest_ctrl->TSC_OFFSET = info->time_state.guest_tsc - info->time_state.cached_host_tsc; + rdtscll(info->time_state.cached_host_tsc); + // guest_ctrl->TSC_OFFSET = info->time_state.guest_tsc - info->time_state.cached_host_tsc; + //v3_svm_launch((vmcb_t*)V3_PAddr(info->vmm_data), &(info->vm_regs), &(info->fs), &(info->gs)); v3_svm_launch((vmcb_t*)V3_PAddr(info->vmm_data), &(info->vm_regs)); + rdtscll(tmp_tsc); - v3_set_msr(0xc0000101, vm_cr_high, vm_cr_low); + v3_set_msr(MSR_STAR, host_star.hi, host_star.lo); + v3_set_msr(MSR_LSTAR, host_lstar.hi, host_lstar.lo); + v3_set_msr(MSR_CSTAR, host_cstar.hi, host_cstar.lo); + v3_set_msr(MSR_SF_MASK, host_syscall_mask.hi, host_syscall_mask.lo); + v3_set_msr(MSR_GS_BASE, host_gs_base.hi, host_gs_base.lo); + v3_set_msr(MSR_KERNGS_BASE, host_kerngs_base.hi, host_kerngs_base.lo); + //PrintDebug("SVM Returned\n"); @@ -385,9 +422,10 @@ static int start_svm_guest(struct guest_info *info) { v3_stgi(); - if ((num_exits % 1000) == 0) { + if ((num_exits % 5000) == 0) { PrintDebug("SVM Exit number %d\n", num_exits); - v3_print_profile(info); + if (info->enable_profiler) + v3_print_profile(info); } @@ -461,7 +499,7 @@ int v3_is_svm_capable() { v3_cpuid(CPUID_FEATURE_IDS, &eax, &ebx, &ecx, &edx); - PrintDebug("CPUID_FEATURE_IDS_ecx=0x%p\n", (void *)ecx); + PrintDebug("CPUID_FEATURE_IDS_ecx=%p\n", (void *)ecx); if ((ecx & CPUID_FEATURE_IDS_ecx_svm_avail) == 0) { PrintDebug("SVM Not Available\n"); @@ -476,7 +514,7 @@ int v3_is_svm_capable() { v3_cpuid(CPUID_SVM_REV_AND_FEATURE_IDS, &eax, &ebx, &ecx, &edx); - PrintDebug("CPUID_FEATURE_IDS_edx=0x%p\n", (void *)edx); + PrintDebug("CPUID_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"); @@ -489,8 +527,11 @@ 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_edx=0x%p\n", (void *)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); + if ((edx & CPUID_SVM_REV_AND_FEATURE_IDS_edx_np) == 0) { PrintDebug("SVM Nested Paging not supported\n");