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_brk_event(ctrl_evt_hdl_t *hdlr) { uint8_t n; if(!dbg_hard_brk_enabled()) return VM_IGNORE; debug(DBG_HARD_BRK, "hard brk event\n"); for(n=0 ; n<DBG_HARD_BRK_NR ; n++) if(__hbrk_raised(n) && __hbrk_enabled(n)) { dbg_evt_t *evt = &info->vmm.ctrl.dbg.evt; evt->type = __hbrk_get_type(n); evt->hard = n; evt->addr = get_dr(n); *hdlr = dbg_hard_brk_get_hdlr(n); dbg_hard_set_dr6_dirty(1); debug(DBG_HARD_BRK, "prepared hard brk ctrl event for 0x%X\n", evt->addr); return VM_DONE; } return VM_IGNORE; }
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 dbg_hard_release_dr() { debug(DBG_HARD_BRK, "hard release dr\n"); /* XXX: release DBG_CTL_MSR */ /* XXX: vmm area check ? */ set_dr0(info->vm.dr_shadow[0].raw); set_dr1(info->vm.dr_shadow[1].raw); set_dr2(info->vm.dr_shadow[2].raw); set_dr3(info->vm.dr_shadow[3].raw); __dr6.low = info->vm.dr_shadow[4].low; __dr7.low = info->vm.dr_shadow[5].low; dbg_hard_set_dr6_dirty(0); __post_access(__dr6); __post_access(__dr7); __allow_dr_access(); }