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);
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;
}
- PrintDebug("Injecting Interrupt %d\n", guest_ctrl->EVENTINJ.vector);
+ PrintDebug("Injecting Interrupt %d (EIP=%x)\n", guest_ctrl->EVENTINJ.vector, info->rip);
// IMPORTANT TODO
}
+
+
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;
}
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;
}