xtensa:backtrace: flush to stack when in interrupt
The registers may be in window during interrupt. Flush window stack to stack first. And fix warning in build. Signed-off-by: zhuyanlin <zhuyanlin1@xiaomi.com>
This commit is contained in:
parent
a5406c63cb
commit
7947e50f06
@ -37,7 +37,7 @@
|
|||||||
|
|
||||||
/* Convert return address to a valid pc */
|
/* Convert return address to a valid pc */
|
||||||
|
|
||||||
#define MAKE_PC_FROM_RA(ra) ((ra) & 0x3fffffff)
|
#define MAKE_PC_FROM_RA(ra) (uintptr_t *)((ra) & 0x3fffffff)
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Private Types
|
* Private Types
|
||||||
@ -52,6 +52,13 @@ struct xtensa_windowregs_s
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Function Prototypes
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static void inline get_window_regs(struct xtensa_windowregs_s *frame)
|
||||||
|
inline_function;
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Private Functions
|
* Private Functions
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
@ -66,7 +73,6 @@ struct xtensa_windowregs_s
|
|||||||
|
|
||||||
#ifndef __XTENSA_CALL0_ABI__
|
#ifndef __XTENSA_CALL0_ABI__
|
||||||
static void get_window_regs(struct xtensa_windowregs_s *frame)
|
static void get_window_regs(struct xtensa_windowregs_s *frame)
|
||||||
inline_function
|
|
||||||
{
|
{
|
||||||
__asm__ __volatile__("\trsr %0, WINDOWSTART\n": "=r"(frame->windowstart));
|
__asm__ __volatile__("\trsr %0, WINDOWSTART\n": "=r"(frame->windowstart));
|
||||||
__asm__ __volatile__("\trsr %0, WINDOWBASE\n": "=r"(frame->windowbase));
|
__asm__ __volatile__("\trsr %0, WINDOWBASE\n": "=r"(frame->windowbase));
|
||||||
@ -125,7 +131,7 @@ static int backtrace_window(FAR uintptr_t *base, FAR uintptr_t *limit,
|
|||||||
ra = frame->areg[index * 4];
|
ra = frame->areg[index * 4];
|
||||||
sp = frame->areg[index * 4 + 1];
|
sp = frame->areg[index * 4 + 1];
|
||||||
|
|
||||||
if (sp > limit || sp < base || ra == 0)
|
if (sp > (uint32_t)limit || sp < (uint32_t)base || ra == 0)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -226,6 +232,8 @@ int up_backtrace(FAR struct tcb_s *tcb, FAR void **buffer, int size)
|
|||||||
#else
|
#else
|
||||||
istackbase = &g_intstackalloc;
|
istackbase = &g_intstackalloc;
|
||||||
#endif
|
#endif
|
||||||
|
xtensa_window_spill();
|
||||||
|
|
||||||
ret = bactrace_stack((FAR void *)istackbase,
|
ret = bactrace_stack((FAR void *)istackbase,
|
||||||
(FAR void *)((uint32_t)&g_intstackalloc +
|
(FAR void *)((uint32_t)&g_intstackalloc +
|
||||||
CONFIG_ARCH_INTERRUPTSTACK),
|
CONFIG_ARCH_INTERRUPTSTACK),
|
||||||
|
Loading…
Reference in New Issue
Block a user