X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fsvm_handler.c;h=fed3d258f5399d3b842b634f1d656710206491fb;hp=6f58b7c04af9890dc8448c0e72edc59849864fb7;hb=eb87f60800c8634e37d1f8e71cd8f88605f2a46e;hpb=356f5cc77a2783f2917b994be4cf954891828380 diff --git a/palacios/src/palacios/svm_handler.c b/palacios/src/palacios/svm_handler.c index 6f58b7c..fed3d25 100644 --- a/palacios/src/palacios/svm_handler.c +++ b/palacios/src/palacios/svm_handler.c @@ -2,10 +2,11 @@ #include #include #include -#include +#include #include #include + extern struct vmm_os_hooks * os_hooks; @@ -25,6 +26,16 @@ int handle_svm_exit(struct guest_info * info) { info->vm_regs.rsp = guest_state->rsp; + info->ctrl_regs.cr0 = guest_state->cr0; + info->ctrl_regs.cr2 = guest_state->cr2; + info->ctrl_regs.cr3 = guest_state->cr3; + info->ctrl_regs.cr4 = guest_state->cr4; + info->ctrl_regs.cr8 = guest_ctrl->guest_ctrl.V_TPR; + info->ctrl_regs.rflags = guest_state->rflags; + + get_vmcb_segments((vmcb_t*)(info->vmm_data), &(info->segments)); + + exit_code = guest_ctrl->exit_code; PrintDebug("SVM Returned: Exit Code: %x\n",exit_code); @@ -120,11 +131,9 @@ int handle_svm_exit(struct guest_info * info) { 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); - } + + rip_addr = get_addr_linear(info, guest_state->rip, &(info->segments.cs)); + PrintDebug("SVM Returned:(VMCB=%x)\n", info->vmm_data); @@ -204,11 +213,21 @@ int handle_svm_exit(struct guest_info * info) { } + guest_state->cr0 = info->ctrl_regs.cr0; + guest_state->cr2 = info->ctrl_regs.cr2; + guest_state->cr3 = info->ctrl_regs.cr3; + guest_state->cr4 = info->ctrl_regs.cr4; + guest_ctrl->guest_ctrl.V_TPR = info->ctrl_regs.cr8 & 0xff; + guest_state->rflags = info->ctrl_regs.rflags; + guest_state->rax = info->vm_regs.rax; guest_state->rip = info->rip; guest_state->rsp = info->vm_regs.rsp; + + set_vmcb_segments((vmcb_t*)(info->vmm_data), &(info->segments)); + if (exit_code == VMEXIT_INTR) { PrintDebug("INTR ret IP = %x\n", guest_state->rip); }