This is an automated email from the ASF dual-hosted git repository.

ligd pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit 6a57c5692578ee9e33e6a0c81f89425f4e9db604
Author: guoshengyuan1 <[email protected]>
AuthorDate: Tue Sep 23 10:24:02 2025 +0800

    arch: replace all nxsched_suspend/resume_*** with nxsched_switch_context
    
    Complete the missing scheduling information in some architectures
    
    In these architectures (riscv, avr, tricor) context switching
    can occur in both up_switch_context and xx_doirq
    
    Co-authored-by: yinshengkai <[email protected]>
    Signed-off-by: guoshengyuan1 <[email protected]>
---
 arch/avr/src/avr/avr_doirq.c                              |  8 +++++++-
 arch/avr/src/avr/avr_switchcontext.c                      | 10 +---------
 arch/avr/src/avr32/avr_doirq.c                            |  4 ++++
 arch/avr/src/avr32/avr_switchcontext.c                    | 10 +---------
 arch/ceva/src/common/ceva_doirq.c                         |  7 ++++---
 arch/ceva/src/common/ceva_switchcontext.c                 |  4 ++++
 arch/hc/src/common/hc_doirq.c                             |  4 ++++
 arch/hc/src/common/hc_switchcontext.c                     | 10 +---------
 arch/mips/src/mips32/mips_doirq.c                         |  6 +++++-
 arch/mips/src/mips32/mips_switchcontext.c                 | 10 +---------
 arch/misoc/src/lm32/lm32_doirq.c                          |  4 ++++
 arch/misoc/src/lm32/lm32_switchcontext.c                  | 10 +---------
 arch/misoc/src/minerva/minerva_doirq.c                    |  6 +++++-
 arch/misoc/src/minerva/minerva_switchcontext.c            | 10 +---------
 arch/or1k/src/common/or1k_doirq.c                         |  4 ++++
 arch/or1k/src/common/or1k_switchcontext.c                 | 10 +---------
 arch/renesas/src/common/renesas_doirq.c                   |  4 ++++
 arch/renesas/src/common/renesas_switchcontext.c           | 10 +---------
 arch/risc-v/src/common/riscv_doirq.c                      |  7 +------
 arch/risc-v/src/common/riscv_switchcontext.c              |  4 ++++
 arch/risc-v/src/common/supervisor/riscv_perform_syscall.c |  4 +---
 arch/sim/src/sim/sim_doirq.c                              |  8 +++++++-
 arch/sim/src/sim/sim_switchcontext.c                      | 10 +---------
 arch/sparc/src/sparc_v8/sparc_v8_doirq.c                  |  6 +++++-
 arch/sparc/src/sparc_v8/sparc_v8_switchcontext.c          | 10 +---------
 arch/tricore/src/common/tricore_doirq.c                   |  4 ++++
 arch/tricore/src/common/tricore_switchcontext.c           | 10 +---------
 arch/x86/src/common/x86_switchcontext.c                   | 10 +---------
 arch/x86/src/qemu/qemu_handlers.c                         |  3 +--
 arch/x86_64/src/common/x86_64_switchcontext.c             |  8 +++++---
 arch/x86_64/src/intel64/intel64_handlers.c                |  3 +--
 arch/xtensa/src/common/xtensa_irqdispatch.c               |  3 +--
 arch/z16/src/common/z16_doirq.c                           |  8 +++++++-
 arch/z16/src/common/z16_switchcontext.c                   | 10 +---------
 arch/z80/src/common/z80_doirq.c                           |  4 ++++
 arch/z80/src/common/z80_switchcontext.c                   | 11 ++---------
 36 files changed, 101 insertions(+), 153 deletions(-)

diff --git a/arch/avr/src/avr/avr_doirq.c b/arch/avr/src/avr/avr_doirq.c
index 7227fe8467e..20ad32d9079 100644
--- a/arch/avr/src/avr/avr_doirq.c
+++ b/arch/avr/src/avr/avr_doirq.c
@@ -96,12 +96,18 @@ uint8_t *avr_doirq(uint8_t irq, uint8_t *regs)
 
   if (regs != up_current_regs())
     {
+      struct tcb_s *tcb = this_task();
+
+      /* Update scheduler parameters */
+
+      nxsched_switch_context(*running_task, tcb);
+
       /* Record the new "running" task when context switch occurred.
        * g_running_tasks[] is only used by assertion logic for reporting
        * crashes.
        */
 
-      *running_task = this_task();
+      *running_task = tcb;
     }
 
   regs = up_current_regs();   /* Cast removes volatile attribute */
diff --git a/arch/avr/src/avr/avr_switchcontext.c 
b/arch/avr/src/avr/avr_switchcontext.c
index 159601d7624..34512d0929e 100644
--- a/arch/avr/src/avr/avr_switchcontext.c
+++ b/arch/avr/src/avr/avr_switchcontext.c
@@ -56,10 +56,6 @@
 
 void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb)
 {
-  /* Update scheduler parameters */
-
-  nxsched_suspend_scheduler(rtcb);
-
   /* Are we in an interrupt handler? */
 
   if (up_current_regs())
@@ -70,10 +66,6 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb)
 
       avr_savestate(rtcb->xcp.regs);
 
-      /* Update scheduler parameters */
-
-      nxsched_resume_scheduler(tcb);
-
       /* Then switch contexts */
 
       avr_restorestate(tcb->xcp.regs);
@@ -85,7 +77,7 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb)
     {
       /* Update scheduler parameters */
 
-      nxsched_resume_scheduler(tcb);
+      nxsched_switch_context(rtcb, tcb);
 
       /* Record the new "running" task */
 
diff --git a/arch/avr/src/avr32/avr_doirq.c b/arch/avr/src/avr32/avr_doirq.c
index 11776391271..ec34bd9871b 100644
--- a/arch/avr/src/avr32/avr_doirq.c
+++ b/arch/avr/src/avr32/avr_doirq.c
@@ -109,6 +109,10 @@ uint32_t *avr_doirq(int irq, uint32_t *regs)
       addrenv_switch(tcb);
 #endif
 
+      /* Update scheduler parameters. */
+
+      nxsched_switch_context(*running_task, tcb);
+
       /* Record the new "running" task when context switch occurred.
        * g_running_tasks[] is only used by assertion logic for reporting
        * crashes.
diff --git a/arch/avr/src/avr32/avr_switchcontext.c 
b/arch/avr/src/avr32/avr_switchcontext.c
index c999b205274..7947762244a 100644
--- a/arch/avr/src/avr32/avr_switchcontext.c
+++ b/arch/avr/src/avr32/avr_switchcontext.c
@@ -58,10 +58,6 @@
 
 void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb)
 {
-  /* Update scheduler parameters */
-
-  nxsched_suspend_scheduler(rtcb);
-
   /* Are we in an interrupt handler? */
 
   if (up_current_regs())
@@ -72,10 +68,6 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb)
 
       avr_savestate(rtcb->xcp.regs);
 
-      /* Update scheduler parameters */
-
-      nxsched_resume_scheduler(tcb);
-
       /* Then switch contexts.  Any new address environment needed by
        * the new thread will be instantiated before the return from
        * interrupt.
@@ -99,7 +91,7 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb)
 #endif
       /* Update scheduler parameters */
 
-      nxsched_resume_scheduler(tcb);
+      nxsched_switch_context(rtcb, tcb);
 
       /* Record the new "running" task */
 
diff --git a/arch/ceva/src/common/ceva_doirq.c 
b/arch/ceva/src/common/ceva_doirq.c
index b5bf60ef942..cec144847ce 100644
--- a/arch/ceva/src/common/ceva_doirq.c
+++ b/arch/ceva/src/common/ceva_doirq.c
@@ -87,17 +87,18 @@ uint32_t *ceva_doirq(int irq, uint32_t *regs)
 
       if (regs != up_current_regs())
         {
+          struct tcb_s *tcb = this_task();
+
           /* Update scheduler parameters */
 
-          nxsched_suspend_scheduler(*running_task);
-          nxsched_resume_scheduler(this_task());
+          nxsched_switch_context(*running_task, tcb);
 
           /* Record the new "running" task when context switch occurred.
            * g_running_tasks[] is only used by assertion logic for reporting
            * crashes.
            */
 
-          g_running_tasks[this_cpu()] = this_task();
+          *running_task = tcb;
           regs = up_current_regs();
         }
 
diff --git a/arch/ceva/src/common/ceva_switchcontext.c 
b/arch/ceva/src/common/ceva_switchcontext.c
index a1d86136249..1c3a86b0b63 100644
--- a/arch/ceva/src/common/ceva_switchcontext.c
+++ b/arch/ceva/src/common/ceva_switchcontext.c
@@ -90,6 +90,10 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb)
 
   else
     {
+      /* Update scheduler parameters */
+
+      nxsched_switch_context(rtcb, tcb);
+
       /* Switch context to the context of the task at the head of the
        * ready to run list.
        */
diff --git a/arch/hc/src/common/hc_doirq.c b/arch/hc/src/common/hc_doirq.c
index cfeba105bda..4df650fb39f 100644
--- a/arch/hc/src/common/hc_doirq.c
+++ b/arch/hc/src/common/hc_doirq.c
@@ -109,6 +109,10 @@ uint8_t *hc_doirq(int irq, uint8_t *regs)
       addrenv_switch(tcb);
 #endif
 
+      /* Update scheduler parameters. */
+
+      nxsched_switch_context(*running_task, tcb);
+
       /* Record the new "running" task when context switch occurred.
        * g_running_tasks[] is only used by assertion logic for reporting
        * crashes.
diff --git a/arch/hc/src/common/hc_switchcontext.c 
b/arch/hc/src/common/hc_switchcontext.c
index 182b39998f3..61587fcf09e 100644
--- a/arch/hc/src/common/hc_switchcontext.c
+++ b/arch/hc/src/common/hc_switchcontext.c
@@ -58,10 +58,6 @@
 
 void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb)
 {
-  /* Update scheduler parameters */
-
-  nxsched_suspend_scheduler(rtcb);
-
   /* Are we in an interrupt handler? */
 
   if (up_current_regs())
@@ -72,10 +68,6 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb)
 
       hc_savestate(rtcb->xcp.regs);
 
-      /* Update scheduler parameters */
-
-      nxsched_resume_scheduler(tcb);
-
       /* Then switch contexts.  Any necessary address environment
        * changes will be made when the interrupt returns.
        */
@@ -102,7 +94,7 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb)
 #endif
       /* Update scheduler parameters */
 
-      nxsched_resume_scheduler(tcb);
+      nxsched_switch_context(rtcb, tcb);
 
       /* Record the new "running" task */
 
diff --git a/arch/mips/src/mips32/mips_doirq.c 
b/arch/mips/src/mips32/mips_doirq.c
index 5141726f663..b059db0a18b 100644
--- a/arch/mips/src/mips32/mips_doirq.c
+++ b/arch/mips/src/mips32/mips_doirq.c
@@ -118,12 +118,16 @@ uint32_t *mips_doirq(int irq, uint32_t *regs)
       addrenv_switch(tcb);
 #endif
 
+      /* Update scheduler parameters. */
+
+      nxsched_switch_context(*running_task, tcb);
+
       /* Record the new "running" task when context switch occurred.
        * g_running_tasks[] is only used by assertion logic for reporting
        * crashes.
        */
 
-      g_running_tasks[this_cpu()] = tcb;
+      *running_task = tcb;
     }
 
   /* If a context switch occurred while processing the interrupt then
diff --git a/arch/mips/src/mips32/mips_switchcontext.c 
b/arch/mips/src/mips32/mips_switchcontext.c
index d58f2597f25..d9516fc084a 100644
--- a/arch/mips/src/mips32/mips_switchcontext.c
+++ b/arch/mips/src/mips32/mips_switchcontext.c
@@ -59,10 +59,6 @@
 
 void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb)
 {
-  /* Update scheduler parameters */
-
-  nxsched_suspend_scheduler(rtcb);
-
   /* Are we in an interrupt handler? */
 
   if (up_current_regs())
@@ -73,10 +69,6 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb)
 
       mips_savestate(rtcb->xcp.regs);
 
-      /* Update scheduler parameters */
-
-      nxsched_resume_scheduler(tcb);
-
       /* Then switch contexts.  Any necessary address environment
        * changes will be made when the interrupt returns.
        */
@@ -90,7 +82,7 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb)
     {
       /* Update scheduler parameters */
 
-      nxsched_resume_scheduler(tcb);
+      nxsched_switch_context(rtcb, tcb);
 
       /* Then switch contexts */
 
diff --git a/arch/misoc/src/lm32/lm32_doirq.c b/arch/misoc/src/lm32/lm32_doirq.c
index d41c419c451..6958c061526 100644
--- a/arch/misoc/src/lm32/lm32_doirq.c
+++ b/arch/misoc/src/lm32/lm32_doirq.c
@@ -103,6 +103,10 @@ uint32_t *lm32_doirq(int irq, uint32_t *regs)
       addrenv_switch(tcb);
 #endif
 
+      /* Update scheduler parameters. */
+
+      nxsched_switch_context(*running_task, tcb);
+
       /* Record the new "running" task when context switch occurred.
        * g_running_tasks[] is only used by assertion logic for reporting
        * crashes.
diff --git a/arch/misoc/src/lm32/lm32_switchcontext.c 
b/arch/misoc/src/lm32/lm32_switchcontext.c
index fac735acb01..68f8d19b0a1 100644
--- a/arch/misoc/src/lm32/lm32_switchcontext.c
+++ b/arch/misoc/src/lm32/lm32_switchcontext.c
@@ -59,10 +59,6 @@
 
 void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb)
 {
-  /* Update scheduler parameters */
-
-  nxsched_suspend_scheduler(rtcb);
-
   /* Are we in an interrupt handler? */
 
   if (up_current_regs())
@@ -73,10 +69,6 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb)
 
       misoc_savestate(rtcb->xcp.regs);
 
-      /* Update scheduler parameters */
-
-      nxsched_resume_scheduler(tcb);
-
       /* Then switch contexts.  Any necessary address environment
        * changes will be made when the interrupt returns.
        */
@@ -90,7 +82,7 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb)
     {
       /* Update scheduler parameters */
 
-      nxsched_resume_scheduler(tcb);
+      nxsched_switch_context(rtcb, tcb);
 
       /* Then switch contexts */
 
diff --git a/arch/misoc/src/minerva/minerva_doirq.c 
b/arch/misoc/src/minerva/minerva_doirq.c
index 2a1d140ba21..8f4b316d297 100644
--- a/arch/misoc/src/minerva/minerva_doirq.c
+++ b/arch/misoc/src/minerva/minerva_doirq.c
@@ -102,12 +102,16 @@ uint32_t *minerva_doirq(int irq, uint32_t * regs)
       addrenv_switch(tcb);
 #endif
 
+      /* Update scheduler parameters. */
+
+      nxsched_switch_context(*running_task, tcb);
+
       /* Record the new "running" task when context switch occurred.
        * g_running_tasks[] is only used by assertion logic for reporting
        * crashes.
        */
 
-      g_running_tasks[this_cpu()] = tcb;
+      *running_task = tcb;
     }
 
   /* If a context switch occurred while processing the interrupt then
diff --git a/arch/misoc/src/minerva/minerva_switchcontext.c 
b/arch/misoc/src/minerva/minerva_switchcontext.c
index 981bb9f0388..f32190526e3 100644
--- a/arch/misoc/src/minerva/minerva_switchcontext.c
+++ b/arch/misoc/src/minerva/minerva_switchcontext.c
@@ -59,10 +59,6 @@
 
 void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb)
 {
-  /* Update scheduler parameters */
-
-  nxsched_suspend_scheduler(rtcb);
-
   /* Are we in an interrupt handler? */
 
   if (up_current_regs())
@@ -73,10 +69,6 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb)
 
       misoc_savestate(rtcb->xcp.regs);
 
-      /* Update scheduler parameters */
-
-      nxsched_resume_scheduler(tcb);
-
       /* Then switch contexts.  Any necessary address environment changes
        * will be made when the interrupt returns.
        */
@@ -90,7 +82,7 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb)
     {
       /* Update scheduler parameters */
 
-      nxsched_resume_scheduler(tcb);
+      nxsched_switch_context(rtcb, tcb);
 
       /* Then switch contexts */
 
diff --git a/arch/or1k/src/common/or1k_doirq.c 
b/arch/or1k/src/common/or1k_doirq.c
index ddb1a4ce746..ee925f4b22b 100644
--- a/arch/or1k/src/common/or1k_doirq.c
+++ b/arch/or1k/src/common/or1k_doirq.c
@@ -78,6 +78,10 @@ uint32_t *or1k_doirq(int irq, uint32_t *regs)
 
   if (regs != up_current_regs())
     {
+      /* Update scheduler parameters. */
+
+      nxsched_switch_context(*running_task, tcb);
+
       /* Record the new "running" task when context switch occurred.
        * g_running_tasks[] is only used by assertion logic for reporting
        * crashes.
diff --git a/arch/or1k/src/common/or1k_switchcontext.c 
b/arch/or1k/src/common/or1k_switchcontext.c
index a8e12a310af..1927d1a6ca5 100644
--- a/arch/or1k/src/common/or1k_switchcontext.c
+++ b/arch/or1k/src/common/or1k_switchcontext.c
@@ -58,10 +58,6 @@
 
 void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb)
 {
-  /* Update scheduler parameters */
-
-  nxsched_suspend_scheduler(rtcb);
-
   /* Are we in an interrupt handler? */
 
 #if 0  /* REVISIT */
@@ -76,10 +72,6 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb)
 
       or1k_savestate(rtcb->xcp.regs);
 
-      /* Update scheduler parameters */
-
-      nxsched_resume_scheduler(tcb);
-
       /* Then switch contexts.  Any necessary address environment
        * changes will be made when the interrupt returns.
        */
@@ -106,7 +98,7 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb)
 #endif
       /* Update scheduler parameters */
 
-      nxsched_resume_scheduler(tcb);
+      nxsched_switch_context(rtcb, tcb);
 
       /* Record the new "running" task */
 
diff --git a/arch/renesas/src/common/renesas_doirq.c 
b/arch/renesas/src/common/renesas_doirq.c
index 2d69fa82664..5380e230268 100644
--- a/arch/renesas/src/common/renesas_doirq.c
+++ b/arch/renesas/src/common/renesas_doirq.c
@@ -112,6 +112,10 @@ uint32_t *renesas_doirq(int irq, uint32_t * regs)
           addrenv_switch(tcb);
 #endif
 
+          /* Update scheduler parameters. */
+
+          nxsched_switch_context(*running_task, tcb);
+
           /* Record the new "running" task when context switch occurred.
            * g_running_tasks[] is only used by assertion logic for reporting
            * crashes.
diff --git a/arch/renesas/src/common/renesas_switchcontext.c 
b/arch/renesas/src/common/renesas_switchcontext.c
index b070c94db9a..96bdf4e4803 100644
--- a/arch/renesas/src/common/renesas_switchcontext.c
+++ b/arch/renesas/src/common/renesas_switchcontext.c
@@ -58,10 +58,6 @@
 
 void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb)
 {
-  /* Update scheduler parameters */
-
-  nxsched_suspend_scheduler(rtcb);
-
   /* Are we in an interrupt handler? */
 
   if (up_current_regs())
@@ -72,10 +68,6 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb)
 
       renesas_savestate(rtcb->xcp.regs);
 
-      /* Update scheduler parameters */
-
-      nxsched_resume_scheduler(tcb);
-
       /* Then switch contexts.  Any necessary address environment
        * changes will be made when the interrupt returns.
        */
@@ -102,7 +94,7 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb)
 #endif
       /* Update scheduler parameters */
 
-      nxsched_resume_scheduler(tcb);
+      nxsched_switch_context(rtcb, tcb);
 
       /* Record the new "running" task */
 
diff --git a/arch/risc-v/src/common/riscv_doirq.c 
b/arch/risc-v/src/common/riscv_doirq.c
index 836aca620a6..1be918f906c 100644
--- a/arch/risc-v/src/common/riscv_doirq.c
+++ b/arch/risc-v/src/common/riscv_doirq.c
@@ -128,12 +128,7 @@ uintreg_t *riscv_doirq(int irq, uintreg_t *regs)
 
       /* Update scheduler parameters */
 
-      if (!restore_context)
-        {
-          nxsched_suspend_scheduler(*running_task);
-        }
-
-      nxsched_resume_scheduler(tcb);
+      nxsched_switch_context(*running_task, tcb);
 
       /* Record the new "running" task when context switch occurred.
        * g_running_tasks[] is only used by assertion logic for reporting
diff --git a/arch/risc-v/src/common/riscv_switchcontext.c 
b/arch/risc-v/src/common/riscv_switchcontext.c
index 3ec995bc2a5..ce0f39f8131 100644
--- a/arch/risc-v/src/common/riscv_switchcontext.c
+++ b/arch/risc-v/src/common/riscv_switchcontext.c
@@ -80,6 +80,10 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb)
 
   else
     {
+      /* Update scheduler parameters */
+
+      nxsched_switch_context(rtcb, tcb);
+
       /* Then switch contexts */
 
       riscv_switchcontext();
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 c1afb5cc086..31271ac5eb8 100644
--- a/arch/risc-v/src/common/supervisor/riscv_perform_syscall.c
+++ b/arch/risc-v/src/common/supervisor/riscv_perform_syscall.c
@@ -73,11 +73,9 @@ void *riscv_perform_syscall(uintreg_t *regs)
 
       if (!restore_context)
         {
-          nxsched_suspend_scheduler(*running_task);
+          nxsched_switch_context(*running_task, tcb);
         }
 
-      nxsched_resume_scheduler(tcb);
-
       /* Record the new "running" task.  g_running_tasks[] is only used by
        * assertion logic for reporting crashes.
        */
diff --git a/arch/sim/src/sim/sim_doirq.c b/arch/sim/src/sim/sim_doirq.c
index a575d478053..4086530d82d 100644
--- a/arch/sim/src/sim/sim_doirq.c
+++ b/arch/sim/src/sim/sim_doirq.c
@@ -83,12 +83,18 @@ void *sim_doirq(int irq, void *context)
 
       if (regs != up_current_regs())
         {
+          struct tcb_s *tcb = this_task();
+
+          /* Update scheduler parameters. */
+
+          nxsched_switch_context(*running_task, tcb);
+
           /* Record the new "running" task when context switch occurred.
            * g_running_tasks[] is only used by assertion logic for reporting
            * crashes.
            */
 
-          *running_task = this_task();
+          *running_task = tcb;
         }
 
       regs = up_current_regs();
diff --git a/arch/sim/src/sim/sim_switchcontext.c 
b/arch/sim/src/sim/sim_switchcontext.c
index 507dc456da0..5cfe3a8ed45 100644
--- a/arch/sim/src/sim/sim_switchcontext.c
+++ b/arch/sim/src/sim/sim_switchcontext.c
@@ -60,10 +60,6 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb)
 
   sinfo("Unblocking TCB=%p\n", tcb);
 
-  /* Update scheduler parameters */
-
-  nxsched_suspend_scheduler(rtcb);
-
   /* Are we in an interrupt handler? */
 
   if (up_interrupt_context())
@@ -74,10 +70,6 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb)
 
       sim_savestate(rtcb->xcp.regs);
 
-      /* Update scheduler parameters */
-
-      nxsched_resume_scheduler(tcb);
-
       /* Restore the cpu lock */
 
       restore_critical_section(tcb, this_cpu());
@@ -101,7 +93,7 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb)
 
       /* Update scheduler parameters */
 
-      nxsched_resume_scheduler(tcb);
+      nxsched_switch_context(rtcb, tcb);
 
       /* Restore the cpu lock */
 
diff --git a/arch/sparc/src/sparc_v8/sparc_v8_doirq.c 
b/arch/sparc/src/sparc_v8/sparc_v8_doirq.c
index e58ed58c43a..f45dc30a7ed 100644
--- a/arch/sparc/src/sparc_v8/sparc_v8_doirq.c
+++ b/arch/sparc/src/sparc_v8/sparc_v8_doirq.c
@@ -113,12 +113,16 @@ uint32_t *sparc_doirq(int irq, uint32_t *regs)
       addrenv_switch(tcb);
 #endif
 
+      /* Update scheduler parameters. */
+
+      nxsched_switch_context(*running_task, tcb);
+
       /* Record the new "running" task when context switch occurred.
        * g_running_tasks[] is only used by assertion logic for reporting
        * crashes.
        */
 
-      g_running_tasks[this_cpu()] = tcb;
+      *running_task = tcb;
     }
 
   /* If a context switch occurred while processing the interrupt then
diff --git a/arch/sparc/src/sparc_v8/sparc_v8_switchcontext.c 
b/arch/sparc/src/sparc_v8/sparc_v8_switchcontext.c
index 3262e7da069..03832aea919 100644
--- a/arch/sparc/src/sparc_v8/sparc_v8_switchcontext.c
+++ b/arch/sparc/src/sparc_v8/sparc_v8_switchcontext.c
@@ -59,10 +59,6 @@
 
 void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb)
 {
-  /* Update scheduler parameters */
-
-  nxsched_suspend_scheduler(rtcb);
-
   /* Are we in an interrupt handler? */
 
   if (up_current_regs())
@@ -73,10 +69,6 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb)
 
       sparc_savestate(rtcb->xcp.regs);
 
-      /* Update scheduler parameters */
-
-      nxsched_resume_scheduler(tcb);
-
       /* Then switch contexts.  Any necessary address environment
        * changes will be made when the interrupt returns.
        */
@@ -90,7 +82,7 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb)
     {
       /* Update scheduler parameters */
 
-      nxsched_resume_scheduler(tcb);
+      nxsched_switch_context(rtcb, tcb);
 
       /* Then switch contexts */
 
diff --git a/arch/tricore/src/common/tricore_doirq.c 
b/arch/tricore/src/common/tricore_doirq.c
index d4bd94b973b..ebb2e49d938 100644
--- a/arch/tricore/src/common/tricore_doirq.c
+++ b/arch/tricore/src/common/tricore_doirq.c
@@ -99,6 +99,10 @@ IFX_INTERRUPT_INTERNAL(tricore_doirq, 0, 255)
       addrenv_switch(tcb);
 #endif
 
+      /* Update scheduler parameters */
+
+      nxsched_switch_context(*running_task, tcb);
+
       /* Record the new "running" task when context switch occurred.
        * g_running_tasks[] is only used by assertion logic for reporting
        * crashes.
diff --git a/arch/tricore/src/common/tricore_switchcontext.c 
b/arch/tricore/src/common/tricore_switchcontext.c
index 7b0d773e13d..47aefd036eb 100644
--- a/arch/tricore/src/common/tricore_switchcontext.c
+++ b/arch/tricore/src/common/tricore_switchcontext.c
@@ -59,10 +59,6 @@
 
 void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb)
 {
-  /* Update scheduler parameters */
-
-  nxsched_suspend_scheduler(rtcb);
-
   /* Are we in an interrupt handler? */
 
   if (up_current_regs())
@@ -73,10 +69,6 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb)
 
       tricore_savestate(rtcb->xcp.regs);
 
-      /* Update scheduler parameters */
-
-      nxsched_resume_scheduler(tcb);
-
       /* Then switch contexts.  Any necessary address environment
        * changes will be made when the interrupt returns.
        */
@@ -90,7 +82,7 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb)
     {
       /* Update scheduler parameters */
 
-      nxsched_resume_scheduler(tcb);
+      nxsched_switch_context(rtcb, tcb);
 
       /* Then switch contexts */
 
diff --git a/arch/x86/src/common/x86_switchcontext.c 
b/arch/x86/src/common/x86_switchcontext.c
index 61c8d88e80e..e604a0b685a 100644
--- a/arch/x86/src/common/x86_switchcontext.c
+++ b/arch/x86/src/common/x86_switchcontext.c
@@ -58,10 +58,6 @@
 
 void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb)
 {
-  /* Update scheduler parameters */
-
-  nxsched_suspend_scheduler(rtcb);
-
   /* Are we in an interrupt handler? */
 
   if (up_current_regs())
@@ -72,10 +68,6 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb)
 
       x86_savestate(rtcb->xcp.regs);
 
-      /* Update scheduler parameters */
-
-      nxsched_resume_scheduler(tcb);
-
       /* Then switch contexts.  Any necessary address environment
        * changes will be made when the interrupt returns.
        */
@@ -102,7 +94,7 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb)
 #endif
       /* Update scheduler parameters */
 
-      nxsched_resume_scheduler(tcb);
+      nxsched_switch_context(rtcb, tcb);
 
       /* Record the new "running" task */
 
diff --git a/arch/x86/src/qemu/qemu_handlers.c 
b/arch/x86/src/qemu/qemu_handlers.c
index a66267aecb9..a15c25b4a80 100644
--- a/arch/x86/src/qemu/qemu_handlers.c
+++ b/arch/x86/src/qemu/qemu_handlers.c
@@ -125,8 +125,7 @@ static uint32_t *common_handler(int irq, uint32_t *regs)
 
       /* Update scheduler parameters */
 
-      nxsched_suspend_scheduler(*running_task);
-      nxsched_resume_scheduler(tcb);
+      nxsched_switch_context(*running_task, tcb);
 
       /* Record the new "running" task when context switch occurred.
        * g_running_tasks[] is only used by assertion logic for reporting
diff --git a/arch/x86_64/src/common/x86_64_switchcontext.c 
b/arch/x86_64/src/common/x86_64_switchcontext.c
index 6b13ba6e75d..a72c94b724b 100644
--- a/arch/x86_64/src/common/x86_64_switchcontext.c
+++ b/arch/x86_64/src/common/x86_64_switchcontext.c
@@ -84,6 +84,7 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb)
 
   else if (!up_saveusercontext(rtcb->xcp.regs))
     {
+      struct tcb_s **running_task;
       cpu = this_cpu();
 
       x86_64_restore_auxstate(tcb);
@@ -104,14 +105,15 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s 
*rtcb)
 
       /* Update scheduler parameters */
 
-      nxsched_suspend_scheduler(g_running_tasks[cpu]);
-      nxsched_resume_scheduler(current_task(cpu));
+      running_task = &g_running_tasks[cpu];
+      tcb = current_task(cpu);
+      nxsched_switch_context(*running_task, tcb);
 
       /* Record the new "running" task.  g_running_tasks[] is only used by
        * assertion logic for reporting crashes.
        */
 
-      g_running_tasks[cpu] = current_task(cpu);
+      *running_task = tcb;
 
       /* Then switch contexts */
 
diff --git a/arch/x86_64/src/intel64/intel64_handlers.c 
b/arch/x86_64/src/intel64/intel64_handlers.c
index af30b1a1df9..a19e8ce9331 100644
--- a/arch/x86_64/src/intel64/intel64_handlers.c
+++ b/arch/x86_64/src/intel64/intel64_handlers.c
@@ -106,8 +106,7 @@ static uint64_t *common_handler(int irq, uint64_t *regs)
 
       /* Update scheduler parameters */
 
-      nxsched_suspend_scheduler(*running_task);
-      nxsched_resume_scheduler(tcb);
+      nxsched_switch_context(*running_task, tcb);
 
       /* Record the new "running" task when context switch occurred.
        * g_running_tasks[] is only used by assertion logic for reporting
diff --git a/arch/xtensa/src/common/xtensa_irqdispatch.c 
b/arch/xtensa/src/common/xtensa_irqdispatch.c
index 54a8ebb2ce3..ee8c3a735b7 100644
--- a/arch/xtensa/src/common/xtensa_irqdispatch.c
+++ b/arch/xtensa/src/common/xtensa_irqdispatch.c
@@ -97,8 +97,7 @@ uint32_t *xtensa_irq_dispatch(int irq, uint32_t *regs)
 
       /* Update scheduler parameters */
 
-      nxsched_suspend_scheduler(*running_task);
-      nxsched_resume_scheduler(tcb);
+      nxsched_switch_context(*running_task, tcb);
 
       /* Record the new "running" task when context switch occurred.
        * g_running_tasks[] is only used by assertion logic for reporting
diff --git a/arch/z16/src/common/z16_doirq.c b/arch/z16/src/common/z16_doirq.c
index 068833ed18c..0da1b6e26df 100644
--- a/arch/z16/src/common/z16_doirq.c
+++ b/arch/z16/src/common/z16_doirq.c
@@ -92,12 +92,18 @@ FAR chipreg_t *z16_doirq(int irq, FAR chipreg_t *regs)
 
       if (regs != up_current_regs())
         {
+          struct tcb_s *tcb = this_task();
+
+          /* Update scheduler parameters. */
+
+          nxsched_switch_context(*running_task, tcb);
+
           /* Record the new "running" task when context switch occurred.
            * g_running_tasks[] is only used by assertion logic for reporting
            * crashes.
            */
 
-          *running_task = this_task();
+          *running_task = tcb;
         }
 
       /* Restore the previous value of g_current_regs.  NULL would indicate
diff --git a/arch/z16/src/common/z16_switchcontext.c 
b/arch/z16/src/common/z16_switchcontext.c
index 5be35f03f38..3a2e22592b1 100644
--- a/arch/z16/src/common/z16_switchcontext.c
+++ b/arch/z16/src/common/z16_switchcontext.c
@@ -58,10 +58,6 @@
 
 void up_switch_context(FAR struct tcb_s *tcb, FAR struct tcb_s *rtcb)
 {
-  /* Update scheduler parameters */
-
-  nxsched_suspend_scheduler(rtcb);
-
   /* Are we in an interrupt handler? */
 
   if (IN_INTERRUPT)
@@ -72,10 +68,6 @@ void up_switch_context(FAR struct tcb_s *tcb, FAR struct 
tcb_s *rtcb)
 
       SAVE_IRQCONTEXT(rtcb);
 
-      /* Update scheduler parameters */
-
-      nxsched_resume_scheduler(tcb);
-
       /* Then setup so that the context will be performed on exit
        * from the interrupt.
        */
@@ -93,7 +85,7 @@ void up_switch_context(FAR struct tcb_s *tcb, FAR struct 
tcb_s *rtcb)
     {
       /* Update scheduler parameters */
 
-      nxsched_resume_scheduler(tcb);
+      nxsched_switch_context(rtcb, tcb);
 
       /* Record the new "running" task */
 
diff --git a/arch/z80/src/common/z80_doirq.c b/arch/z80/src/common/z80_doirq.c
index 06ed0323fbf..2956c19f0ab 100644
--- a/arch/z80/src/common/z80_doirq.c
+++ b/arch/z80/src/common/z80_doirq.c
@@ -95,6 +95,10 @@ FAR chipreg_t *z80_doirq(uint8_t irq, FAR chipreg_t *regs)
           addrenv_switch(tcb);
 #endif
 
+          /* Update scheduler parameters */
+
+          nxsched_switch_context(*running_task, tcb);
+
           /* Record the new "running" task when context switch occurred.
            * g_running_tasks[] is only used by assertion logic for reporting
            * crashes.
diff --git a/arch/z80/src/common/z80_switchcontext.c 
b/arch/z80/src/common/z80_switchcontext.c
index 959dbc279c5..42370fca64a 100644
--- a/arch/z80/src/common/z80_switchcontext.c
+++ b/arch/z80/src/common/z80_switchcontext.c
@@ -60,10 +60,6 @@
 
 void up_switch_context(FAR struct tcb_s *tcb, FAR struct tcb_s *rtcb)
 {
-  /* Update scheduler parameters */
-
-  nxsched_suspend_scheduler(rtcb);
-
   /* Are we in an interrupt handler? */
 
   if (IN_INTERRUPT())
@@ -74,10 +70,6 @@ void up_switch_context(FAR struct tcb_s *tcb, FAR struct 
tcb_s *rtcb)
 
       SAVE_IRQCONTEXT(rtcb);
 
-      /* Update scheduler parameters */
-
-      nxsched_resume_scheduler(tcb);
-
       /* Then setup so that the context will be performed on exit
        * from the interrupt.  Any necessary address environment
        * changes will be made when the interrupt returns.
@@ -103,9 +95,10 @@ void up_switch_context(FAR struct tcb_s *tcb, FAR struct 
tcb_s *rtcb)
 
       addrenv_switch(tcb);
 #endif
+
       /* Update scheduler parameters */
 
-      nxsched_resume_scheduler(tcb);
+      nxsched_switch_context(rtcb, tcb);
 
       /* Record the new "running" task */
 

Reply via email to