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
+3 -2
View File
@@ -45,9 +45,10 @@
* Name: up_getusrsp * 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];
} }
/**************************************************************************** /****************************************************************************
+3 -2
View File
@@ -47,9 +47,10 @@
* Name: up_getusrsp * 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];
} }
/**************************************************************************** /****************************************************************************
+3 -2
View File
@@ -42,9 +42,10 @@
* Name: up_getusrsp * 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];
} }
/**************************************************************************** /****************************************************************************
+3 -2
View File
@@ -42,9 +42,10 @@
* Name: up_getusrsp * 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];
} }
/**************************************************************************** /****************************************************************************
+3 -2
View File
@@ -39,9 +39,10 @@
* Name: up_getusrsp * 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];
} }
/**************************************************************************** /****************************************************************************
+2 -2
View File
@@ -40,9 +40,9 @@
* Name: up_getusrsp * 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]); return (uintptr_t)(ptr[REG_SPH] << 8 | ptr[REG_SPL]);
} }
+3 -2
View File
@@ -42,9 +42,10 @@
* Name: up_getusrsp * 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];
} }
/**************************************************************************** /****************************************************************************
+3 -2
View File
@@ -41,9 +41,10 @@
* Name: up_getusrsp * 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];
} }
/**************************************************************************** /****************************************************************************
@@ -41,9 +41,10 @@
* Name: up_getusrsp * 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];
} }
/**************************************************************************** /****************************************************************************
+3 -2
View File
@@ -40,9 +40,10 @@
* Name: up_getusrsp * 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];
} }
/**************************************************************************** /****************************************************************************
+2 -2
View File
@@ -41,9 +41,9 @@
* Name: up_getusrsp * 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]); return (uintptr_t)(ptr[REG_SP] << 8 | ptr[REG_SP + 1]);
} }
+3 -2
View File
@@ -43,9 +43,10 @@
* Name: up_getusrsp * 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];
} }
/**************************************************************************** /****************************************************************************
+3 -2
View File
@@ -40,9 +40,10 @@
* Name: up_getusrsp * 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];
} }
/**************************************************************************** /****************************************************************************
+3 -2
View File
@@ -41,9 +41,10 @@
* Name: up_getusrsp * 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];
} }
/**************************************************************************** /****************************************************************************
@@ -41,9 +41,10 @@
* Name: up_getusrsp * 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];
} }
/**************************************************************************** /****************************************************************************
+3 -2
View File
@@ -37,9 +37,10 @@
* Name: up_getusrsp * 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];
} }
/**************************************************************************** /****************************************************************************
+3 -2
View File
@@ -38,9 +38,10 @@
* Name: up_getusrsp * 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];
} }
/**************************************************************************** /****************************************************************************
+3 -2
View File
@@ -41,9 +41,10 @@
* Name: up_getusrsp * 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];
} }
/**************************************************************************** /****************************************************************************
+3 -2
View File
@@ -37,9 +37,10 @@
* Name: up_getusrsp * 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];
} }
/**************************************************************************** /****************************************************************************
+3 -3
View File
@@ -40,10 +40,10 @@
* Name: up_getusrsp * Name: up_getusrsp
****************************************************************************/ ****************************************************************************/
uintptr_t up_getusrsp(void) uintptr_t up_getusrsp(FAR void *regs)
{ {
FAR chipreg_t *regs = g_current_regs; FAR chipreg_t *ptr = regs;
return regs[XCPT_SP]; return ptr[XCPT_SP];
} }
/**************************************************************************** /****************************************************************************
+3 -3
View File
@@ -40,10 +40,10 @@
* Name: up_getusrsp * Name: up_getusrsp
****************************************************************************/ ****************************************************************************/
uintptr_t up_getusrsp(void) uintptr_t up_getusrsp(FAR void *regs)
{ {
FAR chipreg_t *regs = g_current_regs; FAR chipreg_t *ptr = regs;
return regs[XCPT_SP]; return ptr[XCPT_SP];
} }
/**************************************************************************** /****************************************************************************
+3 -3
View File
@@ -59,10 +59,10 @@ static inline void z8_dumpstate(chipreg_t sp, chipreg_t pc, uint8_t irqctl,
* Name: up_getusrsp * Name: up_getusrsp
****************************************************************************/ ****************************************************************************/
uintptr_t up_getusrsp(void) uintptr_t up_getusrsp(FAR void *regs)
{ {
FAR chipreg_t *regs = g_z8irqstate.regs; FAR chipreg_t *ptr = regs;
return regs[XCPT_SP]; return ptr[XCPT_SP];
} }
/**************************************************************************** /****************************************************************************
+3 -3
View File
@@ -40,10 +40,10 @@
* Name: up_getusrsp * Name: up_getusrsp
****************************************************************************/ ****************************************************************************/
uintptr_t up_getusrsp(void) uintptr_t up_getusrsp(FAR void *regs)
{ {
FAR chipreg_t *regs = g_current_regs; FAR chipreg_t *ptr = regs;
return regs[XCPT_SP]; return ptr[XCPT_SP];
} }
/**************************************************************************** /****************************************************************************
+2 -2
View File
@@ -1756,14 +1756,14 @@ int up_timer_tick_start(clock_t ticks);
* Name: up_getusrsp * Name: up_getusrsp
* *
* Input Parameters: * Input Parameters:
* None * regs - regs to get sp
* *
* Returned Value: * Returned Value:
* User stack pointer. * User stack pointer.
* *
****************************************************************************/ ****************************************************************************/
uintptr_t up_getusrsp(void); uintptr_t up_getusrsp(FAR void *regs);
/**************************************************************************** /****************************************************************************
* TLS support * TLS support
+78 -34
View File
@@ -148,16 +148,12 @@ static void dump_stack(FAR const char *tag, uintptr_t sp,
_alert(" base: %p\n", (FAR void *)base); _alert(" base: %p\n", (FAR void *)base);
_alert(" size: %08zu\n", size); _alert(" size: %08zu\n", size);
if (sp >= base && sp < top) if (!force)
{ {
stack_dump(sp, top); stack_dump(sp, top);
} }
else else
{ {
_alert("ERROR: %s Stack pointer is not within the stack\n", tag);
if (force)
{
#ifdef CONFIG_STACK_COLORATION #ifdef CONFIG_STACK_COLORATION
size_t remain = size - used; size_t remain = size - used;
@@ -174,56 +170,104 @@ static void dump_stack(FAR const char *tag, uintptr_t sp,
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(); #if CONFIG_ARCH_INTERRUPTSTACK > 0
uintptr_t intstack_base = up_get_intstackbase();
/* Get the limits on the interrupt stack memory */ 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 #if CONFIG_ARCH_INTERRUPTSTACK > 0
dump_stack("IRQ", sp, if (sp >= intstack_base && sp < intstack_top)
up_get_intstackbase(),
CONFIG_ARCH_INTERRUPTSTACK,
# ifdef CONFIG_STACK_COLORATION
up_check_intstack(),
# else
0,
# endif
up_interrupt_context());
if (up_interrupt_context())
{ {
sp = up_getusrsp(); dump_stack("IRQ", sp,
} intstack_base,
intstack_size,
#ifdef CONFIG_STACK_COLORATION
up_check_intstack(),
#else
0,
#endif #endif
false
);
}
else
#endif
#ifdef CONFIG_ARCH_KERNEL_STACK
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, dump_stack("User", sp,
(uintptr_t)rtcb->stack_base_ptr, tcbstack_base,
(size_t)rtcb->adj_stack_size, tcbstack_size,
#ifdef CONFIG_STACK_COLORATION #ifdef CONFIG_STACK_COLORATION
up_check_tcbstack(rtcb), up_check_tcbstack(rtcb),
#else #else
0, 0,
#endif #endif
#ifdef CONFIG_ARCH_KERNEL_STACK
false false
#else
true
#endif
); );
}
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 #ifdef CONFIG_ARCH_KERNEL_STACK
dump_stack("Kernel", sp, dump_stack("Kernel", sp,
(uintptr_t)rtcb->xcp.kstack, kernelstack_base,
CONFIG_ARCH_KERNEL_STACKSIZE, kernelstack_size,
0, false); 0, true
);
#endif #endif
dump_stack("User", sp,
tcbstack_base,
tcbstack_size,
#ifdef CONFIG_STACK_COLORATION
up_check_tcbstack(rtcb),
#else
0,
#endif
true
);
}
} }
#endif #endif
@@ -487,7 +531,7 @@ void _assert(FAR const char *filename, int linenum,
up_dump_register(regs); up_dump_register(regs);
#ifdef CONFIG_ARCH_STACKDUMP #ifdef CONFIG_ARCH_STACKDUMP
show_stacks(rtcb); show_stacks(rtcb, up_getusrsp(regs));
#endif #endif
/* Flush any buffered SYSLOG data */ /* Flush any buffered SYSLOG data */