summaryrefslogtreecommitdiff
path: root/core/cortex-m/watchdog.c
diff options
context:
space:
mode:
Diffstat (limited to 'core/cortex-m/watchdog.c')
-rw-r--r--core/cortex-m/watchdog.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/core/cortex-m/watchdog.c b/core/cortex-m/watchdog.c
index a67903df62..f9283bbbd7 100644
--- a/core/cortex-m/watchdog.c
+++ b/core/cortex-m/watchdog.c
@@ -7,10 +7,14 @@
#include "common.h"
#include "panic.h"
+#include "system.h"
#include "task.h"
#include "timer.h"
#include "watchdog.h"
+/* Panic data goes at the end of RAM. */
+static struct panic_data * const pdata_ptr = PANIC_DATA_PTR;
+
void __keep watchdog_trace(uint32_t excep_lr, uint32_t excep_sp)
{
uint32_t psp;
@@ -28,6 +32,18 @@ void __keep watchdog_trace(uint32_t excep_lr, uint32_t excep_sp)
panic_set_reason(PANIC_SW_WATCHDOG, stack[6],
(excep_lr & 0xf) == 1 ? 0xff : task_get_current());
+ /* Copy task# to cm.hfsr[9:2]. */
+ pdata_ptr->cm.hfsr = HFSR_FLAG_WATCHDOG << 26
+ | (pdata_ptr->cm.regs[1] & 0xff) << 2;
+
+ /*
+ * Store LR in cm.regs[1] (ipsr). IPSR holds exception# but we don't
+ * need it because the reason (=PANIC_SW_WATCHDOG) is already stored
+ * in cm.regs[3] (r4). Note this overwrites task# in cm.regs[1] stored
+ * by panic_set_reason.
+ */
+ pdata_ptr->cm.regs[1] = stack[5];
+
panic_printf("### WATCHDOG PC=%08x / LR=%08x / pSP=%08x ",
stack[6], stack[5], psp);
if ((excep_lr & 0xf) == 1)