File indexing completed on 2025-05-11 08:24:27
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037 #ifdef HAVE_CONFIG_H
0038 #include "config.h"
0039 #endif
0040
0041 #include <rtems/score/smpimpl.h>
0042 #include <rtems/score/assert.h>
0043
0044 typedef struct {
0045 Per_CPU_Job_context Context;
0046 Per_CPU_Job Jobs[ CPU_MAXIMUM_PROCESSORS ];
0047 } SMP_Multicast_jobs;
0048
0049 static void _SMP_Issue_action_jobs(
0050 const Processor_mask *targets,
0051 SMP_Multicast_jobs *jobs,
0052 uint32_t cpu_max
0053 )
0054 {
0055 uint32_t cpu_index;
0056
0057 for ( cpu_index = 0; cpu_index < cpu_max; ++cpu_index ) {
0058 if ( _Processor_mask_Is_set( targets, cpu_index ) ) {
0059 Per_CPU_Job *job;
0060 Per_CPU_Control *cpu;
0061
0062 job = &jobs->Jobs[ cpu_index ];
0063 job->context = &jobs->Context;
0064 cpu = _Per_CPU_Get_by_index( cpu_index );
0065
0066 _Per_CPU_Submit_job( cpu, job );
0067 }
0068 }
0069 }
0070
0071 static void _SMP_Wait_for_action_jobs(
0072 const Processor_mask *targets,
0073 const SMP_Multicast_jobs *jobs,
0074 uint32_t cpu_max
0075 )
0076 {
0077 uint32_t cpu_index;
0078
0079 for ( cpu_index = 0; cpu_index < cpu_max; ++cpu_index ) {
0080 if ( _Processor_mask_Is_set( targets, cpu_index ) ) {
0081 const Per_CPU_Control *cpu;
0082 const Per_CPU_Job *job;
0083
0084 cpu = _Per_CPU_Get_by_index( cpu_index );
0085 job = &jobs->Jobs[ cpu_index ];
0086 _Per_CPU_Wait_for_job( cpu, job );
0087 }
0088 }
0089 }
0090
0091 void _SMP_Multicast_action(
0092 const Processor_mask *targets,
0093 SMP_Action_handler handler,
0094 void *arg
0095 )
0096 {
0097 SMP_Multicast_jobs jobs;
0098 uint32_t cpu_max;
0099
0100 cpu_max = _SMP_Get_processor_maximum();
0101 _Assert( cpu_max <= RTEMS_ARRAY_SIZE( jobs.Jobs ) );
0102
0103 jobs.Context.handler = handler;
0104 jobs.Context.arg = arg;
0105
0106 _SMP_Issue_action_jobs( targets, &jobs, cpu_max );
0107 _SMP_Wait_for_action_jobs( targets, &jobs, cpu_max );
0108 }