static void vmx_vmexit_show_info() { printf("qualification : 0x%X\n", vm_exit_info.qualification.raw); if(vm_exit_info.reason.basic == VMX_VMEXIT_EPT_CONF) { offset_t vaddr; pg_wlk_t wlk; int mode; vm_get_code_addr(&vaddr, 0, &mode); npg_walk(vaddr, &wlk); } else if(vm_exit_info.reason.basic == VMX_VMEXIT_EPT) { pg_wlk_t wlk; printf("-\n" " . glinear : 0x%X\n" " . gphysical : 0x%X\n" ,vm_exit_info.guest_linear.raw ,vm_exit_info.guest_physical.raw ); npg_walk(vm_exit_info.guest_physical.raw, &wlk); } else if(vm_exit_info.reason.basic == VMX_VMEXIT_CR_ACCESS) { printf("-\n" " . cr num : %d\n" " . type : %d\n" " . lmsw op : %d\n" " . gpr : %d\n" " . lmsw data : 0x%x\n" ,vm_exit_info.qualification.cr.nr ,vm_exit_info.qualification.cr.type ,vm_exit_info.qualification.cr.lmsw_op ,vm_exit_info.qualification.cr.gpr ,vm_exit_info.qualification.cr.lmsw_data); } else if(vm_exit_info.reason.basic == VMX_VMEXIT_IO_INSN) { printf("-\n" " . acc sz : %d byte(s)\n" " . direction : %s\n" " . string insn : %s\n" " . rep prefix : %s\n" " . operand : %s\n" " . port : 0x%x\n" ,vm_exit_info.qualification.io.sz+1 ,vm_exit_info.qualification.io.d?"in":"out" ,vm_exit_info.qualification.io.s?"yes":"no" ,vm_exit_info.qualification.io.rep?"yes":"no" ,vm_exit_info.qualification.io.op?"imm":"dx" ,vm_exit_info.qualification.io.port); } else if(vm_exit_info.reason.basic == VMX_VMEXIT_INVL_G_STATE) vmx_vmexit_show_invalid_guest(); }
/* ** Resolve guest virtual into system physical **/ int vm_full_walk(offset_t vaddr, offset_t *paddr) { size_t sz; offset_t gp; if(vm_pg_walk(vaddr, &gp, &sz)) return npg_walk(gp, paddr); return 0; }
static void gdb_vmm_npg_translate(uint8_t *data, size_t len) { offset_t paddr, saddr; if(!gdb_get_number(data, len, (uint64_t*)&paddr, 0)) { gdb_nak(); return; } debug(GDBSTUB_CMD, "(nested) translating 0x%X\n", paddr); if(!npg_walk(paddr, &saddr)) { debug(GDBSTUB, "(nested) memory translation failure\n"); gdb_err_mem(); return; } debug(GDBSTUB_CMD, "sending 0x%X\n", saddr); gdb_add_number(saddr, sizeof(uint64_t)*2, 0); gdb_send_packet(); }
static void vmx_vmexit_show_info() { printf("qualification : 0x%X\n", vm_exit_info.qualification.raw); if(vm_exit_info.reason.basic == VMX_VMEXIT_EPT_CONF) { offset_t vaddr, paddr; int mode; vm_get_code_addr(&vaddr, 0, &mode); npg_walk(vaddr, &paddr); } else if(vm_exit_info.reason.basic == VMX_VMEXIT_EPT) { offset_t paddr; printf("-\n" " . glinear : 0x%X\n" " . gphysical : 0x%X\n" ,vm_exit_info.guest_linear.raw ,vm_exit_info.guest_physical.raw ); npg_walk(vm_exit_info.guest_physical.raw, &paddr); } else if(vm_exit_info.reason.basic == VMX_VMEXIT_CR_ACCESS) { printf("-\n" " . cr num : %d\n" " . type : %d\n" " . lmsw op : %d\n" " . gpr : %d\n" " . lmsw data : 0x%x\n" ,vm_exit_info.qualification.cr.nr ,vm_exit_info.qualification.cr.type ,vm_exit_info.qualification.cr.lmsw_op ,vm_exit_info.qualification.cr.gpr ,vm_exit_info.qualification.cr.lmsw_data); } else if(vm_exit_info.reason.basic == VMX_VMEXIT_IO_INSN) { printf("-\n" " . acc sz : %d byte(s)\n" " . direction : %s\n" " . string insn : %s\n" " . rep prefix : %s\n" " . operand : %s\n" " . port : 0x%x\n" ,vm_exit_info.qualification.io.sz+1 ,vm_exit_info.qualification.io.d?"in":"out" ,vm_exit_info.qualification.io.s?"yes":"no" ,vm_exit_info.qualification.io.rep?"yes":"no" ,vm_exit_info.qualification.io.op?"imm":"dx" ,vm_exit_info.qualification.io.port); } else if(vm_exit_info.reason.basic == VMX_VMEXIT_INVL_G_STATE) { switch(vm_exit_info.qualification.low) { case 2: printf("page directory register related load failure\n");break; case 3: printf("NMI injection failure\n");break; case 4: printf("invalid VMCS link pointer\n");break; default:printf("(unused) %d\n", vm_exit_info.qualification.low);break; } } }