/* fetch_next_frame() * * modify (at least) context.Pc using unwind information * either out of debug info (dwarf), or simple Lr trace */ static BOOL fetch_next_frame(struct cpu_stack_walk* csw, CONTEXT* context, DWORD_PTR curr_pc) { DWORD_PTR xframe; DWORD oldReturn = context->Lr; if (dwarf2_virtual_unwind(csw, curr_pc, context, &xframe)) { context->Sp = xframe; context->Pc = oldReturn; return TRUE; } if (context->Pc == context->Lr) return FALSE; context->Pc = oldReturn; return TRUE; }
/* fetch_next_frame() * * modify (at least) context.Pc using unwind information * either out of debug info (dwarf), or simple Lr trace */ static BOOL fetch_next_frame(struct cpu_stack_walk* csw, union ctx *pcontext, DWORD_PTR curr_pc) { DWORD64 xframe; CONTEXT *context = &pcontext->ctx; DWORD_PTR oldReturn = context->u.s.Lr; if (dwarf2_virtual_unwind(csw, curr_pc, pcontext, &xframe)) { context->Sp = xframe; context->Pc = oldReturn; return TRUE; } if (context->Pc == context->u.s.Lr) return FALSE; context->Pc = oldReturn; return TRUE; }