mirror of
https://github.com/espressif/ESP8266_RTOS_SDK.git
synced 2025-06-05 21:31:57 +08:00
Merge branch 'feature/add_panic_extra_stack' into 'master'
Add function to panic NMI/ISR/task stack data and keep its stack safe See merge request sdk/ESP8266_RTOS_SDK!568
This commit is contained in:
@ -98,11 +98,11 @@ static void panic_stack(StackType_t *start_stk, StackType_t *end_stk)
|
||||
{
|
||||
uint32_t *start = (uint32_t *)start_stk, *end = (uint32_t *)end_stk;
|
||||
size_t i, j;
|
||||
size_t size = end - start + 1;
|
||||
size_t size = end - start;
|
||||
|
||||
panic_str(" ");
|
||||
for (i = 0; i < STACK_VOL_NUM; i++) {
|
||||
panic_data32(i * sizeof(StackType_t), 16);
|
||||
panic_data32(i * sizeof(void *), 16);
|
||||
panic_str(" ");
|
||||
}
|
||||
panic_str("\r\n\r\n");
|
||||
@ -133,6 +133,8 @@ static void panic_stack(StackType_t *start_stk, StackType_t *end_stk)
|
||||
*/
|
||||
static void panic_info(void *frame, int wdt)
|
||||
{
|
||||
extern int _chip_nmi_cnt;
|
||||
|
||||
task_info_t *task;
|
||||
int *regs = (int *)frame;
|
||||
int x, y;
|
||||
@ -151,29 +153,43 @@ static void panic_info(void *frame, int wdt)
|
||||
show_critical_info();
|
||||
}
|
||||
|
||||
if (xPortInIsrContext())
|
||||
panic_str("Core 0 was running in ISR context:\r\n\r\n");
|
||||
if (_chip_nmi_cnt) {
|
||||
extern StackType_t _chip_nmi_stk, LoadStoreErrorHandlerStack;
|
||||
|
||||
if ((task = (task_info_t *)xTaskGetCurrentTaskHandle())) {
|
||||
StackType_t *pdata = task->pxStack;
|
||||
StackType_t *end = task->pxEndOfStack + 4;
|
||||
_chip_nmi_cnt = 0;
|
||||
panic_str("Core 0 was running in NMI context:\r\n\r\n");
|
||||
|
||||
// "Task stack [%s] stack from [%p] to [%p], total [%d] size\r\n\r\n"
|
||||
panic_str("Task stack [");
|
||||
panic_str(task->pcTaskName);
|
||||
panic_str("] stack from [");
|
||||
panic_data32((uint32_t)pdata, 16);
|
||||
panic_str("] to [");
|
||||
panic_data32((uint32_t)end, 16);
|
||||
panic_str("], total [");
|
||||
panic_data32((uint32_t)(end - pdata + 4), 10);
|
||||
panic_str("] size\r\n\r\n");
|
||||
|
||||
panic_stack(pdata, end);
|
||||
|
||||
panic_str("\r\n\r\n");
|
||||
panic_stack(&_chip_nmi_stk, &LoadStoreErrorHandlerStack);
|
||||
} else {
|
||||
panic_str("No task\r\n\r\n");
|
||||
if (xPortInIsrContext()) {
|
||||
extern StackType_t _chip_interrupt_stk, _chip_interrupt_tmp;
|
||||
|
||||
panic_str("Core 0 was running in ISR context:\r\n\r\n");
|
||||
|
||||
panic_stack(&_chip_interrupt_stk, &_chip_interrupt_tmp);
|
||||
} else {
|
||||
if ((task = (task_info_t *)xTaskGetCurrentTaskHandle())) {
|
||||
StackType_t *pdata = task->pxStack;
|
||||
StackType_t *end = task->pxEndOfStack + 4;
|
||||
|
||||
// "Task stack [%s] stack from [%p] to [%p], total [%d] size\r\n\r\n"
|
||||
panic_str("Task stack [");
|
||||
panic_str(task->pcTaskName);
|
||||
panic_str("] stack from [");
|
||||
panic_data32((uint32_t)pdata, 16);
|
||||
panic_str("] to [");
|
||||
panic_data32((uint32_t)end, 16);
|
||||
panic_str("], total [");
|
||||
panic_data32((uint32_t)(end - pdata), 10);
|
||||
panic_str("] size\r\n\r\n");
|
||||
|
||||
panic_stack(pdata, end);
|
||||
|
||||
panic_str("\r\n\r\n");
|
||||
} else {
|
||||
panic_str("No task\r\n\r\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (x = 0; x < 20; x += 4) {
|
||||
|
@ -128,10 +128,12 @@ STRUCT_END(HighPriFrame)
|
||||
|
||||
// Allocate save area and stack:
|
||||
// (must use .bss, not .comm, because the subsequent .set does not work otherwise)
|
||||
.global _chip_nmi_stk
|
||||
.section .bss, "aw"
|
||||
.align 16
|
||||
LABEL(_Pri_,_Stack): .space PRI_N_STACK_SIZE + HESF_TOTALSIZE + PRI_N_STACK_SIZE2 + HESF_TOTALSIZE
|
||||
_chip_nmi_stk: .space PRI_N_STACK_SIZE + HESF_TOTALSIZE + PRI_N_STACK_SIZE2 + HESF_TOTALSIZE
|
||||
|
||||
.global LoadStoreErrorHandlerStack
|
||||
.balign 16
|
||||
LoadStoreErrorHandlerStack:
|
||||
.word 0 # a0
|
||||
@ -155,8 +157,8 @@ LoadStoreErrorHandlerStack_reentry:
|
||||
.data
|
||||
.global LABEL(_Pri_,_HandlerAddress)
|
||||
LABEL(_Pri_,_HandlerAddress): .space 4
|
||||
.global LABEL(_Pri_, _NMICount)
|
||||
LABEL(_Pri_,_NMICount): .space 4
|
||||
.global _chip_nmi_cnt
|
||||
_chip_nmi_cnt: .space 4
|
||||
#endif
|
||||
|
||||
.section .data, "aw"
|
||||
@ -189,7 +191,7 @@ LoadStoreErrorHandler:
|
||||
rsr a0, excsave1 # restore a0 saved by UserExceptionVector
|
||||
wsr a1, excsave1 # save a1 to excsave1, a1 can be used as varalbe
|
||||
|
||||
movi a1, LABEL(_Pri_,_NMICount)
|
||||
movi a1, _chip_nmi_cnt
|
||||
l32i a1, a1, 0
|
||||
|
||||
bnez a1, LoadStoreErrorHandler_reentry
|
||||
@ -1080,14 +1082,14 @@ _xt_nmi:
|
||||
ADD HIGH PRIORITY NON-MASKABLE INTERRUPT (NMI) HANDLER CODE HERE.
|
||||
*/
|
||||
|
||||
movi a0, LABEL(_Pri_,_NMICount)
|
||||
movi a0, _chip_nmi_cnt
|
||||
l32i a0, a0, 0
|
||||
|
||||
bnez a0, nmi_reentry
|
||||
movi a0, LABEL(_Pri_,_Stack) + PRI_N_STACK_SIZE // get ptr to save area
|
||||
movi a0, _chip_nmi_stk + PRI_N_STACK_SIZE // get ptr to save area
|
||||
j nmi_common
|
||||
nmi_reentry:
|
||||
movi a0, LABEL(_Pri_,_Stack) + PRI_N_STACK_SIZE + HESF_TOTALSIZE + PRI_N_STACK_SIZE2// get ptr to save area
|
||||
movi a0, _chip_nmi_stk + PRI_N_STACK_SIZE + HESF_TOTALSIZE + PRI_N_STACK_SIZE2// get ptr to save area
|
||||
nmi_common:
|
||||
|
||||
// interlock
|
||||
@ -1186,7 +1188,7 @@ nmi_reentried:
|
||||
|
||||
#endif /* __XTENSA_WINDOWED_ABI__ */
|
||||
|
||||
//movi a1, LABEL(_Pri_,_Stack) + PRI_N_STACK_SIZE // get ptr to save area (is also initial stack ptr)
|
||||
//movi a1, _chip_nmi_stk + PRI_N_STACK_SIZE // get ptr to save area (is also initial stack ptr)
|
||||
mov a1, a0
|
||||
movi a0, 0 // mark start of call frames in stack
|
||||
|
||||
@ -1247,7 +1249,7 @@ nmi_reentried:
|
||||
#endif
|
||||
|
||||
//save NMI Count
|
||||
movi a2, LABEL(_Pri_,_NMICount)
|
||||
movi a2, _chip_nmi_cnt
|
||||
l32i a3, a2, 0
|
||||
addi a3, a3, 1
|
||||
s32i a3, a2, 0
|
||||
@ -1262,16 +1264,16 @@ nmi_reentried:
|
||||
#endif
|
||||
|
||||
//Restore NMI level
|
||||
movi a2, LABEL(_Pri_,_NMICount)
|
||||
movi a2, _chip_nmi_cnt
|
||||
l32i a3, a2, 0
|
||||
addi a3, a3, -1
|
||||
s32i a3, a2, 0
|
||||
|
||||
beqi a3, 1, nmi_reentry2
|
||||
movi a1, LABEL(_Pri_,_Stack) + PRI_N_STACK_SIZE // get ptr to save area
|
||||
movi a1, _chip_nmi_stk + PRI_N_STACK_SIZE // get ptr to save area
|
||||
j nmi_common2
|
||||
nmi_reentry2:
|
||||
movi a1, LABEL(_Pri_,_Stack) + PRI_N_STACK_SIZE + HESF_TOTALSIZE + PRI_N_STACK_SIZE2// get ptr to save area
|
||||
movi a1, _chip_nmi_stk + PRI_N_STACK_SIZE + HESF_TOTALSIZE + PRI_N_STACK_SIZE2// get ptr to save area
|
||||
nmi_common2:
|
||||
|
||||
|
||||
@ -1331,7 +1333,7 @@ nmi_common2:
|
||||
// Note: register window has rotated, ie. a0..a15 clobbered.
|
||||
|
||||
// Reload initial stack pointer:
|
||||
movi a1, LABEL(_Pri_,_Stack) + PRI_N_STACK_SIZE // - 16
|
||||
movi a1, _chip_nmi_stk + PRI_N_STACK_SIZE // - 16
|
||||
movi a6, XCHAL_NUM_AREGS - 8 // how many saved so far
|
||||
addi a7, a1, -8*4
|
||||
|
||||
@ -1438,9 +1440,20 @@ _xt_ext_panic:
|
||||
movi a0, PS_INTLEVEL(5) | PS_UM
|
||||
wsr a0, PS
|
||||
|
||||
/* Allocate exception frame and save minimal context. */
|
||||
mov a0, sp
|
||||
|
||||
movi sp, _chip_nmi_cnt
|
||||
l32i sp, sp, 0
|
||||
|
||||
beqz sp, _panic_add_nmi_stk
|
||||
/* Allocate exception frame and save minimal context. */
|
||||
movi sp, _chip_interrupt_tmp
|
||||
j _panic_dump_reg
|
||||
|
||||
_panic_add_nmi_stk:
|
||||
movi sp, LoadStoreErrorHandlerStack
|
||||
|
||||
_panic_dump_reg:
|
||||
addi sp, sp, -XT_STK_FRMSZ
|
||||
s32i a0, sp, XT_STK_A1
|
||||
|
||||
|
Reference in New Issue
Block a user