diff --git a/arch b/arch index 9336bbac1c..e1ae334ff0 160000 --- a/arch +++ b/arch @@ -1 +1 @@ -Subproject commit 9336bbac1c82d417d65d0a973359e4fad25e2dd1 +Subproject commit e1ae334ff043872b3678fc7fd48bea6125e8ea44 diff --git a/include/nuttx/arch.h b/include/nuttx/arch.h index 04caec1319..0603d8f662 100644 --- a/include/nuttx/arch.h +++ b/include/nuttx/arch.h @@ -1753,6 +1753,28 @@ int up_cpu_index(void); int up_cpu_start(int cpu); #endif +/**************************************************************************** + * Name: up_cpu_initialize + * + * Description: + * After the CPU has been started (via up_cpu_start()) the system will + * call back into the architecture-specific code with this function on the + * thread of execution of the newly started CPU. This gives the + * architecture-specific a chance to perform ny initial, CPU-specific + * initialize on that thread. + * + * Input Parameters: + * None + * + * Returned Value: + * Zero on success; a negated errno value on failure. + * + ****************************************************************************/ + +#ifdef CONFIG_SMP +int up_cpu_initialize(void); +#endif + /**************************************************************************** * Name: up_cpu_pause * diff --git a/sched/init/os_smpstart.c b/sched/init/os_smpstart.c index 3a0aa8d470..5c43b9beff 100644 --- a/sched/init/os_smpstart.c +++ b/sched/init/os_smpstart.c @@ -80,11 +80,14 @@ static const char g_idlename[] = "CPUn Idle" * Name: os_idle_trampoline * * Description: - * This is the common IDLE task for CPUs 1 through (CONFIG_SMP_NCPUS-1). - * It is equivalent to the CPU 0 IDLE logic in os_start.c + * This is the common start-up logic for the IDLE task for CPUs 1 through + * (CONFIG_SMP_NCPUS-1). Having a start-up function such as this for the + * IDLE is not really an architectural necessity. It is used only for + * symmetry with now other threads are started (see task_start() and + * pthread_start()). * * Input Parameters: - * Standard task arguments. + * None. * * Returned Value: * This function does not return. @@ -93,7 +96,11 @@ static const char g_idlename[] = "CPUn Idle" void os_idle_trampoline(void) { - /* Transfer control to the IDLE task */ + /* Perform architecture-specific initialization for this CPU */ + + up_cpu_initialize(); + + /* Then transfer control to the IDLE task */ (void)os_idle_task(0, NULL);