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 2022/07/27 12:48:43 UTC
[incubator-nuttx] 04/06: arch/xtensa: optimize stackdump
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 0ca02a5564b426a8d435265615dec8c726d1bcff
Author: Jiuzhu Dong <do...@xiaomi.com>
AuthorDate: Wed Jul 27 02:14:48 2022 +0000
arch/xtensa: optimize stackdump
Signed-off-by: Jiuzhu Dong <do...@xiaomi.com>
---
arch/xtensa/src/common/xtensa_dumpstate.c | 125 +++++++++++-------------------
1 file changed, 47 insertions(+), 78 deletions(-)
diff --git a/arch/xtensa/src/common/xtensa_dumpstate.c b/arch/xtensa/src/common/xtensa_dumpstate.c
index f99a745770..faeb0bcd8b 100644
--- a/arch/xtensa/src/common/xtensa_dumpstate.c
+++ b/arch/xtensa/src/common/xtensa_dumpstate.c
@@ -273,6 +273,39 @@ static inline void xtensa_registerdump(uintptr_t *regs)
#endif
}
+/****************************************************************************
+ * Name: xtensa_dump_stack
+ ****************************************************************************/
+
+static void xtensa_dump_stack(const char *tag, uint32_t sp,
+ uint32_t base, uint32_t size, bool force)
+{
+ uint32_t top = base + size;
+
+ _alert("%s Stack:\n", tag);
+ _alert("sp: %08" PRIx32 "\n", sp);
+ _alert(" base: %08" PRIx32 "\n", base);
+ _alert(" size: %08" PRIx32 "\n", size);
+#ifdef CONFIG_STACK_COLORATION
+ _alert(" used: %08" PRIx32 "\n", xtensa_stack_check((uintptr_t)base,
+ size));
+#endif
+
+ if (sp >= base && sp < top)
+ {
+ xtensa_stackdump(sp, top);
+ }
+ else
+ {
+ _alert("ERROR: %s Stack pointer is not within the stack\n", tag);
+
+ if (force)
+ {
+ xtensa_stackdump(base, top);
+ }
+ }
+}
+
/****************************************************************************
* Name: xtensa_dumpstate
****************************************************************************/
@@ -281,12 +314,6 @@ void xtensa_dumpstate(void)
{
struct tcb_s *rtcb = running_task();
uint32_t sp = up_getsp();
- uint32_t ustackbase;
- uint32_t ustacksize;
-#if CONFIG_ARCH_INTERRUPTSTACK > 15
- uint32_t istackbase;
- uint32_t istacksize;
-#endif
#ifdef CONFIG_SMP
/* Show the CPU number */
@@ -316,88 +343,30 @@ void xtensa_dumpstate(void)
sched_dumpstack(rtcb->pid);
#endif
- /* Get the limits on the user stack memory */
-
- ustackbase = (uint32_t)rtcb->stack_base_ptr;
- ustacksize = (uint32_t)rtcb->adj_stack_size;
-
- /* Get the limits on the interrupt stack memory */
+ /* Dump the irq stack */
#if CONFIG_ARCH_INTERRUPTSTACK > 15
-#ifdef CONFIG_SMP
- istackbase = (uint32_t)xtensa_intstack_alloc();
-#else
- istackbase = (uint32_t)&g_intstackalloc;
-#endif
- istacksize = INTSTACK_SIZE;
-
- /* Show interrupt stack info */
-
- _alert("sp: %08x\n", sp);
- _alert("IRQ stack:\n");
- _alert(" base: %08x\n", istackbase);
- _alert(" size: %08x\n", istacksize);
-#ifdef CONFIG_STACK_COLORATION
- _alert(" used: %08x\n", up_check_intstack());
-#endif
-
- /* Does the current stack pointer lie within the interrupt
- * stack?
- */
-
- if (sp >= istackbase && sp < istackbase + istacksize)
- {
- /* Yes.. dump the interrupt stack */
-
- xtensa_stackdump(sp, istackbase + istacksize);
- }
- else if (CURRENT_REGS)
- {
- _alert("ERROR: Stack pointer is not within the interrupt stack\n");
- xtensa_stackdump(istackbase, istackbase + istacksize);
- }
-
- /* Extract the user stack pointer if we are in an interrupt handler.
- * If we are not in an interrupt handler. Then sp is the user stack
- * pointer (and the above range check should have failed).
- */
+ xtensa_dump_stack("IRQ", sp,
+# ifdef CONFIG_SMP
+ (uint32_t)xtensa_intstack_alloc(),
+# else
+ (uint32_t)&g_intstackalloc,
+# endif
+ INTSTACK_SIZE,
+ !!CURRENT_REGS);
if (CURRENT_REGS)
{
sp = CURRENT_REGS[REG_A1];
- _alert("sp: %08x\n", sp);
}
-
- /* Show user stack info */
-
- _alert("User stack:\n");
- _alert(" base: %08x\n", ustackbase);
- _alert(" size: %08x\n", ustacksize);
-#ifdef CONFIG_STACK_COLORATION
- _alert(" used: %08x\n", up_check_tcbstack(rtcb));
-#endif
-#else
- _alert("sp: %08x\n", sp);
- _alert("stack base: %08x\n", ustackbase);
- _alert("stack size: %08x\n", ustacksize);
-#ifdef CONFIG_STACK_COLORATION
- _alert("stack used: %08x\n", up_check_tcbstack(rtcb));
-#endif
#endif
- /* Dump the user stack if the stack pointer lies within the allocated user
- * stack memory.
- */
+ /* Dump the user stack */
- if (sp >= ustackbase && sp < ustackbase + ustacksize)
- {
- xtensa_stackdump(sp, ustackbase + ustacksize);
- }
- else
- {
- _alert("ERROR: Stack pointer is not within allocated stack\n");
- xtensa_stackdump(ustackbase, ustackbase + ustacksize);
- }
+ xtensa_dump_stack("User", sp,
+ (uint32_t)rtcb->stack_base_ptr,
+ (uint32_t)rtcb->adj_stack_size,
+ true);
/* Dump the state of all tasks (if available) */