assert: show stacks with the sp from regs

1. Get the value of sp from dump regs when an exception occurs,
   to avoid getting the value of fp from up_getsp and causing
   incomplete stack printing.
2. Determine which stack the value belongs to based on the value
   of SP to avoid false reports of stack overflow

Signed-off-by: zhangyuan21 <zhangyuan21@xiaomi.com>
This commit is contained in:
zhangyuan21 2023-04-06 14:32:25 +08:00 committed by Xiang Xiao
parent dec80be431
commit 841b178782
25 changed files with 160 additions and 99 deletions

View File

@ -45,9 +45,10 @@
* Name: up_getusrsp
****************************************************************************/
uintptr_t up_getusrsp(void)
uintptr_t up_getusrsp(void *regs)
{
return CURRENT_REGS[REG_SP];
uint32_t *ptr = regs;
return ptr[REG_SP];
}
/****************************************************************************

View File

@ -47,9 +47,10 @@
* Name: up_getusrsp
****************************************************************************/
uintptr_t up_getusrsp(void)
uintptr_t up_getusrsp(void *regs)
{
return CURRENT_REGS[REG_X13];
struct regs_context *ptr = regs;
return ptr->regs[REG_X13];
}
/****************************************************************************

View File

@ -42,9 +42,10 @@
* Name: up_getusrsp
****************************************************************************/
uintptr_t up_getusrsp(void)
uintptr_t up_getusrsp(void *regs)
{
return g_current_regs[REG_R13];
uint8_t *ptr = regs;
return ptr[REG_R13];
}
/****************************************************************************

View File

@ -42,9 +42,10 @@
* Name: up_getusrsp
****************************************************************************/
uintptr_t up_getusrsp(void)
uintptr_t up_getusrsp(void *regs)
{
return g_current_regs[REG_R13];
uint8_t *ptr = regs;
return ptr[REG_R13];
}
/****************************************************************************

View File

@ -39,9 +39,10 @@
* Name: up_getusrsp
****************************************************************************/
uintptr_t up_getusrsp(void)
uintptr_t up_getusrsp(void *regs)
{
return CURRENT_REGS[REG_SP];
uint32_t *ptr = regs;
return ptr[REG_SP];
}
/****************************************************************************

View File

@ -40,9 +40,9 @@
* Name: up_getusrsp
****************************************************************************/
uintptr_t up_getusrsp(void)
uintptr_t up_getusrsp(void *regs)
{
uint8_t *ptr = (uint8_t *)g_current_regs;
uint8_t *ptr = regs;
return (uintptr_t)(ptr[REG_SPH] << 8 | ptr[REG_SPL]);
}

View File

@ -42,9 +42,10 @@
* Name: up_getusrsp
****************************************************************************/
uintptr_t up_getusrsp(void)
uintptr_t up_getusrsp(void *regs)
{
return CURRENT_REGS[REG_SP];
uint32_t *ptr = regs;
return ptr[REG_SP];
}
/****************************************************************************

View File

@ -41,9 +41,10 @@
* Name: up_getusrsp
****************************************************************************/
uintptr_t up_getusrsp(void)
uintptr_t up_getusrsp(void *regs)
{
return g_current_regs[REG_SP];
uint32_t *ptr = regs;
return ptr[REG_SP];
}
/****************************************************************************

View File

@ -41,9 +41,10 @@
* Name: up_getusrsp
****************************************************************************/
uintptr_t up_getusrsp(void)
uintptr_t up_getusrsp(void *regs)
{
return g_current_regs[REG_X2];
uint32_t *ptr = regs;
return ptr[REG_X2];
}
/****************************************************************************

View File

@ -40,9 +40,10 @@
* Name: up_getusrsp
****************************************************************************/
uintptr_t up_getusrsp(void)
uintptr_t up_getusrsp(void *regs)
{
return CURRENT_REGS[REG_R13];
uint32_t *ptr = regs;
return ptr[REG_R13];
}
/****************************************************************************

View File

@ -41,9 +41,9 @@
* Name: up_getusrsp
****************************************************************************/
uintptr_t up_getusrsp(void)
uintptr_t up_getusrsp(void *regs)
{
uint8_t *ptr = (uint8_t *) g_current_regs;
uint8_t *ptr = regs;
return (uintptr_t)(ptr[REG_SP] << 8 | ptr[REG_SP + 1]);
}

View File

@ -43,9 +43,10 @@
* Name: up_getusrsp
****************************************************************************/
uintptr_t up_getusrsp(void)
uintptr_t up_getusrsp(void *regs)
{
return g_current_regs[REG_SP];
uint32_t *ptr = regs;
return ptr[REG_SP];
}
/****************************************************************************

View File

@ -40,9 +40,10 @@
* Name: up_getusrsp
****************************************************************************/
uintptr_t up_getusrsp(void)
uintptr_t up_getusrsp(void *regs)
{
return g_current_regs[REG_SP];
uint32_t *ptr = regs;
return ptr[REG_SP];
}
/****************************************************************************

View File

@ -41,9 +41,10 @@
* Name: up_getusrsp
****************************************************************************/
uintptr_t up_getusrsp(void)
uintptr_t up_getusrsp(void *regs)
{
return CURRENT_REGS[REG_SP];
uintptr_t *ptr = regs;
return ptr[REG_SP];
}
/****************************************************************************

View File

@ -41,9 +41,10 @@
* Name: up_getusrsp
****************************************************************************/
uintptr_t up_getusrsp(void)
uintptr_t up_getusrsp(void *regs)
{
return CURRENT_REGS[REG_I6];
uint32_t *ptr = regs;
return ptr[REG_I6];
}
/****************************************************************************

View File

@ -37,9 +37,10 @@
* Name: up_getusrsp
****************************************************************************/
uintptr_t up_getusrsp(void)
uintptr_t up_getusrsp(void *regs)
{
return g_current_regs[REG_ESP];
uint32_t *ptr = regs;
return ptr[REG_ESP];
}
/****************************************************************************

View File

@ -38,9 +38,10 @@
* Name: up_getusrsp
****************************************************************************/
uintptr_t up_getusrsp(void)
uintptr_t up_getusrsp(void *regs)
{
return g_current_regs[REG_RSP];
uint64_t *ptr = regs;
return ptr[REG_RSP];
}
/****************************************************************************

View File

@ -41,9 +41,10 @@
* Name: up_getusrsp
****************************************************************************/
uintptr_t up_getusrsp(void)
uintptr_t up_getusrsp(void *regs)
{
return CURRENT_REGS[REG_A1];
uintptr_t *ptr = regs;
return ptr[REG_A1];
}
/****************************************************************************

View File

@ -37,9 +37,10 @@
* Name: up_getusrsp
****************************************************************************/
uintptr_t up_getusrsp(void)
uintptr_t up_getusrsp(FAR void *regs)
{
return g_current_regs[REG_SP];
FAR uint32_t *ptr = regs;
return ptr[REG_SP];
}
/****************************************************************************

View File

@ -40,10 +40,10 @@
* Name: up_getusrsp
****************************************************************************/
uintptr_t up_getusrsp(void)
uintptr_t up_getusrsp(FAR void *regs)
{
FAR chipreg_t *regs = g_current_regs;
return regs[XCPT_SP];
FAR chipreg_t *ptr = regs;
return ptr[XCPT_SP];
}
/****************************************************************************

View File

@ -40,10 +40,10 @@
* Name: up_getusrsp
****************************************************************************/
uintptr_t up_getusrsp(void)
uintptr_t up_getusrsp(FAR void *regs)
{
FAR chipreg_t *regs = g_current_regs;
return regs[XCPT_SP];
FAR chipreg_t *ptr = regs;
return ptr[XCPT_SP];
}
/****************************************************************************

View File

@ -59,10 +59,10 @@ static inline void z8_dumpstate(chipreg_t sp, chipreg_t pc, uint8_t irqctl,
* Name: up_getusrsp
****************************************************************************/
uintptr_t up_getusrsp(void)
uintptr_t up_getusrsp(FAR void *regs)
{
FAR chipreg_t *regs = g_z8irqstate.regs;
return regs[XCPT_SP];
FAR chipreg_t *ptr = regs;
return ptr[XCPT_SP];
}
/****************************************************************************

View File

@ -40,10 +40,10 @@
* Name: up_getusrsp
****************************************************************************/
uintptr_t up_getusrsp(void)
uintptr_t up_getusrsp(FAR void *regs)
{
FAR chipreg_t *regs = g_current_regs;
return regs[XCPT_SP];
FAR chipreg_t *ptr = regs;
return ptr[XCPT_SP];
}
/****************************************************************************

View File

@ -1756,14 +1756,14 @@ int up_timer_tick_start(clock_t ticks);
* Name: up_getusrsp
*
* Input Parameters:
* None
* regs - regs to get sp
*
* Returned Value:
* User stack pointer.
*
****************************************************************************/
uintptr_t up_getusrsp(void);
uintptr_t up_getusrsp(FAR void *regs);
/****************************************************************************
* TLS support

View File

@ -148,82 +148,126 @@ static void dump_stack(FAR const char *tag, uintptr_t sp,
_alert(" base: %p\n", (FAR void *)base);
_alert(" size: %08zu\n", size);
if (sp >= base && sp < top)
if (!force)
{
stack_dump(sp, top);
}
else
{
_alert("ERROR: %s Stack pointer is not within the stack\n", tag);
if (force)
{
#ifdef CONFIG_STACK_COLORATION
size_t remain = size - used;
size_t remain = size - used;
base += remain;
size -= remain;
base += remain;
size -= remain;
#endif
#if CONFIG_ARCH_STACKDUMP_MAX_LENGTH > 0
if (size > CONFIG_ARCH_STACKDUMP_MAX_LENGTH)
{
size = CONFIG_ARCH_STACKDUMP_MAX_LENGTH;
}
if (size > CONFIG_ARCH_STACKDUMP_MAX_LENGTH)
{
size = CONFIG_ARCH_STACKDUMP_MAX_LENGTH;
}
#endif
stack_dump(base, base + size);
}
stack_dump(base, base + size);
}
}
/****************************************************************************
* Name: showstacks
* Name: show_stacks
****************************************************************************/
static void show_stacks(FAR struct tcb_s *rtcb)
static void show_stacks(FAR struct tcb_s *rtcb, uintptr_t sp)
{
uintptr_t sp = up_getsp();
/* Get the limits on the interrupt stack memory */
#if CONFIG_ARCH_INTERRUPTSTACK > 0
uintptr_t intstack_base = up_get_intstackbase();
size_t intstack_size = CONFIG_ARCH_INTERRUPTSTACK;
uintptr_t intstack_top = intstack_base + intstack_size;
#endif
#ifdef CONFIG_ARCH_KERNEL_STACK
uintptr_t kernelstack_base = (uintptr_t)rtcb->xcp.kstack;
size_t kernelstack_size = CONFIG_ARCH_KERNEL_STACKSIZE;
uintptr_t kernelstack_top = kernelstack_base + kernelstack_size;
#endif
uintptr_t tcbstack_base = (uintptr_t)rtcb->stack_base_ptr;
size_t tcbstack_size = (size_t)rtcb->adj_stack_size;
uintptr_t tcbstack_top = tcbstack_base + tcbstack_size;
#if CONFIG_ARCH_INTERRUPTSTACK > 0
dump_stack("IRQ", sp,
up_get_intstackbase(),
CONFIG_ARCH_INTERRUPTSTACK,
# ifdef CONFIG_STACK_COLORATION
up_check_intstack(),
# else
0,
# endif
up_interrupt_context());
if (up_interrupt_context())
if (sp >= intstack_base && sp < intstack_top)
{
sp = up_getusrsp();
}
#endif
dump_stack("User", sp,
(uintptr_t)rtcb->stack_base_ptr,
(size_t)rtcb->adj_stack_size,
dump_stack("IRQ", sp,
intstack_base,
intstack_size,
#ifdef CONFIG_STACK_COLORATION
up_check_tcbstack(rtcb),
up_check_intstack(),
#else
0,
0,
#endif
false
);
}
else
#endif
#ifdef CONFIG_ARCH_KERNEL_STACK
false
#else
true
if (sp >= kernelstack_base && sp < kernelstack_top)
{
dump_stack("Kernel", sp,
kernelstack_base,
kernelstack_size,
0, false
);
}
else
#endif
if (sp >= tcbstack_base && sp < tcbstack_top)
{
dump_stack("User", sp,
tcbstack_base,
tcbstack_size,
#ifdef CONFIG_STACK_COLORATION
up_check_tcbstack(rtcb),
#else
0,
#endif
false
);
}
else
{
_alert("ERROR: Stack pointer is not within the stack\n");
#if CONFIG_ARCH_INTERRUPTSTACK > 0
dump_stack("IRQ", sp,
intstack_base,
intstack_size,
#ifdef CONFIG_STACK_COLORATION
up_check_intstack(),
#else
0,
#endif
true
);
#endif
);
#ifdef CONFIG_ARCH_KERNEL_STACK
dump_stack("Kernel", sp,
(uintptr_t)rtcb->xcp.kstack,
CONFIG_ARCH_KERNEL_STACKSIZE,
0, false);
dump_stack("Kernel", sp,
kernelstack_base,
kernelstack_size,
0, true
);
#endif
dump_stack("User", sp,
tcbstack_base,
tcbstack_size,
#ifdef CONFIG_STACK_COLORATION
up_check_tcbstack(rtcb),
#else
0,
#endif
true
);
}
}
#endif
@ -487,7 +531,7 @@ void _assert(FAR const char *filename, int linenum,
up_dump_register(regs);
#ifdef CONFIG_ARCH_STACKDUMP
show_stacks(rtcb);
show_stacks(rtcb, up_getusrsp(regs));
#endif
/* Flush any buffered SYSLOG data */