#include <palacios/vmm_emulator.h>
#include <palacios/svm_msr.h>
#include <palacios/vmm_profiler.h>
+#include <palacios/vmm_hypercall.h>
// PrintDebug("SVM Returned: Exit Code: 0x%x \t\t(tsc=%ul)\n",exit_code, (uint_t)info->time_state.guest_tsc);
- if ((0) && (exit_code < 0x4f)) {
+ if ((0) && (exit_code <= VMEXIT_EXCP14)) {
uchar_t instr[32];
int ret;
// Dump out the instr stream
//PrintDebug("RIP: %x\n", guest_state->rip);
- PrintDebug("RIP Linear: %p\n", (void *)get_addr_linear(info, info->rip, &(info->segments.cs)));
+ PrintDebug("\n\n\nRIP Linear: %p\n", (void *)get_addr_linear(info, info->rip, &(info->segments.cs)));
+
+ v3_print_GPRs(info);
+ v3_print_ctrl_regs(info);
+
// OK, now we will read the instruction
// The only difference between PROTECTED and PROTECTED_PG is whether we read
ret = read_guest_va_memory(info, get_addr_linear(info, info->rip, &(info->segments.cs)), 32, instr);
}
+
+
if (ret != 32) {
// I think we should inject a GPF into the guest
PrintDebug("Could not read instruction (ret=%d)\n", ret);
*/
break;
}
+
+
+
+ case VMEXIT_VMMCALL:
+ {
+ /*
+ * Hypercall
+ */
+
+ if (v3_handle_hypercall(info) == -1) {
+ return -1;
+ }
+
+ // VMMCALL is a 3 byte op
+ info->rip += 3;
+ break;
+ }
+
+
case VMEXIT_INTR:
{
// handled by interrupt dispatch earlier
break;
-#if 0
- // Emulation handlers currently not used
- case VMEXIT_EXCP1:
- {
-#ifdef DEBUG_EMULATOR
- PrintDebug("DEBUG EXCEPTION\n");
-#endif
- if (info->run_state == VM_EMULATING) {
- if (v3_emulation_exit_handler(info) == -1) {
- return -1;
- }
- } else {
- PrintError("VMMCALL with not emulator...\n");
- return -1;
- }
- break;
- }
-
-
- case VMEXIT_VMMCALL:
- {
-#ifdef DEBUG_EMULATOR
- PrintDebug("VMMCALL\n");
-#endif
- if (info->run_state == VM_EMULATING) {
- if (v3_emulation_exit_handler(info) == -1) {
- return -1;
- }
- } else {
- /*
- ulong_t tsc_spread = 0;
- ullong_t exit_tsc = 0;
-
- ulong_t rax = (ulong_t)info->vm_regs.rbx;
- ulong_t rdx = (ulong_t)info->vm_regs.rcx;
-
- *(ulong_t *)(&exit_tsc) = rax;
- *(((ulong_t *)(&exit_tsc)) + 1) = rdx;
-
- tsc_spread = info->exit_tsc - exit_tsc;
-
- PrintError("VMMCALL tsc diff = %lu\n",tsc_spread);
- info->rip += 3;
- */
- PrintError("VMMCALL with not emulator...\n");
- return -1;
- }
- break;
- }
-#endif
case VMEXIT_WBINVD:
#ifdef DEBUG_EMULATOR
PrintDebug("WBINVD\n");
#endif
- if (!v3_handle_svm_wbinvd(info)) {
+ if (v3_handle_svm_wbinvd(info) == -1) {
return -1;
}
break;
/* Exits Following this line are NOT HANDLED */
/*=======================================================================*/
- default: {
-
- addr_t rip_addr;
- uchar_t buf[15];
- addr_t host_addr;
-
- PrintDebug("Unhandled SVM Exit: %s\n", vmexit_code_to_str(exit_code));
-
- rip_addr = get_addr_linear(info, guest_state->rip, &(info->segments.cs));
-
-
- PrintError("SVM Returned:(VMCB=%p)\n", (void *)(info->vmm_data));
- PrintError("RIP: %p\n", (void *)(addr_t)(guest_state->rip));
- PrintError("RIP Linear: %p\n", (void *)(addr_t)(rip_addr));
-
- PrintError("SVM Returned: Exit Code: %p\n", (void *)(addr_t)exit_code);
-
- PrintError("io_info1 low = 0x%.8x\n", *(uint_t*)&(guest_ctrl->exit_info1));
- PrintError("io_info1 high = 0x%.8x\n", *(uint_t *)(((uchar_t *)&(guest_ctrl->exit_info1)) + 4));
-
- PrintError("io_info2 low = 0x%.8x\n", *(uint_t*)&(guest_ctrl->exit_info2));
- PrintError("io_info2 high = 0x%.8x\n", *(uint_t *)(((uchar_t *)&(guest_ctrl->exit_info2)) + 4));
-
-
- return -1;
+ default:
+ {
- }
+ addr_t rip_addr;
+
+ PrintDebug("Unhandled SVM Exit: %s\n", vmexit_code_to_str(exit_code));
+
+ rip_addr = get_addr_linear(info, guest_state->rip, &(info->segments.cs));
+
+
+ PrintError("SVM Returned:(VMCB=%p)\n", (void *)(info->vmm_data));
+ PrintError("RIP: %p\n", (void *)(addr_t)(guest_state->rip));
+ PrintError("RIP Linear: %p\n", (void *)(addr_t)(rip_addr));
+
+ PrintError("SVM Returned: Exit Code: %p\n", (void *)(addr_t)exit_code);
+
+ PrintError("io_info1 low = 0x%.8x\n", *(uint_t*)&(guest_ctrl->exit_info1));
+ PrintError("io_info1 high = 0x%.8x\n", *(uint_t *)(((uchar_t *)&(guest_ctrl->exit_info1)) + 4));
+
+ PrintError("io_info2 low = 0x%.8x\n", *(uint_t*)&(guest_ctrl->exit_info2));
+ PrintError("io_info2 high = 0x%.8x\n", *(uint_t *)(((uchar_t *)&(guest_ctrl->exit_info2)) + 4));
+
+
+ if (info->shdw_pg_mode == SHADOW_PAGING) {
+ PrintHostPageTables(info, info->ctrl_regs.cr3);
+ //PrintGuestPageTables(info, info->shdw_pg_state.guest_cr3);
+ }
+
+ return -1;
+
+ }
break;
-
+
}
// END OF SWITCH (EXIT_CODE)