X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fsvm_handler.c;h=ab2faae187b1cba181dd8f8c0a598ef09b06321e;hb=1831ffe56d9eeb2bde9b5584227dcaf958dad70d;hp=8277335d9e849e687e7f35a054ffdc2be3e7be3c;hpb=4b013fe3750a387fc034352a7e4379f025dad7c2;p=palacios-OLD.git diff --git a/palacios/src/palacios/svm_handler.c b/palacios/src/palacios/svm_handler.c index 8277335..ab2faae 100644 --- a/palacios/src/palacios/svm_handler.c +++ b/palacios/src/palacios/svm_handler.c @@ -93,10 +93,16 @@ int handle_svm_exit(struct guest_info * info) { PrintDebug("Guest halted\n"); return -1; } else { - addr_t rip_addr = get_addr_linear(info, guest_state->rip, guest_state->cs.selector); + addr_t rip_addr; char buf[15]; addr_t host_addr; + if (info->cpu_mode == REAL) { + rip_addr = get_addr_linear(info, guest_state->rip, guest_state->cs.selector); + } else { + rip_addr = get_addr_linear(info, guest_state->rip, guest_state->cs.base); + } + PrintDebug("SVM Returned:(VMCB=%x)\n", info->vmm_data); PrintDebug("RIP: %x\n", guest_state->rip); @@ -141,6 +147,7 @@ int handle_svm_exit(struct guest_info * info) { guest_ctrl->EVENTINJ.vector = get_intr_number(&(info->intr_state)); guest_ctrl->EVENTINJ.valid = 1; guest_ctrl->EVENTINJ.type = SVM_INJECTION_EXTERNAL_INTR; + break; case NMI: guest_ctrl->EVENTINJ.type = SVM_INJECTION_NMI; @@ -163,7 +170,7 @@ int handle_svm_exit(struct guest_info * info) { } - PrintDebug("Injecting Interrupt %d\n", guest_ctrl->EVENTINJ.vector); + PrintDebug("Injecting Interrupt %d (EIP=%x)\n", guest_ctrl->EVENTINJ.vector, info->rip); // IMPORTANT TODO @@ -173,10 +180,16 @@ int handle_svm_exit(struct guest_info * info) { } + + guest_state->rax = info->vm_regs.rax; guest_state->rip = info->rip; guest_state->rsp = info->vm_regs.rsp; + if (exit_code == VMEXIT_INTR) { + PrintDebug("INTR ret IP = %x\n", guest_state->rip); + } + return 0; } @@ -206,19 +219,8 @@ int handle_svm_intr(struct guest_info * info) { PrintDebug("SVM Returned: Exit Code: %x\n",guest_ctrl->exit_code); PrintDebug("V_INTR_VECTOR: 0x%x\n", guest_ctrl->guest_ctrl.V_INTR_VECTOR); - - - while(1); - - - - - - - - return 0; }