summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Barnes <robbarnes@google.com>2022-09-07 21:49:36 +0000
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2022-09-15 14:58:45 +0000
commit9e271aa66ca3fa77c5c12352bc0b5c10ed827b8a (patch)
treec4a104101f59a4bd8fcd9d0617b5ce377896b032
parent194340af091f7f474225d33324d75c81d675c180 (diff)
downloadchrome-ec-9e271aa66ca3fa77c5c12352bc0b5c10ed827b8a.tar.gz
zephyr/panic: Capture extra cortex-m registers
Copy callee saved registers to panic data structure. Enable extra exception info by default. Clang format affected lines. BUG=b:245591465 BRANCH=none TEST=Dump panic info on skyrim, observe extra registers Signed-off-by: Rob Barnes <robbarnes@google.com> Change-Id: I848d7e6bc35bf2b62b76182dd9d3fa87877a41fc Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3880830 Reviewed-by: Jack Rosenthal <jrosenth@chromium.org> Code-Coverage: Zoss <zoss-cl-coverage@prod.google.com>
-rw-r--r--zephyr/Kconfig.defaults3
-rw-r--r--zephyr/shim/src/panic.c40
2 files changed, 34 insertions, 9 deletions
diff --git a/zephyr/Kconfig.defaults b/zephyr/Kconfig.defaults
index f7e1f710a2..ded7516748 100644
--- a/zephyr/Kconfig.defaults
+++ b/zephyr/Kconfig.defaults
@@ -31,4 +31,7 @@ config SHELL_THREAD_PRIORITY_OVERRIDE
config SHELL_THREAD_PRIORITY
default 12 # track EC_SHELL_PRIO
+config EXTRA_EXCEPTION_INFO
+ default y if ARCH_HAS_EXTRA_EXCEPTION_INFO
+
orsource "Kconfig.defaults-$(ARCH)"
diff --git a/zephyr/shim/src/panic.c b/zephyr/shim/src/panic.c
index e27372be52..20f0e9977e 100644
--- a/zephyr/shim/src/panic.c
+++ b/zephyr/shim/src/panic.c
@@ -27,15 +27,37 @@
#if defined(CONFIG_ARM)
#define PANIC_ARCH PANIC_ARCH_CORTEX_M
-#define PANIC_REG_LIST(M) \
- M(basic.r0, cm.frame[0], a1) \
- M(basic.r1, cm.frame[1], a2) \
- M(basic.r2, cm.frame[2], a3) \
- M(basic.r3, cm.frame[3], a4) \
- M(basic.r12, cm.frame[4], ip) \
- M(basic.lr, cm.frame[5], lr) \
- M(basic.pc, cm.frame[6], pc) \
- M(basic.xpsr, cm.frame[7], xpsr)
+#if defined(CONFIG_EXTRA_EXCEPTION_INFO)
+#define EXTRA_PANIC_REG_LIST(M) \
+ M(extra_info.callee->v1, cm.regs[CORTEX_PANIC_REGISTER_R4], v1) \
+ M(extra_info.callee->v2, cm.regs[CORTEX_PANIC_REGISTER_R5], v2) \
+ M(extra_info.callee->v3, cm.regs[CORTEX_PANIC_REGISTER_R6], v3) \
+ M(extra_info.callee->v4, cm.regs[CORTEX_PANIC_REGISTER_R7], v4) \
+ M(extra_info.callee->v5, cm.regs[CORTEX_PANIC_REGISTER_R8], v5) \
+ M(extra_info.callee->v6, cm.regs[CORTEX_PANIC_REGISTER_R9], v6) \
+ M(extra_info.callee->v7, cm.regs[CORTEX_PANIC_REGISTER_R10], v7) \
+ M(extra_info.callee->v8, cm.regs[CORTEX_PANIC_REGISTER_R11], v8) \
+ M(extra_info.callee->psp, cm.regs[CORTEX_PANIC_REGISTER_PSP], psp) \
+ M(extra_info.exc_return, cm.regs[CORTEX_PANIC_REGISTER_LR], exc_rtn) \
+ M(extra_info.msp, cm.regs[CORTEX_PANIC_REGISTER_MSP], msp)
+/*
+ * IPSR is not copied. IPSR is a subset of xPSR, which is already
+ * captured in PANIC_REG_LIST.
+ */
+#else
+#define EXTRA_PANIC_REG_LIST(M)
+#endif
+/* TODO(b/245423691): Copy other status registers (e.g. CFSR) when available. */
+#define PANIC_REG_LIST(M) \
+ M(basic.r0, cm.frame[0], a1) \
+ M(basic.r1, cm.frame[1], a2) \
+ M(basic.r2, cm.frame[2], a3) \
+ M(basic.r3, cm.frame[3], a4) \
+ M(basic.r12, cm.frame[4], ip) \
+ M(basic.lr, cm.frame[5], lr) \
+ M(basic.pc, cm.frame[6], pc) \
+ M(basic.xpsr, cm.frame[7], xpsr) \
+ EXTRA_PANIC_REG_LIST(M)
#define PANIC_REG_EXCEPTION(pdata) pdata->cm.regs[1]
#define PANIC_REG_REASON(pdata) pdata->cm.regs[3]
#define PANIC_REG_INFO(pdata) pdata->cm.regs[4]