diff options
author | 2018-10-22 17:21:21 -0700 | |
---|---|---|
committer | 2018-10-22 17:21:21 -0700 | |
commit | 6f437d9d03f8f7f5438cffe0e227ec12339d07f8 (patch) | |
tree | 122ca17f880dfc33fd800fe44fd42ed85f57c7b5 /cortex-m-rt/src | |
parent | 777d73402600ebb6498255493cc04bc2fad4c864 (diff) | |
download | cortex-m-6f437d9d03f8f7f5438cffe0e227ec12339d07f8.tar.gz cortex-m-6f437d9d03f8f7f5438cffe0e227ec12339d07f8.tar.zst cortex-m-6f437d9d03f8f7f5438cffe0e227ec12339d07f8.zip |
Allow GDB to unwind HardFault callstacks
When I currently request GDB to dump a hard fault stack, I see
something like this:
(gdb) bt
#0 UserHardFault_ (ef=0x10001fb8) at /depots/cortex-m-rt/src/lib.rs:537
#1 0x08003fe6 in HardFault ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
GDB can't unwind past HardFault since the current implementation of
this function overwrites the Link Register (LR) value. This change
pushes LR and R0 (to maintain 8-byte stack alignment) to the stack
before transferring execution to UserHardFault().
After this change, I see a callstack like this from GDB:
(gdb) bt
#0 UserHardFault_ (ef=0x10001fb0) at /depots/cortex-m-rt/src/lib.rs:537
#1 0x08003fe8 in HardFault ()
#2 <signal handler called>
#3 0x08002820 in core::ptr::read_volatile (src=0x48001800) at libcore/ptr.rs:472
#4 0x080001a2 in main () at src/07-registers/src/main.rs:14
Notes:
* This code uses 8 more stack bytes.
* Increases the size of the HardFault handler by 2 narrow instructions
or 4 bytes. This could be decreased to 2 bytes by removing the pop
since UserHardFault() doesn't currently return but it just looks too
odd for me to do as an initial attempt.
Diffstat (limited to 'cortex-m-rt/src')
0 files changed, 0 insertions, 0 deletions