X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fgeekos%2Fsvm.c;h=68704309ce6e813c605e134d626356551bb5b9eb;hb=c7e3f043b6458083162e23e1a8adb7703fd06559;hp=18ddcb51c9ba46d08a8cf642d735ab6f1680bc96;hpb=8cb3daaded0d8c80be801aa74493006b5a06999f;p=palacios.releases.git diff --git a/palacios/src/geekos/svm.c b/palacios/src/geekos/svm.c index 18ddcb5..6870430 100644 --- a/palacios/src/geekos/svm.c +++ b/palacios/src/geekos/svm.c @@ -111,19 +111,21 @@ int init_svm_guest(struct guest_info *info) { //info->page_tables = generate_guest_page_tables(&(info->mem_layout), &(info->mem_list)); //PrintDebugPageTables(info->page_tables); - PrintDebug("Initializing VMCB (addr=%x)\n", info->vmm_data); Init_VMCB((vmcb_t*)(info->vmm_data), *info); - - info->vm_regs.rbx = 0; - info->vm_regs.rcx = 0; - info->vm_regs.rdx = 0; - info->vm_regs.rsi = 0; + // info->rip = 0; + info->vm_regs.rdi = 0; + info->vm_regs.rsi = 0; info->vm_regs.rbp = 0; - + info->vm_regs.rsp = 0; + info->vm_regs.rbx = 0; + info->vm_regs.rdx = 0; + info->vm_regs.rcx = 0; + info->vm_regs.rax = 0; + return 0; } @@ -138,11 +140,14 @@ int start_svm_guest(struct guest_info *info) { while (1) { + PrintDebug("SVM Launch Args (vmcb=%x), (info=%x), (vm_regs=%x)\n", info->vmm_data, &(info->vm_regs)); + PrintDebug("Launching to RIP: %x\n", info->rip); safe_svm_launch((vmcb_t*)(info->vmm_data), &(info->vm_regs)); //launch_svm((vmcb_t*)(info->vmm_data)); PrintDebug("SVM Returned\n"); if (handle_svm_exit(info) != 0) { + // handle exit code.... break; } } @@ -167,17 +172,13 @@ void Init_VMCB_Real(vmcb_t * vmcb, struct guest_info vm_info) { uint_t i; - guest_state->rsp = vm_info.rsp; + guest_state->rsp = vm_info.vm_regs.rsp; guest_state->rip = vm_info.rip; - - - guest_state->efer |= EFER_MSR_svm_enable; guest_state->rflags = 0x00000002; // The reserved bit is always 1 ctrl_area->svm_instrs.instrs.VMRUN = 1; - // guest_state->cr0 = 0x00000001; // PE ctrl_area->guest_ASID = 1; guest_state->cr0 = 0x60000010; @@ -256,9 +257,6 @@ void Init_VMCB_Real(vmcb_t * vmcb, struct guest_info vm_info) { *bitmap |= 1 << (port % 8); } - // memset((uchar_t*)io_port_bitmap, 0xff, PAGE_SIZE * 2); - //PrintDebugMemDump((uchar_t*)io_port_bitmap, PAGE_SIZE *2); - ctrl_area->instrs.instrs.IOIO_PROT = 1; } @@ -284,6 +282,7 @@ void Init_VMCB_Real(vmcb_t * vmcb, struct guest_info vm_info) { guest_state->g_pat = 0x7040600070406ULL; + vm_info.shdw_pg_state.guest_cr0.e_reg.low = guest_state->cr0; guest_state->cr0 |= 0x80000000; } else if (vm_info.page_mode == NESTED_PAGING) { // Flush the TLB on entries/exits @@ -313,7 +312,7 @@ void Init_VMCB(vmcb_t * vmcb, struct guest_info vm_info) { uint_t i; - guest_state->rsp = vm_info.rsp; + guest_state->rsp = vm_info.vm_regs.rsp; guest_state->rip = vm_info.rip; @@ -433,7 +432,7 @@ void Init_VMCB_pe(vmcb_t *vmcb, struct guest_info vm_info) { uint_t i = 0; - guest_state->rsp = vm_info.rsp; + guest_state->rsp = vm_info.vm_regs.rsp; guest_state->rip = vm_info.rip;