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 b729cd604e..f35873eca0 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -86,6 +86,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 a3c433f756..f0edd94dde 100755 --- a/target/i386/windbgstub.c +++ b/target/i386/windbgstub.c @@ -70,7 +70,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) { @@ -115,4 +114,23 @@ static void kd_init_state_change(CPUState *cpu, } } +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; +} + #endif