diff options
author | Shawn Nematbakhsh <shawnn@chromium.org> | 2015-03-04 10:35:25 -0800 |
---|---|---|
committer | ChromeOS Commit Bot <chromeos-commit-bot@chromium.org> | 2015-03-14 03:22:37 +0000 |
commit | 90ef8b700629381ac62aae4f87612ef84b32cb35 (patch) | |
tree | f708bd83c0ac30b46f2bf3a5d79991cb4d80c64d /core/cortex-m | |
parent | 911da8c150d9d38b9a9f14453098bd1e0f838b49 (diff) | |
download | chrome-ec-90ef8b700629381ac62aae4f87612ef84b32cb35.tar.gz |
lm4: stm32: Store panic data in backup registers on hard reset
On hard reset / hibernate, RAM will be erased and panic data will
normally be lost. When software panic data saving is enabled, try to
save this data just before hard reset and restore it when we come back
up.
BUG=chrome-os-partner:37380
TEST=Manual on Samus with WP + SW sync enabled. Boot AP, then run "crash
divzero" on console. After hard reset, verify that "panicinfo" dumps
data and shows divzero exception code.
BRANCH=Samus
Signed-off-by: Shawn Nematbakhsh <shawnn@chromium.org>
Change-Id: I9516dd4b6db12ef35e512cc4710f9b97d7e663cb
Reviewed-on: https://chromium-review.googlesource.com/255912
Reviewed-by: Randall Spangler <rspangler@chromium.org>
Diffstat (limited to 'core/cortex-m')
-rw-r--r-- | core/cortex-m/panic.c | 29 | ||||
-rw-r--r-- | core/cortex-m/task.c | 2 |
2 files changed, 26 insertions, 5 deletions
diff --git a/core/cortex-m/panic.c b/core/cortex-m/panic.c index 64fd5b8db1..6b81e8c484 100644 --- a/core/cortex-m/panic.c +++ b/core/cortex-m/panic.c @@ -373,28 +373,47 @@ void exception_panic(void) ); } -void software_panic(uint32_t panic_reason, uint32_t panic_info) +#ifdef CONFIG_SOFTWARE_PANIC +void software_panic(uint32_t reason, uint32_t info) { __asm__("mov " STRINGIFY(SOFTWARE_PANIC_INFO_REG) ", %0\n" "mov " STRINGIFY(SOFTWARE_PANIC_REASON_REG) ", %1\n" "bl exception_panic\n" - : : "r"(panic_info), "r"(panic_reason)); + : : "r"(info), "r"(reason)); } -void panic_log_watchdog(void) +void panic_set_reason(uint32_t reason, uint32_t info, uint8_t exception) { uint32_t *lregs = pdata_ptr->cm.regs; - /* Watchdog reset, log panic cause */ + /* Setup panic data structure */ memset(pdata_ptr, 0, sizeof(*pdata_ptr)); pdata_ptr->magic = PANIC_DATA_MAGIC; pdata_ptr->struct_size = sizeof(*pdata_ptr); pdata_ptr->struct_version = 2; pdata_ptr->arch = PANIC_ARCH_CORTEX_M; - lregs[3] = PANIC_SW_WATCHDOG; + /* Log panic cause */ + lregs[1] = exception; + lregs[3] = reason; + lregs[4] = info; } +void panic_get_reason(uint32_t *reason, uint32_t *info, uint8_t *exception) +{ + uint32_t *lregs = pdata_ptr->cm.regs; + + if (pdata_ptr->magic == PANIC_DATA_MAGIC && + pdata_ptr->struct_version == 2) { + *exception = lregs[1]; + *reason = lregs[3]; + *info = lregs[4]; + } else { + *exception = *reason = *info = 0; + } +} +#endif + void bus_fault_handler(void) { if (!bus_fault_ignored) diff --git a/core/cortex-m/task.c b/core/cortex-m/task.c index f7fda67374..69b92d5de8 100644 --- a/core/cortex-m/task.c +++ b/core/cortex-m/task.c @@ -226,7 +226,9 @@ void svc_handler(int desched, task_id_t resched) if (*current->stack != STACK_UNUSED_VALUE) { panic_printf("\n\nStack overflow in %s task!\n", task_names[current - tasks]); +#ifdef CONFIG_SOFTWARE_PANIC software_panic(PANIC_SW_STACK_OVERFLOW, current - tasks); +#endif } #endif |