X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fsvm.c;h=4913513a55b5b1465c31df6a5b2b04222ce16a0e;hb=a6abc36ea941eb0f63783eb077d4073c8773719d;hp=bb0e2178eb35b3ad7c9674b98e7572703cbee1d1;hpb=04977d080b9850506ced2523b6130abc517b61df;p=palacios.git diff --git a/palacios/src/palacios/svm.c b/palacios/src/palacios/svm.c index bb0e217..4913513 100644 --- a/palacios/src/palacios/svm.c +++ b/palacios/src/palacios/svm.c @@ -50,7 +50,7 @@ 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); @@ -133,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]; @@ -164,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); @@ -297,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(); v3_clgi(); - // PrintDebug("SVM Entry to rip=%x...\n", info->rip); + { + + 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("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; - v3_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++; + PrintDebug("Turning on global interrupts\n"); v3_stgi(); - if ((num_exits % 25) == 0) { - PrintDebug("SVM Exit number %d\n", num_exits); - } + + PrintDebug("SVM Exit number %d\n", num_exits); + if (v3_handle_svm_exit(info) != 0) { @@ -338,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); }