Skip to content

Commit 9fb497f

Browse files
committed
Harden HardFault handler linkage and visibility
Refactor `hardfault_handler.cpp` to use a single `extern "C"` block and mark `HardfaultHandler` as `used`, `externally_visible`, and `noinline` so it remains callable from the assembly branch. Also fixes `printf` type formatting for `lr_value` and tidies control-flow style in the fault loop.
1 parent 8069899 commit 9fb497f

1 file changed

Lines changed: 9 additions & 10 deletions

File tree

firmware-template-gd32/hardfault_handler.cpp

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212

1313
#include "gd32xxxx.h" // IWYU pragma: keep
1414

15-
extern "C" void HardFault_Handler()
16-
{
15+
extern "C" {
16+
void HardFault_Handler() {
1717
__asm volatile(
1818
"TST LR, #4\n"
1919
"ITE EQ\n"
@@ -23,8 +23,7 @@ extern "C" void HardFault_Handler()
2323
"B HardfaultHandler\n");
2424
}
2525

26-
extern "C" void HardfaultHandler(uint32_t* hardfault_args, uint32_t lr_value)
27-
{
26+
__attribute__((used, externally_visible, noinline)) void HardfaultHandler(uint32_t* hardfault_args, uint32_t lr_value) {
2827
uint32_t cfsr;
2928
uint32_t bus_fault_address;
3029
uint32_t memmanage_fault_address;
@@ -57,16 +56,16 @@ extern "C" void HardfaultHandler(uint32_t* hardfault_args, uint32_t lr_value)
5756
printf(" HFSR = %x\n", (unsigned int)SCB->HFSR);
5857
printf(" DFSR = %x\n", (unsigned int)SCB->DFSR);
5958
printf(" AFSR = %x\n", (unsigned int)SCB->AFSR);
60-
if (cfsr & 0x0080)
61-
{
59+
if (cfsr & 0x0080) {
6260
printf(" MMFAR = %x\n", (unsigned int)memmanage_fault_address);
6361
}
64-
if (cfsr & 0x8000)
65-
{
62+
if (cfsr & 0x8000) {
6663
printf(" BFAR = %x\n", (unsigned int)bus_fault_address);
6764
}
6865
printf("- Misc\n");
69-
printf(" LR/EXC_RETURN= %x\n", lr_value);
66+
printf(" LR/EXC_RETURN= %x\n", (unsigned int)lr_value);
7067

71-
while (1);
68+
while (true) {
69+
}
70+
}
7271
}

0 commit comments

Comments
 (0)