diff --git a/arch/risc-v/src/common/riscv_doirq.c b/arch/risc-v/src/common/riscv_doirq.c index eed6a227e13..dbdcaeda6bd 100644 --- a/arch/risc-v/src/common/riscv_doirq.c +++ b/arch/risc-v/src/common/riscv_doirq.c @@ -73,9 +73,12 @@ uintreg_t *riscv_doirq(int irq, uintreg_t *regs) if (irq >= RISCV_IRQ_ECALLU && irq <= RISCV_IRQ_ECALLM) { regs[REG_EPC] += 4; + if (regs[REG_A0] != SYS_restore_context) + { + (*running_task)->xcp.regs = regs; + } } - - if (*running_task != NULL) + else { (*running_task)->xcp.regs = regs; } diff --git a/arch/risc-v/src/common/riscv_exit.c b/arch/risc-v/src/common/riscv_exit.c index a5d4369ee97..904ebf05400 100644 --- a/arch/risc-v/src/common/riscv_exit.c +++ b/arch/risc-v/src/common/riscv_exit.c @@ -62,7 +62,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/risc-v/src/common/riscv_sigdeliver.c b/arch/risc-v/src/common/riscv_sigdeliver.c index d9ddfd5765f..6193fb7f2ac 100644 --- a/arch/risc-v/src/common/riscv_sigdeliver.c +++ b/arch/risc-v/src/common/riscv_sigdeliver.c @@ -164,10 +164,6 @@ retry: rtcb->irqcount--; #endif - /* g_running_tasks is not valid now */ - - g_running_tasks[this_cpu()] = NULL; - rtcb->xcp.regs = regs; riscv_fullcontextrestore(); } diff --git a/arch/risc-v/src/common/supervisor/riscv_perform_syscall.c b/arch/risc-v/src/common/supervisor/riscv_perform_syscall.c index 594e388f757..6b4419309b6 100644 --- a/arch/risc-v/src/common/supervisor/riscv_perform_syscall.c +++ b/arch/risc-v/src/common/supervisor/riscv_perform_syscall.c @@ -42,7 +42,7 @@ void *riscv_perform_syscall(uintreg_t *regs) struct tcb_s **running_task = &g_running_tasks[this_cpu()]; struct tcb_s *tcb; - if (*running_task != NULL) + if (regs[REG_A0] != SYS_restore_context) { (*running_task)->xcp.regs = regs; }