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

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


The following commit(s) were added to refs/heads/master by this push:
     new 1e49cb4828 armv7-a/armv7-r/armv8-r: percpu reg store this_task
1e49cb4828 is described below

commit 1e49cb4828f3cdb26252eab3e68f7ca9962bc8ba
Author: hujun5 <[email protected]>
AuthorDate: Thu Dec 5 16:58:17 2024 +0800

    armv7-a/armv7-r/armv8-r: percpu reg store this_task
    
    This is continue work of https://github.com/apache/nuttx/pull/13726
    
    We can utilize percpu storage to hold information about the
    current running task. If we intend to implement this feature, we would
    need to define two macros that help us manage this percpu information
    effectively.
    
    up_this_task: This macro is designed to read the contents of the percpu
    register to retrieve information about the current
    running task.This allows us to quickly access
    task-specific data without having to disable interrupts,
    access global variables and obtain the current cpu index.
    
    up_update_task: This macro is responsible for updating the contents of
    the percpu register.It is typically called during
    initialization or when a context switch occurs to ensure
    that the percpu register reflects the information of the
    newly running task.
    
    Signed-off-by: hujun5 <[email protected]>
---
 arch/arm/include/armv7-a/cp15.h |  2 ++
 arch/arm/include/armv7-a/irq.h  | 12 +++++-------
 arch/arm/include/armv7-r/cp15.h |  2 ++
 arch/arm/include/armv7-r/irq.h  | 12 +++++-------
 arch/arm/include/armv8-r/cp15.h |  2 ++
 arch/arm/include/armv8-r/irq.h  | 12 +++++-------
 arch/arm/src/armv7-a/arm_scu.c  |  9 +++++++++
 arch/arm/src/armv7-r/arm_scu.c  |  9 +++++++++
 8 files changed, 39 insertions(+), 21 deletions(-)

diff --git a/arch/arm/include/armv7-a/cp15.h b/arch/arm/include/armv7-a/cp15.h
index 9367f3ec28..09d7e5b178 100644
--- a/arch/arm/include/armv7-a/cp15.h
+++ b/arch/arm/include/armv7-a/cp15.h
@@ -275,4 +275,6 @@
      value;                             \
   })                                    \
 
+#define CP15_MODIFY(v,m,a) CP15_SET(a, ((CP15_GET(a) & ~(m)) | ((uintptr_t)(v) 
& (m))))
+
 #endif /* __ARCH_ARM_SRC_ARMV7_A_CP15_H */
diff --git a/arch/arm/include/armv7-a/irq.h b/arch/arm/include/armv7-a/irq.h
index afdf561552..62425feddb 100644
--- a/arch/arm/include/armv7-a/irq.h
+++ b/arch/arm/include/armv7-a/irq.h
@@ -472,18 +472,16 @@ static inline_function uint32_t up_getsp(void)
   return sp;
 }
 
-noinstrument_function
-static inline_function bool up_interrupt_context(void)
-{
-  return (bool)CP15_GET(TPIDRPRW);
-}
-
 noinstrument_function
 static inline_function void up_set_interrupt_context(bool flag)
 {
-  CP15_SET(TPIDRPRW, flag);
+  CP15_MODIFY(flag, 1ul, TPIDRPRW);
 }
 
+#define up_this_task()         ((struct tcb_s *)(CP15_GET(TPIDRPRW) & ~1ul))
+#define up_update_task(t)      CP15_MODIFY(t, ~1ul, TPIDRPRW)
+#define up_interrupt_context() (CP15_GET(TPIDRPRW) & 1)
+
 /****************************************************************************
  * Public Data
  ****************************************************************************/
diff --git a/arch/arm/include/armv7-r/cp15.h b/arch/arm/include/armv7-r/cp15.h
index 3f1d23e2b9..fef41b769a 100644
--- a/arch/arm/include/armv7-r/cp15.h
+++ b/arch/arm/include/armv7-r/cp15.h
@@ -218,4 +218,6 @@
      value;                             \
   })                                    \
 
+#define CP15_MODIFY(v,m,a) CP15_SET(a, ((CP15_GET(a) & ~(m)) | ((uintptr_t)(v) 
& (m))))
+
 #endif /* __ARCH_ARM_SRC_ARMV7_R_CP15_H */
diff --git a/arch/arm/include/armv7-r/irq.h b/arch/arm/include/armv7-r/irq.h
index 12470257a6..3c404d1366 100644
--- a/arch/arm/include/armv7-r/irq.h
+++ b/arch/arm/include/armv7-r/irq.h
@@ -467,18 +467,16 @@ static inline_function uint32_t up_getsp(void)
   return sp;
 }
 
-noinstrument_function
-static inline_function bool up_interrupt_context(void)
-{
-  return (bool)CP15_GET(TPIDRPRW);
-}
-
 noinstrument_function
 static inline_function void up_set_interrupt_context(bool flag)
 {
-  CP15_SET(TPIDRPRW, flag);
+  CP15_MODIFY(flag, 1ul, TPIDRPRW);
 }
 
+#define up_this_task()         ((struct tcb_s *)(CP15_GET(TPIDRPRW) & ~1ul))
+#define up_update_task(t)      CP15_MODIFY(t, ~1ul, TPIDRPRW)
+#define up_interrupt_context() (CP15_GET(TPIDRPRW) & 1)
+
 /****************************************************************************
  * Public Data
  ****************************************************************************/
diff --git a/arch/arm/include/armv8-r/cp15.h b/arch/arm/include/armv8-r/cp15.h
index ab8ec421c5..9214c439ea 100644
--- a/arch/arm/include/armv8-r/cp15.h
+++ b/arch/arm/include/armv8-r/cp15.h
@@ -237,4 +237,6 @@
      _value;                             \
   })                                    \
 
+#define CP15_MODIFY(v,m,a) CP15_SET(a, ((CP15_GET(a) & ~(m)) | ((uintptr_t)(v) 
& (m))))
+
 #endif /* __ARCH_ARM_SRC_ARMV8_R_CP15_H */
diff --git a/arch/arm/include/armv8-r/irq.h b/arch/arm/include/armv8-r/irq.h
index 62962399c5..6f49b40a2a 100644
--- a/arch/arm/include/armv8-r/irq.h
+++ b/arch/arm/include/armv8-r/irq.h
@@ -467,18 +467,16 @@ static inline_function uint32_t up_getsp(void)
   return sp;
 }
 
-noinstrument_function
-static inline_function bool up_interrupt_context(void)
-{
-  return (bool)CP15_GET(TPIDRPRW);
-}
-
 noinstrument_function
 static inline_function void up_set_interrupt_context(bool flag)
 {
-  CP15_SET(TPIDRPRW, flag);
+  CP15_MODIFY(flag, 1ul, TPIDRPRW);
 }
 
+#define up_this_task()         ((struct tcb_s *)(CP15_GET(TPIDRPRW) & ~1ul))
+#define up_update_task(t)      CP15_MODIFY(t, ~1ul, TPIDRPRW)
+#define up_interrupt_context() (CP15_GET(TPIDRPRW) & 1)
+
 /****************************************************************************
  * Public Data
  ****************************************************************************/
diff --git a/arch/arm/src/armv7-a/arm_scu.c b/arch/arm/src/armv7-a/arm_scu.c
index f82101e352..78322f911e 100644
--- a/arch/arm/src/armv7-a/arm_scu.c
+++ b/arch/arm/src/armv7-a/arm_scu.c
@@ -29,6 +29,7 @@
 #include <stdint.h>
 
 #include <arch/irq.h>
+#include <sched/sched.h>
 
 #include "arm_internal.h"
 #include "cp15_cacheops.h"
@@ -57,6 +58,14 @@ void arm_enable_smp(int cpu)
 {
   uint32_t regval;
 
+  /* We need to confirm that current_task has been initialized. */
+
+  while (!current_task(this_cpu()));
+
+  /* Init idle task to percpu reg */
+
+  up_update_task(current_task(cpu));
+
   /* Handle actions unique to CPU0 which comes up first */
 
   if (cpu == 0)
diff --git a/arch/arm/src/armv7-r/arm_scu.c b/arch/arm/src/armv7-r/arm_scu.c
index 4e57606953..75913b445a 100644
--- a/arch/arm/src/armv7-r/arm_scu.c
+++ b/arch/arm/src/armv7-r/arm_scu.c
@@ -29,6 +29,7 @@
 #include <stdint.h>
 
 #include <arch/irq.h>
+#include <sched/sched.h>
 
 #include "arm_internal.h"
 #include "cp15_cacheops.h"
@@ -57,6 +58,14 @@ void arm_enable_smp(int cpu)
 {
   uint32_t regval;
 
+  /* We need to confirm that current_task has been initialized. */
+
+  while (!current_task(this_cpu()));
+
+  /* Init idle task to percpu reg */
+
+  up_update_task(current_task(cpu));
+
   /* Handle actions unique to CPU0 which comes up first */
 
   if (cpu == 0)

Reply via email to