You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2021/09/16 02:32:48 UTC
[incubator-nuttx] 04/04: arch:xtensa:dumpstate: use sched_dumpstack
This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
commit cdb441cc3ff78f4c6dbc2268f2acbc66dcbc8196
Author: zhuyanlin <zh...@xiaomi.com>
AuthorDate: Wed Sep 15 15:01:34 2021 +0800
arch:xtensa:dumpstate: use sched_dumpstack
Use sched_dumpstack instead. The backtrace infomation like
xtensa_user_panic: User Exception: EXCCAUSE=0009 task: hello
xtensa_registerdump: PC: 202b32b8 PS: 00060030
xtensa_registerdump: A0: a02acb87 A1: 20998d10 A2: ffffaaaa A3: 12345678
xtensa_registerdump: A4: a02ba26c A5: 209949c0 A6: 20990994 A7: 00000258
xtensa_registerdump: A8: a02b32af A9: 20998cb0 A10: 0000000f A11: 209949a0
xtensa_registerdump: A12: a02be95c A13: 20994980 A14: 00000003 A15: 209949d0
xtensa_registerdump: SAR: 00000000 CAUSE: 00000009 VADDR: ffffaaaa
xtensa_registerdump: LBEG: 00000000 LEND: 00000000 LCNT: 00000000
xtensa_registerdump: TMP0: 202b1512 TMP1: 20998af0
sched_dumpstack: [BackTrace| 3|0]: 0x202acbae 0x202b232e 0x202b1912 0x202b19f5 0x202b24f1 0x202b152f 0x40023 0x202b32b0
sched_dumpstack: [BackTrace| 3|1]: 0x202acb87 0x202a86a4
Signed-off-by: zhuyanlin <zh...@xiaomi.com>
---
arch/xtensa/src/common/xtensa_dumpstate.c | 123 +++---------------------------
1 file changed, 10 insertions(+), 113 deletions(-)
diff --git a/arch/xtensa/src/common/xtensa_dumpstate.c b/arch/xtensa/src/common/xtensa_dumpstate.c
index fc93f9c..6627556 100644
--- a/arch/xtensa/src/common/xtensa_dumpstate.c
+++ b/arch/xtensa/src/common/xtensa_dumpstate.c
@@ -69,6 +69,13 @@ static void up_taskdump(FAR struct tcb_s *tcb, FAR void *arg)
tcb->pid, (unsigned long)up_check_tcbstack(tcb),
(unsigned long)tcb->adj_stack_size);
#endif
+
+ /* Dump the backtrace */
+
+#if defined(CONFIG_XTENSA_DUMPBT_ON_ASSERT) && \
+ defined(CONFIG_SCHED_BACKTRACE)
+ sched_dumpstack(rtcb->pid);
+#endif
}
#endif
@@ -150,117 +157,6 @@ static inline void xtensa_registerdump(void)
#endif
}
-#ifdef CONFIG_XTENSA_DUMPBT_ON_ASSERT
-
-/****************************************************************************
- * Name: xtensa_getcause
- ****************************************************************************/
-
-static inline uint32_t xtensa_getcause(void)
-{
- uint32_t cause;
-
- __asm__ __volatile__
- (
- "rsr %0, EXCCAUSE" : "=r"(cause)
- );
-
- return cause;
-}
-
-/****************************************************************************
- * Name: stackpc
- ****************************************************************************/
-
-static inline uint32_t stackpc(uint32_t pc)
-{
- if (pc & 0x80000000)
- {
- /* Top two bits of a0 (return address) specify window increment.
- * Overwrite to map to address space.
- */
-
- pc = (pc & 0x3fffffff) | 0x40000000;
- }
-
- /* Minus 3 to get PC of previous instruction (i.e. instruction executed
- * before return address).
- */
-
- return pc - 3;
-}
-
-/****************************************************************************
- * Name: corruptedframe
- ****************************************************************************/
-
-static inline bool corruptedframe(uint32_t pc, uint32_t sp)
-{
- return !(xtensa_ptr_exec((void *)stackpc(pc)) || xtensa_sp_sane(sp));
-}
-
-/****************************************************************************
- * Name: nextframe
- ****************************************************************************/
-
-static bool nextframe(uint32_t *pc, uint32_t *sp, uint32_t *npc)
-{
- /* Use frame(i - 1)'s base save area located below frame(i)'s sp to get
- * frame(i - 1)'s sp and frame(i - 2)'s pc. Base save area consists of
- * 4 words under SP.
- */
-
- void *bsa = (void *)*sp;
-
- *pc = *npc;
- *npc = *((uint32_t *)(bsa - 16));
- *sp = *((uint32_t *)(bsa - 12));
-
- return !corruptedframe(*pc, *sp);
-}
-
-/****************************************************************************
- * Name: xtensa_btdump
- ****************************************************************************/
-
-static inline void xtensa_btdump(void)
-{
- uint32_t pc;
- uint32_t sp;
- uint32_t npc;
- int i;
- bool corrupted = false;
-
- uint32_t *regs = (uint32_t *)CURRENT_REGS;
-
- pc = regs[REG_PC];
- npc = regs[REG_A0]; /* return register */
- sp = regs[REG_A1]; /* stack pointer */
-
- _alert("Backtrace0: %x:%x\n", stackpc(pc), sp);
-
- corrupted = corruptedframe(pc, sp) &&
- !(xtensa_getcause() == EXCCAUSE_INSTR_PROHIBITED);
-
- for (i = 1; i <= CONFIG_XTENSA_BTDEPTH && npc != 0 && !corrupted; i++)
- {
- if (!nextframe(&pc, &sp, &npc))
- {
- corrupted = true;
- }
-
- _alert("Backtrace%d: %x:%x\n", i, stackpc(pc), sp);
- }
-
- _alert("BACKTRACE %s\n",
- (corrupted ? "CORRUPTED!" : (npc == 0 ? "Done":"CONTINUES...")));
-}
-#endif /* CONFIG_XTENSA_DUMPBT_ON_ASSERT */
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
/****************************************************************************
* Name: xtensa_dumpstate
****************************************************************************/
@@ -288,8 +184,9 @@ void xtensa_dumpstate(void)
/* Dump the backtrace */
-#ifdef CONFIG_XTENSA_DUMPBT_ON_ASSERT
- xtensa_btdump();
+#if defined(CONFIG_XTENSA_DUMPBT_ON_ASSERT) && \
+ defined(CONFIG_SCHED_BACKTRACE)
+ sched_dumpstack(rtcb->pid);
#endif
/* Get the limits on the user stack memory */