From f501d5ab848c3a1f41fde64b7cba18de740806ea Mon Sep 17 00:00:00 2001 From: Adam Green Date: Mon, 22 Oct 2018 17:21:21 -0700 Subject: [PATCH] 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 #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. --- asm.s | 2 ++ bin/thumbv6m-none-eabi.a | Bin 886 -> 920 bytes bin/thumbv7em-none-eabi.a | Bin 886 -> 920 bytes bin/thumbv7em-none-eabihf.a | Bin 886 -> 920 bytes bin/thumbv7m-none-eabi.a | Bin 886 -> 920 bytes 5 files changed, 2 insertions(+) diff --git a/asm.s b/asm.s index c7133c07..f5ace260 100644 --- a/asm.s +++ b/asm.s @@ -2,5 +2,7 @@ .global HardFault .thumb_func HardFault: + push {r0, lr} mrs r0, MSP bl UserHardFault + pop {r0, pc} diff --git a/bin/thumbv6m-none-eabi.a b/bin/thumbv6m-none-eabi.a index 62ac3178dac91bba2eb2ab9bf24cfe9801437660..e002080e327613100e5b488434b0ee275f1534bb 100644 GIT binary patch delta 307 zcmeyyHiNxh(I&AdIm3=i*-+oeKmh>^O-&4pOpOhVEEE(>4Ge)25NSgL12Yp7AP*=G z0SR33@p{3LzAmnA3c>zCA+9bANC2m~#$a>nfo4Fgg&Aya1~eTE61bA{i%L=}baQo! zO7!xfhSt0KxG^#^!mVIr&|pCD7#JcT999#s3JnG>22KXXt?xf`H2nYm??2;SM`@r$ zVrpViCIh1&!^AtA7}+-WGjcOB@=Tu1q|C&?IQamR8l%JH=S=F1F_Zb3)fwMRHV2X% IljE7i0iI4eb^rhX delta 216 zcmbQi{*A3((I&AdIm3=iUjY>uAaNmVWKu!F&;q6)fs28Gff0zqJQ9mi+!9N3N*I#! zi%L=}baQo!O7!x9M&mNgOxVN(Y>v4JOi2RQ#0?6JArmhObG-k|(eVHKzyA|I9AISG sypfTck&$EaUM6LxKMa!}F{v@yOy*=(XN;I^2qa%jjs%h{lN*`E0TcZ);s5{u diff --git a/bin/thumbv7em-none-eabi.a b/bin/thumbv7em-none-eabi.a index ef9042ff8a177ac4c4e72309f498ffa708b01f02..230b86632427dbcf728822ecf8766a06bda7e9fa 100644 GIT binary patch delta 307 zcmeyyHiNxh(I&AdIm3=i*-+oeKmh>^O-&4pOpOhVEEE(>4Ge)25NSgL12Yp7AP*=G z0SR33@p{3LzAmnA3c>zCA+9bANC2m~#$a>nfo4Fgg&Aya1~eTE61bA{i%L=}baQo! zO7!xfhSt0KxG^#^!mVIr&|pCD7#JcT999#s3JnG>22KXXt?xf`H2nYm??2;SM`@r$ zVrpViCIh1&!^AtA7}+-WGjcOB@=Tu1q|C&?IQamR8l%JH=S=F1F_Zb3)fwMRHV2X% IljE7i0iI4eb^rhX delta 216 zcmbQi{*A3((I&AdIm3=iUjY>uAaNmVWKu!F&;q6)fs28Gff0zqJQ9mi+!9N3N*I#! zi%L=}baQo!O7!x9M&mNgOxVN(Y>v4JOi2RQ#0?6JArmhObG-k|(eVHKzyA|I9AISG sypfTck&$EaUM6LxKMa!}F{v@yOy*=(XN;I^2qa%jjs%h{lN*`E0TcZ);s5{u diff --git a/bin/thumbv7em-none-eabihf.a b/bin/thumbv7em-none-eabihf.a index ef9042ff8a177ac4c4e72309f498ffa708b01f02..230b86632427dbcf728822ecf8766a06bda7e9fa 100644 GIT binary patch delta 307 zcmeyyHiNxh(I&AdIm3=i*-+oeKmh>^O-&4pOpOhVEEE(>4Ge)25NSgL12Yp7AP*=G z0SR33@p{3LzAmnA3c>zCA+9bANC2m~#$a>nfo4Fgg&Aya1~eTE61bA{i%L=}baQo! zO7!xfhSt0KxG^#^!mVIr&|pCD7#JcT999#s3JnG>22KXXt?xf`H2nYm??2;SM`@r$ zVrpViCIh1&!^AtA7}+-WGjcOB@=Tu1q|C&?IQamR8l%JH=S=F1F_Zb3)fwMRHV2X% IljE7i0iI4eb^rhX delta 216 zcmbQi{*A3((I&AdIm3=iUjY>uAaNmVWKu!F&;q6)fs28Gff0zqJQ9mi+!9N3N*I#! zi%L=}baQo!O7!x9M&mNgOxVN(Y>v4JOi2RQ#0?6JArmhObG-k|(eVHKzyA|I9AISG sypfTck&$EaUM6LxKMa!}F{v@yOy*=(XN;I^2qa%jjs%h{lN*`E0TcZ);s5{u diff --git a/bin/thumbv7m-none-eabi.a b/bin/thumbv7m-none-eabi.a index b93dae7e22dd122d40513fd113b43040363ca0c4..cb086a06f0004665d1f7e824d6131695265993bf 100644 GIT binary patch delta 307 zcmeyyHiNxh(I&AdIm3=i*-+oeKmh>^O-&4pOpOhVEEE(>4Ge)25NSgL12Yp7AP*=G z0SR33@p{3LzAmnA3c>zCA+9bANC2m~#$a>nfo4Fgg&Aya1~eTE61bA{i%L=}baQo! zO7!xfhSt0KxG^#^!mVIr&|pCD7#JcT999#s3JnG>22KXXt?xf`H2nYm??2;SM=790 zVrpViCIh1Y!^AtA7}+-WGjcOB@=Tu1q|C&?IQamR8l%JH=S=F1F_Zb3)fwMRHV2X% IljE7i0iEGGbN~PV delta 216 zcmbQi{*A3((I&AdIm3=iUjY>uAaNmVWKu!F&;q6)fs28Gff0zqJQ9mi+!9N3N*I#! zi%L=}baQo!O7!x9M&mNgOxVN(Y>v4JOi2RQ#0?6JArmhObG-k|(eVHKzyA|I9AISG sypfTck&$EaUM6LxKMa!}F{v@yOy*=(XN;I^2qa%jjs%h{lN*`E0TcZ);s5{u