You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by ma...@apache.org on 2021/07/15 23:38:05 UTC

[incubator-nuttx] 03/03: arch/sim: Initialize the idle thread stack info correctly

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

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

commit cee43ce280cfe1e704a16d860cf5087a8e014838
Author: Xiang Xiao <xi...@xiaomi.com>
AuthorDate: Fri Jul 16 02:23:59 2021 +0800

    arch/sim: Initialize the idle thread stack info correctly
    
    and change the default value of IDLETHREAD_STACKSIZE to 65536
    
    Signed-off-by: Xiang Xiao <xi...@xiaomi.com>
    Change-Id: Ia54efbbca4b69706150bc4178844b316688a104e
---
 arch/sim/src/sim/up_cpuidlestack.c |  7 +------
 arch/sim/src/sim/up_internal.h     |  5 ++---
 arch/sim/src/sim/up_simsmp.c       | 15 ++++++---------
 arch/sim/src/sim/up_smpsignal.c    | 35 +++++++++++++++++++++++++++++++----
 sched/Kconfig                      |  1 +
 5 files changed, 41 insertions(+), 22 deletions(-)

diff --git a/arch/sim/src/sim/up_cpuidlestack.c b/arch/sim/src/sim/up_cpuidlestack.c
index 981fbc9..c9effa7 100644
--- a/arch/sim/src/sim/up_cpuidlestack.c
+++ b/arch/sim/src/sim/up_cpuidlestack.c
@@ -78,10 +78,5 @@
 
 int up_cpu_idlestack(int cpu, FAR struct tcb_s *tcb, size_t stack_size)
 {
-  /* REVISIT:  I don't think anything is needed here */
-
-  tcb->adj_stack_size  = 0;
-  tcb->stack_alloc_ptr = NULL;
-  tcb->stack_base_ptr   = NULL;
-  return OK;
+  return up_create_stack(tcb, stack_size, TCB_FLAG_TTYPE_KERNEL);
 }
diff --git a/arch/sim/src/sim/up_internal.h b/arch/sim/src/sim/up_internal.h
index 307d7aa..7506d19 100644
--- a/arch/sim/src/sim/up_internal.h
+++ b/arch/sim/src/sim/up_internal.h
@@ -165,16 +165,15 @@ void sim_sigdeliver(void);
 
 #ifdef CONFIG_SMP
 void sim_cpu0_start(void);
+int sim_cpu_start(int cpu, void *stack, size_t size);
+void sim_send_ipi(int cpu);
 #endif
 
 /* up_smpsignal.c ***********************************************************/
 
 #ifdef CONFIG_SMP
 void up_cpu_started(void);
-int up_cpu_paused(int cpu);
-struct tcb_s *up_this_task(void);
 int up_cpu_set_pause_handler(int irq);
-void sim_send_ipi(int cpu);
 #endif
 
 /* up_oneshot.c *************************************************************/
diff --git a/arch/sim/src/sim/up_simsmp.c b/arch/sim/src/sim/up_simsmp.c
index 90ff1cb..e91917f 100644
--- a/arch/sim/src/sim/up_simsmp.c
+++ b/arch/sim/src/sim/up_simsmp.c
@@ -260,17 +260,12 @@ int up_cpu_index(void)
  *
  ****************************************************************************/
 
-int up_cpu_start(int cpu)
+int sim_cpu_start(int cpu, void *stack, size_t size)
 {
   struct sim_cpuinfo_s cpuinfo;
+  pthread_attr_t attr;
   int ret;
 
-#ifdef CONFIG_SCHED_INSTRUMENTATION
-  /* Notify of the start event */
-
-  sched_note_cpu_start(up_this_task(), cpu);
-#endif
-
   /* Initialize the CPU info */
 
   cpuinfo.cpu = cpu;
@@ -283,11 +278,13 @@ int up_cpu_start(int cpu)
    * in a multi-CPU hardware model.
    */
 
+  pthread_attr_init(&attr);
+  pthread_attr_setstack(&attr, stack, size);
   ret = pthread_create(&g_cpu_thread[cpu],
-                       NULL, sim_idle_trampoline, &cpuinfo);
+                       &attr, sim_idle_trampoline, &cpuinfo);
+  pthread_attr_destroy(&attr);
   if (ret != 0)
     {
-      ret = -ret;  /* REVISIT:  That is a host errno value. */
       goto errout_with_cond;
     }
 
diff --git a/arch/sim/src/sim/up_smpsignal.c b/arch/sim/src/sim/up_smpsignal.c
index cad6cca..249bbc6 100644
--- a/arch/sim/src/sim/up_smpsignal.c
+++ b/arch/sim/src/sim/up_smpsignal.c
@@ -233,16 +233,43 @@ void up_cpu_started(void)
 }
 
 /****************************************************************************
- * Name: up_this_task
+ * Name: up_cpu_start
  *
  * Description:
- *   Return the currrent task tcb.
+ *   In an SMP configution, only one CPU is initially active (CPU 0). System
+ *   initialization occurs on that single thread. At the completion of the
+ *   initialization of the OS, just before beginning normal multitasking,
+ *   the additional CPUs would be started by calling this function.
+ *
+ *   Each CPU is provided the entry point to is IDLE task when started.  A
+ *   TCB for each CPU's IDLE task has been initialized and placed in the
+ *   CPU's g_assignedtasks[cpu] list.  A stack has also been allocateded and
+ *   initialized.
+ *
+ *   The OS initialization logic calls this function repeatedly until each
+ *   CPU has been started, 1 through (CONFIG_SMP_NCPUS-1).
+ *
+ * Input Parameters:
+ *   cpu - The index of the CPU being started.  This will be a numeric
+ *         value in the range of from one to (CONFIG_SMP_NCPUS-1).  (CPU
+ *         0 is already active)
+ *
+ * Returned Value:
+ *   Zero on success; a negated errno value on failure.
  *
  ****************************************************************************/
 
-struct tcb_s *up_this_task(void)
+int up_cpu_start(int cpu)
 {
-  return this_task();
+  FAR struct tcb_s *tcb = current_task(cpu);
+
+#ifdef CONFIG_SCHED_INSTRUMENTATION
+  /* Notify of the start event */
+
+  sched_note_cpu_start(this_task(), cpu);
+#endif
+
+  return sim_cpu_start(cpu, tcb->stack_base_ptr, tcb->adj_stack_size);
 }
 
 /****************************************************************************
diff --git a/sched/Kconfig b/sched/Kconfig
index 4f694be..c14a088 100644
--- a/sched/Kconfig
+++ b/sched/Kconfig
@@ -1800,6 +1800,7 @@ config DEFAULT_TASK_STACKSIZE
 
 config IDLETHREAD_STACKSIZE
 	int "Idle thread stack size"
+	default DEFAULT_TASK_STACKSIZE if ARCH_SIM
 	default 1024
 	---help---
 		The size of the initial stack used by the IDLE thread.  The IDLE thread