From 3e3701b2721c216cea47b72835a13966da52b555 Mon Sep 17 00:00:00 2001 From: hujun5 Date: Tue, 3 Dec 2024 16:41:20 +0800 Subject: [PATCH] riscv: Some judgments are missing This commit fixes the regression from https://github.com/apache/nuttx/pull/14984 Signed-off-by: hujun5 --- arch/risc-v/src/common/riscv_doirq.c | 13 +++++++++++-- .../src/common/supervisor/riscv_perform_syscall.c | 10 ++++++++-- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/arch/risc-v/src/common/riscv_doirq.c b/arch/risc-v/src/common/riscv_doirq.c index 1e1df6163d..4325bdad50 100644 --- a/arch/risc-v/src/common/riscv_doirq.c +++ b/arch/risc-v/src/common/riscv_doirq.c @@ -61,6 +61,7 @@ uintreg_t *riscv_doirq(int irq, uintreg_t *regs) { struct tcb_s **running_task = &g_running_tasks[this_cpu()]; + bool restore_context = false; struct tcb_s *tcb = this_task(); board_autoled_on(LED_INIRQ); @@ -77,6 +78,10 @@ uintreg_t *riscv_doirq(int irq, uintreg_t *regs) { (*running_task)->xcp.regs = regs; } + else + { + restore_context = true; + } } else { @@ -98,7 +103,7 @@ uintreg_t *riscv_doirq(int irq, uintreg_t *regs) /* Check for a context switch. */ - if (*running_task != tcb) + if (*running_task != tcb || restore_context) { #ifdef CONFIG_ARCH_ADDRENV /* Make sure that the address environment for the previously @@ -112,7 +117,11 @@ uintreg_t *riscv_doirq(int irq, uintreg_t *regs) /* Update scheduler parameters */ - nxsched_suspend_scheduler(*running_task); + if (!restore_context) + { + nxsched_suspend_scheduler(*running_task); + } + nxsched_resume_scheduler(tcb); /* Record the new "running" task when context switch occurred. 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 4f13d78d26..cb4b6c4333 100644 --- a/arch/risc-v/src/common/supervisor/riscv_perform_syscall.c +++ b/arch/risc-v/src/common/supervisor/riscv_perform_syscall.c @@ -40,11 +40,13 @@ void *riscv_perform_syscall(uintreg_t *regs) { struct tcb_s **running_task = &g_running_tasks[this_cpu()]; + bool restore_context = true; struct tcb_s *tcb; if (regs[REG_A0] != SYS_restore_context) { (*running_task)->xcp.regs = regs; + restore_context = false; } /* Set irq flag */ @@ -56,7 +58,7 @@ void *riscv_perform_syscall(uintreg_t *regs) riscv_swint(0, regs, NULL); tcb = this_task(); - if (*running_task != tcb) + if (*running_task != tcb || restore_context) { #ifdef CONFIG_ARCH_ADDRENV /* Make sure that the address environment for the previously @@ -69,7 +71,11 @@ void *riscv_perform_syscall(uintreg_t *regs) #endif /* Update scheduler parameters */ - nxsched_suspend_scheduler(*running_task); + if (!restore_context) + { + nxsched_suspend_scheduler(*running_task); + } + nxsched_resume_scheduler(tcb); /* Record the new "running" task. g_running_tasks[] is only used by