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:
parent
dec80be431
commit
841b178782
@ -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];
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
|
@ -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];
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
|
@ -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];
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
|
@ -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];
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
|
@ -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];
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
|
@ -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]);
|
||||
}
|
||||
|
||||
|
@ -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];
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
|
@ -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];
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
|
@ -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];
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
|
@ -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];
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
|
@ -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]);
|
||||
}
|
||||
|
||||
|
@ -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];
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
|
@ -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];
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
|
@ -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];
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
|
@ -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];
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
|
@ -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];
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
|
@ -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];
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
|
@ -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];
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
|
@ -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];
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
|
@ -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];
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
|
@ -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];
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
|
@ -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];
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
|
@ -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];
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
|
@ -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
|
||||
|
@ -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 */
|
||||
|
Loading…
x
Reference in New Issue
Block a user