diff options
author | Liam <byteslice@airmail.cc> | 2022-06-25 18:54:24 +0200 |
---|---|---|
committer | Liam <byteslice@airmail.cc> | 2022-06-25 18:54:24 +0200 |
commit | 8f8c0b69dc4d56a0bc29bf8a0e59921334a808a8 (patch) | |
tree | 9e2be93615a1af7d43c7080e4073ff3032393d34 /src/core/arm/dynarmic/arm_dynarmic_32.cpp | |
parent | Merge pull request #8491 from Morph1984/extra-assert (diff) | |
download | yuzu-8f8c0b69dc4d56a0bc29bf8a0e59921334a808a8.tar yuzu-8f8c0b69dc4d56a0bc29bf8a0e59921334a808a8.tar.gz yuzu-8f8c0b69dc4d56a0bc29bf8a0e59921334a808a8.tar.bz2 yuzu-8f8c0b69dc4d56a0bc29bf8a0e59921334a808a8.tar.lz yuzu-8f8c0b69dc4d56a0bc29bf8a0e59921334a808a8.tar.xz yuzu-8f8c0b69dc4d56a0bc29bf8a0e59921334a808a8.tar.zst yuzu-8f8c0b69dc4d56a0bc29bf8a0e59921334a808a8.zip |
Diffstat (limited to 'src/core/arm/dynarmic/arm_dynarmic_32.cpp')
-rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_32.cpp | 30 |
1 files changed, 25 insertions, 5 deletions
diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp index 8c90c8be0..dc01d9d1c 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp @@ -409,18 +409,38 @@ void ARM_Dynarmic_32::PageTableChanged(Common::PageTable& page_table, } std::vector<ARM_Interface::BacktraceEntry> ARM_Dynarmic_32::GetBacktrace(Core::System& system, - u64 sp, u64 lr) { - // No way to get accurate stack traces in A32 yet - return {}; + u64 fp, u64 lr, u64 pc) { + std::vector<BacktraceEntry> out; + auto& memory = system.Memory(); + + out.push_back({"", 0, pc, 0, ""}); + + // fp (= r11) points to the last frame record. + // Frame records are two words long: + // fp+0 : pointer to previous frame record + // fp+4 : value of lr for frame + while (true) { + out.push_back({"", 0, lr, 0, ""}); + if (!fp || (fp % 4 != 0) || !memory.IsValidVirtualAddressRange(fp, 8)) { + break; + } + lr = memory.Read32(fp + 4); + fp = memory.Read32(fp); + } + + SymbolicateBacktrace(system, out); + + return out; } std::vector<ARM_Interface::BacktraceEntry> ARM_Dynarmic_32::GetBacktraceFromContext( System& system, const ThreadContext32& ctx) { - return GetBacktrace(system, ctx.cpu_registers[13], ctx.cpu_registers[14]); + const auto& reg = ctx.cpu_registers; + return GetBacktrace(system, reg[11], reg[14], reg[15]); } std::vector<ARM_Interface::BacktraceEntry> ARM_Dynarmic_32::GetBacktrace() const { - return GetBacktrace(system, GetReg(13), GetReg(14)); + return GetBacktrace(system, GetReg(11), GetReg(14), GetReg(15)); } } // namespace Core |