diff --git a/arch/xtensa/src/common/xtensa_exit.c b/arch/xtensa/src/common/xtensa_exit.c index 078ab195e9e8c..8108946e50035 100644 --- a/arch/xtensa/src/common/xtensa_exit.c +++ b/arch/xtensa/src/common/xtensa_exit.c @@ -68,7 +68,7 @@ void up_exit(int status) /* Scheduler parameters will update inside syscall */ - g_running_tasks[this_cpu()] = NULL; + g_running_tasks[this_cpu()] = tcb; /* Then switch contexts */ diff --git a/arch/xtensa/src/common/xtensa_irqdispatch.c b/arch/xtensa/src/common/xtensa_irqdispatch.c index 46e848c777c00..972647d6248f0 100644 --- a/arch/xtensa/src/common/xtensa_irqdispatch.c +++ b/arch/xtensa/src/common/xtensa_irqdispatch.c @@ -65,7 +65,11 @@ uint32_t *xtensa_irq_dispatch(int irq, uint32_t *regs) up_set_current_regs(regs); - if (*running_task != NULL) + /* This judgment proves that (*running_task)->xcp.regs + * is invalid, and we can safely overwrite it. + */ + + if (!(XTENSA_IRQ_SWINT == irq && regs[REG_A2] == SYS_restore_context)) { (*running_task)->xcp.regs = regs; }