diff options
Diffstat (limited to 'src/core/arm/arm_interface.h')
-rw-r--r-- | src/core/arm/arm_interface.h | 24 |
1 files changed, 7 insertions, 17 deletions
diff --git a/src/core/arm/arm_interface.h b/src/core/arm/arm_interface.h index b0472d55d..91d2b0f81 100644 --- a/src/core/arm/arm_interface.h +++ b/src/core/arm/arm_interface.h @@ -6,8 +6,6 @@ #include <array> #include "common/common_types.h" -#include "common/logging/log.h" -#include "core/memory.h" namespace Kernel { enum class VMAPermission : u8; @@ -144,21 +142,13 @@ public: /// Prepare core for thread reschedule (if needed to correctly handle state) virtual void PrepareReschedule() = 0; - void LogBacktrace() { - VAddr fp = GetReg(29); - VAddr lr = GetReg(30); - VAddr sp = GetReg(13); - VAddr pc = GetPC(); - LOG_ERROR(Core_ARM, "Backtrace, sp={:016X}, pc={:016X}", sp, pc); - for (;;) { - LOG_ERROR(Core_ARM, "{:016X}", lr); - if (!fp) { - break; - } - lr = Memory::Read64(fp + 8) - 4; - fp = Memory::Read64(fp); - } - } + /// fp (= r29) points to the last frame record. + /// Note that this is the frame record for the *previous* frame, not the current one. + /// Note we need to subtract 4 from our last read to get the proper address + /// Frame records are two words long: + /// fp+0 : pointer to previous frame record + /// fp+8 : value of lr for frame + void LogBacktrace(); }; } // namespace Core |