diff options
Diffstat (limited to 'cpukit/score/src/smp.c')
-rw-r--r-- | cpukit/score/src/smp.c | 43 |
1 files changed, 34 insertions, 9 deletions
diff --git a/cpukit/score/src/smp.c b/cpukit/score/src/smp.c index 26e6b79058..75520829e1 100644 --- a/cpukit/score/src/smp.c +++ b/cpukit/score/src/smp.c @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + /** * @file * @@ -16,9 +18,26 @@ * COPYRIGHT (c) 1989-2011. * On-Line Applications Research Corporation (OAR). * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rtems.org/license/LICENSE. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H @@ -234,6 +253,12 @@ void _SMP_Start_multitasking_on_secondary_processor( cpu_index_self = _Per_CPU_Get_index( cpu_self ); + /* + * Call fatal error and per-CPU job handlers with thread dispatching + * disabled. + */ + cpu_self->thread_dispatch_disable_level = 1; + if ( cpu_index_self >= rtems_configuration_get_maximum_processors() ) { _SMP_Fatal( SMP_FATAL_MULTITASKING_START_ON_INVALID_PROCESSOR ); } @@ -244,6 +269,11 @@ void _SMP_Start_multitasking_on_secondary_processor( _Per_CPU_Set_state( cpu_self, PER_CPU_STATE_READY_TO_START_MULTITASKING ); _SMP_Wait_for_start_multitasking( cpu_self ); + + if ( !_Per_CPU_Is_processor_online( cpu_self ) ) { + _SMP_Fatal( SMP_FATAL_MULTITASKING_START_ON_NOT_ONLINE_PROCESSOR ); + } + _Thread_Start_multitasking(); } @@ -281,10 +311,7 @@ void _SMP_Request_shutdown( void ) } } -long unsigned _SMP_Process_message( - Per_CPU_Control *cpu_self, - long unsigned message -) +void _SMP_Process_message( Per_CPU_Control *cpu_self, long unsigned message ) { if ( ( message & SMP_MESSAGE_SHUTDOWN ) != 0 ) { ISR_Level level; @@ -302,8 +329,6 @@ long unsigned _SMP_Process_message( if ( ( message & SMP_MESSAGE_PERFORM_JOBS ) != 0 ) { _Per_CPU_Perform_jobs( cpu_self ); } - - return message; } void _SMP_Try_to_process_message( |