Added function for generate ExceptionStateChange packet. Signed-off-by: Mihail Abakumov <mikhail.abaku...@ispras.ru> Signed-off-by: Pavel Dovgalyuk <dovga...@ispras.ru> Signed-off-by: Dmitriy Koltunov <koltu...@ispras.ru> --- include/exec/windbgstub-utils.h | 2 ++ target/i386/windbgstub.c | 20 +++++++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-)
diff --git a/include/exec/windbgstub-utils.h b/include/exec/windbgstub-utils.h index f0da3cbd86..fea04cbc89 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -93,6 +93,8 @@ typedef struct SizedBuf { InitedAddr *windbg_get_KPCR(void); InitedAddr *windbg_get_version(void); +SizedBuf kd_gen_exception_sc(CPUState *cpu); + bool windbg_on_load(void); #endif diff --git a/target/i386/windbgstub.c b/target/i386/windbgstub.c index da0aeb4f1b..334642b677 100755 --- a/target/i386/windbgstub.c +++ b/target/i386/windbgstub.c @@ -68,7 +68,6 @@ bool windbg_on_load(void) return true; } -__attribute__ ((unused)) /* unused yet */ static void kd_init_state_change(CPUState *cpu, DBGKD_ANY_WAIT_STATE_CHANGE *sc) { @@ -112,3 +111,22 @@ static void kd_init_state_change(CPUState *cpu, stw_p(&cr->InstructionCount, DBGKD_MAXSTREAM); } } + +SizedBuf kd_gen_exception_sc(CPUState *cpu) +{ + CPUArchState *env = cpu->env_ptr; + DBGKD_ANY_WAIT_STATE_CHANGE *sc; + DBGKM_EXCEPTION_RECORD64 *exc; + SizedBuf buf; + + SBUF_MALLOC(buf, sizeof(DBGKD_ANY_WAIT_STATE_CHANGE) + sizeof(int)); + sc = (DBGKD_ANY_WAIT_STATE_CHANGE *) buf.data; + exc = &sc->u.Exception.ExceptionRecord; + kd_init_state_change(cpu, sc); + + stl_p(&sc->NewState, DbgKdExceptionStateChange); + stl_p(&exc->ExceptionCode, 0x80000003); + sttul_p(&exc->ExceptionAddress, env->eip); + + return buf; +}