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 | 21 ++++++++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-)
diff --git a/include/exec/windbgstub-utils.h b/include/exec/windbgstub-utils.h index 830d01314e..d9dae4e902 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -74,6 +74,8 @@ typedef struct PacketData { 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..5db6a5e3bc 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,24 @@ 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; + + buf.size = sizeof(DBGKD_ANY_WAIT_STATE_CHANGE) + sizeof(int); + buf.data = g_malloc0(buf.size); + 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