1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-10 12:32:20 +02:00

Fixed some Win32 and chkstk rollback issues

This commit is contained in:
Brian Fiete 2019-09-05 11:09:13 -07:00
parent 0ce6e44523
commit 8c21f24867
6 changed files with 86 additions and 46 deletions

View file

@ -2024,6 +2024,19 @@ bool DebugTarget::RollBackStackFrame_COFFFrameDescriptor(CPURegisters* registers
return false;
}
bool DebugTarget::RollBackStackFrame_SimpleRet(CPURegisters* registers)
{
int regSize = sizeof(addr_target);
addr_target* regPC = registers->GetPCRegisterRef();
addr_target* regSP = registers->GetSPRegisterRef();
addr_target newPC = 0;
gDebugger->ReadMemory(*regSP, sizeof(addr_target), &newPC);
*regSP += regSize;
*regPC = newPC;
return true;
}
bool DebugTarget::RollBackStackFrame(CPURegisters* registers, addr_target* outReturnAddressLoc, bool isStackStart)
{
if (outReturnAddressLoc != NULL)
@ -2036,16 +2049,7 @@ bool DebugTarget::RollBackStackFrame(CPURegisters* registers, addr_target* outRe
{
// If we are literally just a return then often the frame descriptor is wrong,
// but we know this is ACTUALLY just a simple rollback
int regSize = sizeof(addr_target);
addr_target* regPC = registers->GetPCRegisterRef();
addr_target* regSP = registers->GetSPRegisterRef();
addr_target newPC = 0;
gDebugger->ReadMemory(*regSP, sizeof(addr_target), &newPC);
*regSP += regSize;
*regPC = newPC;
return true;
return RollBackStackFrame_SimpleRet(registers);
}
}
@ -2058,6 +2062,9 @@ bool DebugTarget::RollBackStackFrame(CPURegisters* registers, addr_target* outRe
DbgSubprogram* dbgSubprogram = FindSubProgram(pc);
if (dbgSubprogram != NULL)
{
if (pc == dbgSubprogram->mBlock.mLowPC)
return RollBackStackFrame_SimpleRet(registers);
auto dbgModule = dbgSubprogram->mCompileUnit->mDbgModule;
if ((dbgModule != NULL) && (!dbgModule->mParsedFrameDescriptors))
{
@ -2066,6 +2073,10 @@ bool DebugTarget::RollBackStackFrame(CPURegisters* registers, addr_target* outRe
return true;
}
}
else
{
return RollBackStackFrame_SimpleRet(registers);
}
#endif
// Fall through after this, we need to process a 'return'
@ -2081,7 +2092,7 @@ bool DebugTarget::RollBackStackFrame(CPURegisters* registers, addr_target* outRe
if (alreadyRolledBackPC)
return true;
#ifdef BF_DBG_32
#ifdef BF_DBG_32
// Try rollback assuming a frame pointer
addr_target newPC = 0;
addr_target stackFrame = registers->GetBP();