diff options
-rw-r--r-- | bsps/arm/shared/clock/clock-a9mpcore.c | 15 | ||||
-rw-r--r-- | bsps/arm/shared/clock/clock-generic-timer.c | 15 | ||||
-rw-r--r-- | cpukit/include/rtems/score/percpu.h | 8 | ||||
-rw-r--r-- | cpukit/include/rtems/score/smpimpl.h | 44 | ||||
-rw-r--r-- | cpukit/score/src/percpu.c | 70 | ||||
-rw-r--r-- | cpukit/score/src/smp.c | 26 |
6 files changed, 14 insertions, 164 deletions
diff --git a/bsps/arm/shared/clock/clock-a9mpcore.c b/bsps/arm/shared/clock/clock-a9mpcore.c index 05d3c0961d..2907dff800 100644 --- a/bsps/arm/shared/clock/clock-a9mpcore.c +++ b/bsps/arm/shared/clock/clock-a9mpcore.c @@ -102,11 +102,13 @@ typedef struct { static void a9mpcore_clock_secondary_action(void *arg) { - volatile a9mpcore_gt *gt = A9MPCORE_GT; - a9mpcore_clock_init_data *init_data = arg; + if (!_Per_CPU_Is_boot_processor(_Per_CPU_Get())) { + volatile a9mpcore_gt *gt = A9MPCORE_GT; + a9mpcore_clock_init_data *init_data = arg; - a9mpcore_clock_gt_init(gt, init_data->cmpval, init_data->interval); - bsp_interrupt_vector_enable(A9MPCORE_IRQ_GT); + a9mpcore_clock_gt_init(gt, init_data->cmpval, init_data->interval); + bsp_interrupt_vector_enable(A9MPCORE_IRQ_GT); + } } #endif @@ -122,10 +124,7 @@ static void a9mpcore_clock_secondary_initialization( .interval = interval }; - _SMP_Before_multitasking_action_broadcast( - a9mpcore_clock_secondary_action, - &init_data - ); + _SMP_Multicast_action(NULL, a9mpcore_clock_secondary_action, &init_data); if (cmpval - a9mpcore_clock_get_counter(gt) >= interval) { bsp_fatal(BSP_ARM_A9MPCORE_FATAL_CLOCK_SMP_INIT); diff --git a/bsps/arm/shared/clock/clock-generic-timer.c b/bsps/arm/shared/clock/clock-generic-timer.c index 2d17ada0b7..e851e02104 100644 --- a/bsps/arm/shared/clock/clock-generic-timer.c +++ b/bsps/arm/shared/clock/clock-generic-timer.c @@ -122,21 +122,20 @@ static void arm_gt_clock_gt_init(uint64_t cval) #if defined(RTEMS_SMP) && !defined(CLOCK_DRIVER_USE_ONLY_BOOT_PROCESSOR) static void arm_gt_clock_secondary_action(void *arg) { - uint64_t *cval; + if (!_Per_CPU_Is_boot_processor(_Per_CPU_Get())) { + uint64_t *cval; - cval = arg; - arm_gt_clock_gt_init(*cval); - bsp_interrupt_vector_enable(arm_gt_clock_instance.irq); + cval = arg; + arm_gt_clock_gt_init(*cval); + bsp_interrupt_vector_enable(arm_gt_clock_instance.irq); + } } #endif static void arm_gt_clock_secondary_initialization(uint64_t cval) { #if defined(RTEMS_SMP) && !defined(CLOCK_DRIVER_USE_ONLY_BOOT_PROCESSOR) - _SMP_Before_multitasking_action_broadcast( - arm_gt_clock_secondary_action, - &cval - ); + _SMP_Multicast_action(NULL, arm_gt_clock_secondary_action, &cval); #endif } diff --git a/cpukit/include/rtems/score/percpu.h b/cpukit/include/rtems/score/percpu.h index cd7713db6d..589d2ab63d 100644 --- a/cpukit/include/rtems/score/percpu.h +++ b/cpukit/include/rtems/score/percpu.h @@ -489,14 +489,6 @@ typedef struct Per_CPU_Control { Per_CPU_State state; /** - * @brief Action to be executed by this processor in the - * SYSTEM_STATE_BEFORE_MULTITASKING state on behalf of the boot processor. - * - * @see _SMP_Before_multitasking_action(). - */ - Atomic_Uintptr before_multitasking_action; - - /** * @brief FIFO list of jobs to be performed by this processor. * * @see _SMP_Multicast_action(). diff --git a/cpukit/include/rtems/score/smpimpl.h b/cpukit/include/rtems/score/smpimpl.h index 9d76eb5a23..d769565b9d 100644 --- a/cpukit/include/rtems/score/smpimpl.h +++ b/cpukit/include/rtems/score/smpimpl.h @@ -260,50 +260,6 @@ void _SMP_Multicast_action( void *arg ); -/** - * @brief Executes a handler with argument on the specified processor on behalf - * of the boot processor. - * - * The calling processor must be the boot processor. In case the specified - * processor is not online or not in the - * PER_CPU_STATE_READY_TO_START_MULTITASKING state, then no action is - * performed. - * - * @param cpu The processor to execute the action. - * @param handler The handler of the action. - * @param arg The argument of the action. - * - * @retval true The handler executed on the specified processor. - * @retval false Otherwise. - * - * @see _SMP_Before_multitasking_action_broadcast(). - */ -bool _SMP_Before_multitasking_action( - Per_CPU_Control *cpu, - SMP_Action_handler handler, - void *arg -); - -/** - * @brief Executes a handler with argument on all online processors except the - * boot processor on behalf of the boot processor. - * - * The calling processor must be the boot processor. - * - * @param handler The handler of the action. - * @param arg The argument of the action. - * - * @retval true The handler executed on all online processors except the boot - * processor. - * @retval false Otherwise. - * - * @see _SMP_Before_multitasking_action(). - */ -bool _SMP_Before_multitasking_action_broadcast( - SMP_Action_handler handler, - void *arg -); - #endif /* defined( RTEMS_SMP ) */ /** diff --git a/cpukit/score/src/percpu.c b/cpukit/score/src/percpu.c index 79e940005c..4cc7362bb5 100644 --- a/cpukit/score/src/percpu.c +++ b/cpukit/score/src/percpu.c @@ -36,11 +36,6 @@ RTEMS_STATIC_ASSERT( #if defined(RTEMS_SMP) -typedef struct { - SMP_Action_handler handler; - void *arg; -} SMP_Before_multicast_action; - ISR_LOCK_DEFINE( static, _Per_CPU_State_lock, "Per-CPU State" ) static void _Per_CPU_State_acquire( ISR_lock_Context *lock_context ) @@ -53,29 +48,6 @@ static void _Per_CPU_State_release( ISR_lock_Context *lock_context ) _ISR_lock_Release_and_ISR_enable( &_Per_CPU_State_lock, lock_context ); } -static void _Per_CPU_State_before_multitasking_action( Per_CPU_Control *cpu ) -{ - uintptr_t action_value; - - action_value = _Atomic_Load_uintptr( - &cpu->before_multitasking_action, - ATOMIC_ORDER_ACQUIRE - ); - - if ( action_value != 0 ) { - SMP_Before_multicast_action *action = - (SMP_Before_multicast_action *) action_value; - - ( *action->handler )( action->arg ); - - _Atomic_Store_uintptr( - &cpu->before_multitasking_action, - 0, - ATOMIC_ORDER_RELEASE - ); - } -} - static void _Per_CPU_State_busy_wait( Per_CPU_Control *cpu, Per_CPU_State new_state @@ -99,7 +71,6 @@ static void _Per_CPU_State_busy_wait( state != PER_CPU_STATE_REQUEST_START_MULTITASKING && state != PER_CPU_STATE_SHUTDOWN ) { - _Per_CPU_State_before_multitasking_action( cpu ); _Per_CPU_Perform_jobs( cpu ); _CPU_SMP_Processor_event_receive(); state = cpu->state; @@ -206,47 +177,6 @@ void _Per_CPU_State_change( _SMP_Fatal( SMP_FATAL_SHUTDOWN ); } } - -bool _SMP_Before_multitasking_action( - Per_CPU_Control *cpu, - SMP_Action_handler handler, - void *arg -) -{ - bool done; - - _Assert( _Per_CPU_Is_boot_processor( _Per_CPU_Get() ) ); - - if ( _Per_CPU_Is_processor_online( cpu ) ) { - SMP_Before_multicast_action action = { - .handler = handler, - .arg = arg - }; - Per_CPU_State expected_state = PER_CPU_STATE_READY_TO_START_MULTITASKING; - - _Atomic_Store_uintptr( - &cpu->before_multitasking_action, - (uintptr_t) &action, - ATOMIC_ORDER_RELEASE - ); - - _CPU_SMP_Processor_event_broadcast(); - - _Per_CPU_State_busy_wait( cpu, expected_state ); - - do { - done = _Atomic_Load_uintptr( - &cpu->before_multitasking_action, - ATOMIC_ORDER_ACQUIRE - ) == 0; - } while ( !done && cpu->state == expected_state ); - } else { - done = false; - } - - return done; -} - #else /* * On single core systems, we can efficiently directly access a single diff --git a/cpukit/score/src/smp.c b/cpukit/score/src/smp.c index 027c2e81d8..17d6c8bc67 100644 --- a/cpukit/score/src/smp.c +++ b/cpukit/score/src/smp.c @@ -253,30 +253,4 @@ void _SMP_Send_message_multicast( } } -bool _SMP_Before_multitasking_action_broadcast( - SMP_Action_handler handler, - void *arg -) -{ - bool done; - uint32_t cpu_max; - uint32_t cpu_index; - - done = true; - cpu_max = _SMP_Get_processor_maximum(); - - for ( cpu_index = 0 ; done && cpu_index < cpu_max ; ++cpu_index ) { - Per_CPU_Control *cpu = _Per_CPU_Get_by_index( cpu_index ); - - if ( - !_Per_CPU_Is_boot_processor( cpu ) - && _Per_CPU_Is_processor_online( cpu ) - ) { - done = _SMP_Before_multitasking_action( cpu, handler, arg ); - } - } - - return done; -} - SMP_Test_message_handler _SMP_Test_message_handler; |