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 | 3 +++ windbgstub-utils.c | 21 ++++++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-)
diff --git a/include/exec/windbgstub-utils.h b/include/exec/windbgstub-utils.h index 791721d472..0b859cd6a8 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -101,6 +101,9 @@ typedef struct SizedBuf { buf.data = NULL; \ buf.size = 0; \ } while (false) + +SizedBuf kd_gen_exception_sc(CPUState *cpu); + bool windbg_on_load(void); void windbg_on_exit(void); diff --git a/windbgstub-utils.c b/windbgstub-utils.c index 60f6705f7c..48d09ff424 100755 --- a/windbgstub-utils.c +++ b/windbgstub-utils.c @@ -34,7 +34,6 @@ static void kd_breakpoint_remove_range(CPUState *cpu, target_ulong base, target_ulong limit) {} -__attribute__ ((unused)) /* unused yet */ static void kd_init_state_change(CPUState *cpu, DBGKD_ANY_WAIT_STATE_CHANGE *sc) { @@ -83,6 +82,26 @@ static void kd_init_state_change(CPUState *cpu, } } +SizedBuf kd_gen_exception_sc(CPUState *cpu) +{ + CPUArchState *env = cpu->env_ptr; + SizedBuf buf; + SBUF_MALLOC(buf, sizeof(DBGKD_ANY_WAIT_STATE_CHANGE) + sizeof(int)); + + DBGKD_ANY_WAIT_STATE_CHANGE *sc = (DBGKD_ANY_WAIT_STATE_CHANGE *) buf.data; + kd_init_state_change(cpu, sc); + + sc->NewState = DbgKdExceptionStateChange; + sc->NewState = ldl_p(&sc->NewState); + + DBGKM_EXCEPTION_RECORD64 *exc = &sc->u.Exception.ExceptionRecord; + exc->ExceptionCode = 0x80000003; + exc->ExceptionCode = ldl_p(&exc->ExceptionCode); + exc->ExceptionAddress = ldtul_p(&env->eip); + + return buf; +} + bool windbg_on_load(void) { CPUState *cpu = qemu_get_cpu(0);