mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-10-13 20:39:41 -07:00
pull failed-unwind-step register-block-restore out of each impl, just do it on the caller side; pull out module-less read-the-stack-pointer unwind fallback from pe/x64 unwinder, use in module-less unwinds in all cases; call into from pe/x64 unwinder in fallback case
This commit is contained in:
1 parent
ec4fd23e15
commit
0f02c32c89
5 files changed
+93
-66
No files matched your search
+36
-1
@@ -6,6 +6,41 @@
|
||||
|
||||
#include "unwind/generated/unwind.meta.c"
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Moduleless Unwinder
|
||||
|
||||
internal UWND_StepResult
|
||||
uwnd_step_moduleless(Arch arch, MemoryMap *memory_map, void *regs)
|
||||
{
|
||||
UWND_StepResult result = {UWND_StepStatus_Error};
|
||||
{
|
||||
B32 done = 0;
|
||||
ARCH_Info *arch_info = arch_info_from_arch(arch);
|
||||
U64 addr_size = byte_size_from_arch(arch);
|
||||
|
||||
// rjf: read new ip from stack pointer
|
||||
U64 sp = arch_sp_from_reg_block(arch_info, regs);
|
||||
U64 new_ip = 0;
|
||||
Rng1U64 new_ip_vaddr_range = r1u64(sp, sp+addr_size);
|
||||
if(memory_map_read(memory_map, new_ip_vaddr_range, &new_ip) != addr_size)
|
||||
{
|
||||
done = 1;
|
||||
result.status = UWND_StepStatus_FailedMemoryRead;
|
||||
result.missed_read_vaddr_range = new_ip_vaddr_range;
|
||||
}
|
||||
|
||||
// rjf: commit
|
||||
if(!done)
|
||||
{
|
||||
U64 new_sp = sp+addr_size;
|
||||
arch_reg_block_write_ip(arch_info, regs, new_ip);
|
||||
arch_reg_block_write_sp(arch_info, regs, new_sp);
|
||||
result.status = UWND_StepStatus_Good;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Abstracted Unwind Step Functions
|
||||
|
||||
@@ -15,7 +50,7 @@ uwnd_step(UWND_Unwinder unwinder, Arch arch, MemoryMap *memory_map, UWND_ModuleI
|
||||
UWND_StepResult result = {UWND_StepStatus_Error};
|
||||
switch(unwinder)
|
||||
{
|
||||
default:{}break;
|
||||
default:{result = uwnd_step_moduleless(arch, memory_map, regs);}break;
|
||||
#define X(name, namespace_lower) case UWND_Unwinder_##name:{result = namespace_lower##_uwnd_step(arch, memory_map, module_info, tls_vaddr, regs, cfa_out);}break;
|
||||
UWND_Unwinder_XList
|
||||
#undef X
|
||||
|
||||
@@ -37,6 +37,11 @@ struct UWND_ModuleInfo
|
||||
void *unwind_info;
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Moduleless Unwinder
|
||||
|
||||
internal UWND_StepResult uwnd_step_moduleless(Arch arch, MemoryMap *memory_map, void *regs);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Abstracted Unwind Step Functions
|
||||
|
||||
|
||||
Reference in new issue
Block a user