static int r_debug_wind_wait (RDebug *dbg, int pid) { # define STATE_EXCEPTION 0x3030 kd_packet_t *pkt; kd_stc_64 *stc; int ret; r_cons_break (wstatic_debug_break, dbg); dbreak = 0; for (;;) { ret = wind_wait_packet (wctx, KD_PACKET_TYPE_STATE_CHANGE, &pkt); if (dbreak) { dbreak = 0; wind_break (wctx); continue; } if (ret != KD_E_OK || !pkt) break; stc = (kd_stc_64 *)pkt->data; // Handle exceptions only if (stc->state == STATE_EXCEPTION) { wind_set_cpu (wctx, stc->cpu); free (pkt); dbg->reason.type = R_DEBUG_REASON_INT; dbg->reason.addr = stc->pc; dbg->reason.tid = stc->kthread; dbg->reason.signum = stc->state; break; } else wind_continue (wctx); free(pkt); } // TODO : Set the faulty process as target return R_TRUE; }
static int r_debug_wind_wait (RDebug *dbg, int pid) { kd_packet_t *pkt; kd_stc_64 *stc; for (;;) { int ret = wind_wait_packet (wctx, KD_PACKET_TYPE_STATE_CHANGE, &pkt); if (ret != KD_E_OK || !pkt) break; stc = (kd_stc_64 *)pkt->data; // Handle exceptions only if (stc->state == 0x3030) { wind_set_cpu (wctx, stc->cpu); free (pkt); dbg->reason = R_DBG_REASON_INT; break; } else wind_continue (wctx); free(pkt); } // TODO : Set the faulty process as target return R_TRUE; }