From 04c19bb1c9426c6786667b4cf353b78c4947ce15 Mon Sep 17 00:00:00 2001 From: Masayuki Ishikawa Date: Tue, 2 Jul 2024 11:03:20 +0900 Subject: [PATCH] Revert "irq: remove restore_critical_section in irq" This reverts commit f6a9e9105712833c1074ffe88f8452def2e94dcf. --- arch/arm/src/armv6-m/arm_doirq.c | 1 + arch/arm/src/armv7-a/arm_doirq.c | 1 + arch/arm/src/armv7-m/arm_doirq.c | 1 + arch/arm/src/armv7-r/arm_doirq.c | 1 + arch/arm/src/armv8-m/arm_doirq.c | 1 + arch/arm/src/armv8-r/arm_doirq.c | 1 + arch/arm/src/tlsr82/tc32/tc32_doirq.c | 1 + arch/arm64/src/common/arm64_doirq.c | 3 +++ arch/ceva/src/common/ceva_doirq.c | 1 + arch/risc-v/src/common/riscv_doirq.c | 4 ++++ arch/sim/src/sim/sim_switchcontext.c | 4 ++++ arch/sparc/src/sparc_v8/sparc_v8_doirq.c | 7 +++++++ arch/xtensa/src/common/xtensa_irqdispatch.c | 1 + 13 files changed, 27 insertions(+) diff --git a/arch/arm/src/armv6-m/arm_doirq.c b/arch/arm/src/armv6-m/arm_doirq.c index 22a89cb673..80b076636f 100644 --- a/arch/arm/src/armv6-m/arm_doirq.c +++ b/arch/arm/src/armv6-m/arm_doirq.c @@ -79,6 +79,7 @@ uint32_t *arm_doirq(int irq, uint32_t *regs) g_running_tasks[this_cpu()] = this_task(); + restore_critical_section(); regs = (uint32_t *)CURRENT_REGS; } diff --git a/arch/arm/src/armv7-a/arm_doirq.c b/arch/arm/src/armv7-a/arm_doirq.c index 1dfa76983d..652de6a233 100644 --- a/arch/arm/src/armv7-a/arm_doirq.c +++ b/arch/arm/src/armv7-a/arm_doirq.c @@ -92,6 +92,7 @@ uint32_t *arm_doirq(int irq, uint32_t *regs) g_running_tasks[this_cpu()] = this_task(); + restore_critical_section(); regs = (uint32_t *)CURRENT_REGS; } diff --git a/arch/arm/src/armv7-m/arm_doirq.c b/arch/arm/src/armv7-m/arm_doirq.c index 10faadf111..e7b6411faa 100644 --- a/arch/arm/src/armv7-m/arm_doirq.c +++ b/arch/arm/src/armv7-m/arm_doirq.c @@ -79,6 +79,7 @@ uint32_t *arm_doirq(int irq, uint32_t *regs) g_running_tasks[this_cpu()] = this_task(); + restore_critical_section(); regs = (uint32_t *)CURRENT_REGS; } diff --git a/arch/arm/src/armv7-r/arm_doirq.c b/arch/arm/src/armv7-r/arm_doirq.c index 22299e999f..de5929dc9d 100644 --- a/arch/arm/src/armv7-r/arm_doirq.c +++ b/arch/arm/src/armv7-r/arm_doirq.c @@ -71,6 +71,7 @@ uint32_t *arm_doirq(int irq, uint32_t *regs) g_running_tasks[this_cpu()] = this_task(); + restore_critical_section(); regs = (uint32_t *)CURRENT_REGS; } diff --git a/arch/arm/src/armv8-m/arm_doirq.c b/arch/arm/src/armv8-m/arm_doirq.c index b4a921367b..5e942d7aa5 100644 --- a/arch/arm/src/armv8-m/arm_doirq.c +++ b/arch/arm/src/armv8-m/arm_doirq.c @@ -128,6 +128,7 @@ uint32_t *arm_doirq(int irq, uint32_t *regs) g_running_tasks[this_cpu()] = this_task(); + restore_critical_section(); regs = (uint32_t *)CURRENT_REGS; } diff --git a/arch/arm/src/armv8-r/arm_doirq.c b/arch/arm/src/armv8-r/arm_doirq.c index 33eaa02e69..c265a14976 100644 --- a/arch/arm/src/armv8-r/arm_doirq.c +++ b/arch/arm/src/armv8-r/arm_doirq.c @@ -64,6 +64,7 @@ uint32_t *arm_doirq(int irq, uint32_t *regs) if (regs != CURRENT_REGS) { + restore_critical_section(); regs = (uint32_t *)CURRENT_REGS; } diff --git a/arch/arm/src/tlsr82/tc32/tc32_doirq.c b/arch/arm/src/tlsr82/tc32/tc32_doirq.c index 7c772d330a..d19cdfbb00 100644 --- a/arch/arm/src/tlsr82/tc32/tc32_doirq.c +++ b/arch/arm/src/tlsr82/tc32/tc32_doirq.c @@ -98,6 +98,7 @@ uint32_t *arm_doirq(int irq, uint32_t *regs) if (regs != CURRENT_REGS) { + restore_critical_section(); regs = (uint32_t *)CURRENT_REGS; } diff --git a/arch/arm64/src/common/arm64_doirq.c b/arch/arm64/src/common/arm64_doirq.c index 264475dcad..c7ece5b76d 100644 --- a/arch/arm64/src/common/arm64_doirq.c +++ b/arch/arm64/src/common/arm64_doirq.c @@ -99,6 +99,9 @@ uint64_t *arm64_doirq(int irq, uint64_t * regs) g_running_tasks[this_cpu()] = this_task(); + /* Restore the cpu lock */ + + restore_critical_section(); regs = (uint64_t *)CURRENT_REGS; } diff --git a/arch/ceva/src/common/ceva_doirq.c b/arch/ceva/src/common/ceva_doirq.c index 81effb4a85..7a24a14671 100644 --- a/arch/ceva/src/common/ceva_doirq.c +++ b/arch/ceva/src/common/ceva_doirq.c @@ -85,6 +85,7 @@ uint32_t *ceva_doirq(int irq, uint32_t *regs) g_running_tasks[this_cpu()] = this_task(); + restore_critical_section(); regs = CURRENT_REGS; } diff --git a/arch/risc-v/src/common/riscv_doirq.c b/arch/risc-v/src/common/riscv_doirq.c index c72fd21c8f..7ed1a1ebe0 100644 --- a/arch/risc-v/src/common/riscv_doirq.c +++ b/arch/risc-v/src/common/riscv_doirq.c @@ -109,6 +109,10 @@ uintreg_t *riscv_doirq(int irq, uintreg_t *regs) g_running_tasks[this_cpu()] = this_task(); + /* Restore the cpu lock */ + + restore_critical_section(); + /* If a context switch occurred while processing the interrupt then * CURRENT_REGS may have change value. If we return any value * different from the input regs, then the lower level will know diff --git a/arch/sim/src/sim/sim_switchcontext.c b/arch/sim/src/sim/sim_switchcontext.c index 59045c1145..182d1a375b 100644 --- a/arch/sim/src/sim/sim_switchcontext.c +++ b/arch/sim/src/sim/sim_switchcontext.c @@ -75,6 +75,10 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb) nxsched_resume_scheduler(tcb); + /* Restore the cpu lock */ + + restore_critical_section(); + /* Then switch contexts */ sim_restorestate(tcb->xcp.regs); diff --git a/arch/sparc/src/sparc_v8/sparc_v8_doirq.c b/arch/sparc/src/sparc_v8/sparc_v8_doirq.c index 0733aace99..d434e3c7e0 100644 --- a/arch/sparc/src/sparc_v8/sparc_v8_doirq.c +++ b/arch/sparc/src/sparc_v8/sparc_v8_doirq.c @@ -118,6 +118,13 @@ uint32_t *sparc_doirq(int irq, uint32_t *regs) regs = (uint32_t *)((uint32_t)CURRENT_REGS - CPU_MINIMUM_STACK_FRAME_SIZE); + /* Restore the cpu lock */ + + if (regs != CURRENT_REGS) + { + restore_critical_section(); + } + /* Set CURRENT_REGS to NULL to indicate that we are no longer in an * interrupt handler. */ diff --git a/arch/xtensa/src/common/xtensa_irqdispatch.c b/arch/xtensa/src/common/xtensa_irqdispatch.c index be2c671b50..17457147e0 100644 --- a/arch/xtensa/src/common/xtensa_irqdispatch.c +++ b/arch/xtensa/src/common/xtensa_irqdispatch.c @@ -94,6 +94,7 @@ uint32_t *xtensa_irq_dispatch(int irq, uint32_t *regs) if (regs != CURRENT_REGS) { + restore_critical_section(); regs = (uint32_t *)CURRENT_REGS; }