X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fsvm.c;h=4913513a55b5b1465c31df6a5b2b04222ce16a0e;hb=a6abc36ea941eb0f63783eb077d4073c8773719d;hp=e59e96a82ebb5a0c71a6d13e7b0ee8b7f0ae8264;hpb=773e6e7d212b3ece194cd0e75a383db7d2b9a2b1;p=palacios.git diff --git a/palacios/src/palacios/svm.c b/palacios/src/palacios/svm.c index e59e96a..4913513 100644 --- a/palacios/src/palacios/svm.c +++ b/palacios/src/palacios/svm.c @@ -38,25 +38,19 @@ - -extern uint_t launch_svm(vmcb_t * vmcb_addr); -extern void safe_svm_launch(vmcb_t * vmcb_addr, struct v3_gprs * gprs); - -extern void STGI(); -extern void CLGI(); - extern uint_t Get_CR3(); - - +extern void v3_stgi(); +extern void v3_clgi(); +extern int v3_svm_launch(vmcb_t * vmcb, struct v3_gprs * vm_regs); static vmcb_t * Allocate_VMCB() { - vmcb_t * vmcb_page = (vmcb_t *)V3_AllocPages(1); + vmcb_t * vmcb_page = (vmcb_t *)V3_VAddr(V3_AllocPages(1)); memset(vmcb_page, 0, 4096); @@ -139,6 +133,10 @@ static void Init_VMCB_BIOS(vmcb_t * vmcb, struct guest_info *vm_info) { guest_state->cs.attrib.raw = 0xf3; + /* DEBUG FOR RETURN CODE */ + ctrl_area->exit_code = 1; + + struct vmcb_selector *segregs [] = {&(guest_state->ss), &(guest_state->ds), &(guest_state->es), &(guest_state->fs), &(guest_state->gs), NULL}; for ( i = 0; segregs[i] != NULL; i++) { struct vmcb_selector * seg = segregs[i]; @@ -170,10 +168,10 @@ static void Init_VMCB_BIOS(vmcb_t * vmcb, struct guest_info *vm_info) { struct vmm_io_hook * iter; addr_t io_port_bitmap; - io_port_bitmap = (addr_t)V3_AllocPages(3); + io_port_bitmap = (addr_t)V3_VAddr(V3_AllocPages(3)); memset((uchar_t*)io_port_bitmap, 0, PAGE_SIZE * 3); - ctrl_area->IOPM_BASE_PA = io_port_bitmap; + ctrl_area->IOPM_BASE_PA = (addr_t)V3_PAddr((void *)io_port_bitmap); //PrintDebug("Setting up IO Map at 0x%x\n", io_port_bitmap); @@ -303,30 +301,65 @@ 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; v3_enable_ints(); - CLGI(); + v3_clgi(); + + { + + v3_get_msr(0xc0000101, &vm_cr_high, &vm_cr_low); + + PrintDebug("GS.Base: %x:%x\n", vm_cr_high, vm_cr_low); + /* + v3_get_msr(0xc0000102, &vm_cr_high, &vm_cr_low); - // PrintDebug("SVM Entry to rip=%x...\n", info->rip); + PrintDebug("KernelGSBase: %x:%x\n", vm_cr_high, vm_cr_low); + */ + + } + + PrintDebug("SVM Entry to rip=%x...\n", info->rip); rdtscll(info->time_state.cached_host_tsc); guest_ctrl->TSC_OFFSET = info->time_state.guest_tsc - info->time_state.cached_host_tsc; - safe_svm_launch((vmcb_t*)(info->vmm_data), &(info->vm_regs)); + v3_svm_launch((vmcb_t*)V3_PAddr(info->vmm_data), &(info->vm_regs)); rdtscll(tmp_tsc); - //PrintDebug("SVM Returned\n"); + PrintDebug("SVM Returned\n"); + + + { + + v3_set_msr(0xc0000101, vm_cr_high, vm_cr_low); + + PrintDebug("GS.Base: %x:%x\n", vm_cr_high, vm_cr_low); + + /* + v3_get_msr(0xc0000102, &vm_cr_high, &vm_cr_low); + + PrintDebug("KernelGSBase: %x:%x\n", vm_cr_high, vm_cr_low); + */ + + } + + { + uint_t x = 0; + PrintDebug("RSP=%p\n", &x); + } v3_update_time(info, tmp_tsc - info->time_state.cached_host_tsc); num_exits++; - STGI(); + PrintDebug("Turning on global interrupts\n"); + v3_stgi(); + + + PrintDebug("SVM Exit number %d\n", num_exits); - if ((num_exits % 25) == 0) { - PrintDebug("SVM Exit number %d\n", num_exits); - } if (v3_handle_svm_exit(info) != 0) { @@ -344,15 +377,15 @@ static int start_svm_guest(struct guest_info *info) { linear_addr = get_addr_linear(info, guest_state->rip, &(info->segments.cs)); - PrintDebug("RIP Linear: %x\n", linear_addr); + PrintDebug("RIP Linear: %\n", linear_addr); v3_print_segments(info); v3_print_ctrl_regs(info); v3_print_GPRs(info); if (info->mem_mode == PHYSICAL_MEM) { - guest_pa_to_host_pa(info, linear_addr, &host_addr); + guest_pa_to_host_va(info, linear_addr, &host_addr); } else if (info->mem_mode == VIRTUAL_MEM) { - guest_va_to_host_pa(info, linear_addr, &host_addr); + guest_va_to_host_va(info, linear_addr, &host_addr); } @@ -378,7 +411,7 @@ int v3_is_svm_capable() { #if 1 // Dinda uint_t vm_cr_low = 0, vm_cr_high = 0; - uint_t eax = 0, ebx = 0, ecx = 0, edx = 0; + addr_t eax = 0, ebx = 0, ecx = 0, edx = 0; v3_cpuid(CPUID_FEATURE_IDS, &eax, &ebx, &ecx, &edx); @@ -426,7 +459,7 @@ int v3_is_svm_capable() { #else uint_t eax = 0, ebx = 0, ecx = 0, edx = 0; - uint_t vm_cr_low = 0, vm_cr_high = 0; + addr_t vm_cr_low = 0, vm_cr_high = 0; v3_cpuid(CPUID_FEATURE_IDS, &eax, &ebx, &ecx, &edx); @@ -468,7 +501,7 @@ int v3_is_svm_capable() { } static int has_svm_nested_paging() { - uint_t eax = 0, ebx = 0, ecx = 0, edx = 0; + addr_t eax = 0, ebx = 0, ecx = 0, edx = 0; v3_cpuid(CPUID_SVM_REV_AND_FEATURE_IDS, &eax, &ebx, &ecx, &edx);