Add function for init DBGKD_ANY_WAIT_STATE_CHANGE. It is a header of 'state change' packets.
Signed-off-by: Mikhail Abakumov <mikhail.abaku...@ispras.ru> Signed-off-by: Pavel Dovgalyuk <dovga...@ispras.ru> --- target/i386/windbgstub.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/target/i386/windbgstub.c b/target/i386/windbgstub.c index f1bab10b10..b2ac7a6d5f 100644 --- a/target/i386/windbgstub.c +++ b/target/i386/windbgstub.c @@ -15,9 +15,13 @@ #ifdef TARGET_X86_64 #define OFFSET_KPCR_SELF 0x18 #define OFFSET_KPCR_LOCK_ARRAY 0x28 +#define OFFSET_KPRCB 0x20 +#define OFFSET_KPRCB_CURRTHREAD 0x8 #else /* TARGET_I386 */ #define OFFSET_KPCR_SELF 0x1C #define OFFSET_KPCR_VERSION 0x34 +#define OFFSET_KPRCB 0x20 +#define OFFSET_KPRCB_CURRTHREAD 0x4 #endif /* TARGET_I386 */ #ifdef TARGET_X86_64 @@ -156,3 +160,44 @@ void windbg_on_reset(void) kdVersion.is_init = false; #endif } + +__attribute__ ((unused)) /* unused yet */ +static void kd_init_state_change(CPUState *cs, DBGKD_ANY_WAIT_STATE_CHANGE *sc) +{ + X86CPU *cpu = X86_CPU(cs); + CPUX86State *env = &cpu->env; + DBGKD_CONTROL_REPORT *cr = &sc->ControlReport; + target_ulong KPRCB = VMEM_ADDR(cs, KPCR.addr + OFFSET_KPRCB); + target_ulong thread = VMEM_ADDR(cs, KPRCB + OFFSET_KPRCB_CURRTHREAD); + int number_processors = 0; + + CPUState *cpu_tmp; + CPU_FOREACH(cpu_tmp) { + ++number_processors; + } + + /* HEADER */ + + /* TODO: Fix this hardcoded value. */ + stw_p(&sc->ProcessorLevel, 0); + /* TODO: Fix this hardcoded value. */ + stw_p(&sc->Processor, 0); + stl_p(&sc->NumberProcessors, number_processors); + sttul_p(&sc->Thread, thread); + sttul_p(&sc->ProgramCounter, env->eip); + + /* CONTROL REPORT */ + + sttul_p(&cr->Dr6, env->dr[6]); + sttul_p(&cr->Dr7, env->dr[7]); + stw_p(&cr->ReportFlags, REPORT_INCLUDES_SEGS | REPORT_STANDARD_CS); + stw_p(&cr->SegCs, env->segs[R_CS].selector); + stw_p(&cr->SegDs, env->segs[R_DS].selector); + stw_p(&cr->SegEs, env->segs[R_ES].selector); + stw_p(&cr->SegFs, env->segs[R_FS].selector); + stl_p(&cr->EFlags, env->eflags); + + /* This is a feature */ + memset(cr->InstructionStream, 0, DBGKD_MAXSTREAM); + stw_p(&cr->InstructionCount, 0); +}