int dbg_hard_stp_event() { offset_t addr; int mode; dbg_evt_t *evt; if(!dbg_hard_stp_enabled()) return CTRL_EVT_IGNORE; debug(DBG_HARD_STP, "sstep event\n"); if(dbg_soft_resuming()) dbg_soft_resume_post(&__hstp_ctx.cr3); dbg_hard_set_dr6_dirty(1); dbg_hard_stp_disable(); if(dbg_hard_stp_requestor() == DBG_REQ_VMM) { debug(DBG_HARD_STP, "internal sstep event\n"); return CTRL_EVT_INTERN; } vm_get_code_addr(&addr, 0, &mode); evt = &info->vmm.ctrl.dbg.evt; evt->type = DBG_EVT_TYPE_HARD_SSTEP; evt->addr = addr; debug(DBG_HARD_STP, "prepared sstep ctrl event for 0x%X\n", evt->addr); return CTRL_EVT_DONE; }
int dbg_hard_stp_event() { offset_t addr; int mode; dbg_evt_t *evt; if(!dbg_hard_stp_enabled()) return VM_IGNORE; debug(DBG_HARD_STP, "sstep event [req %s]\n" ,dbg_hard_stp_requestor()?"vmm":"usr"); if(dbg_soft_resuming()) dbg_soft_resume_post(); dbg_hard_stp_disable(); if(dbg_hard_stp_requestor() == DBG_REQ_VMM) { dbg_hard_dr6_clean(); return VM_INTERN; } dbg_hard_set_dr6_dirty(1); vm_get_code_addr(&addr, 0, &mode); evt = &info->vmm.ctrl.dbg.evt; evt->type = DBG_EVT_TYPE_HARD_SSTEP; evt->addr = addr; debug(DBG_HARD_STP, "prepared sstep ctrl event for 0x%X\n", evt->addr); return VM_DONE; }
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(); }
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; } } }