File indexing completed on 2025-05-11 08:24:26
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/todimpl.h>
0042 #include <rtems/score/assert.h>
0043 #include <rtems/score/watchdogimpl.h>
0044
0045 Status_Control _TOD_Set(
0046 const struct timespec *tod,
0047 ISR_lock_Context *lock_context
0048 )
0049 {
0050 struct bintime tod_as_bintime;
0051 uint64_t tod_as_ticks;
0052 uint32_t cpu_max;
0053 uint32_t cpu_index;
0054 Status_Control status;
0055
0056 _Assert( _TOD_Is_owner() );
0057 _Assert( _TOD_Is_valid_new_time_of_day( tod ) == STATUS_SUCCESSFUL );
0058
0059 status = _TOD_Hook_Run( TOD_ACTION_SET_CLOCK, tod );
0060 if ( status != STATUS_SUCCESSFUL ) {
0061 _TOD_Release( lock_context );
0062 return status;
0063 }
0064
0065 timespec2bintime( tod, &tod_as_bintime );
0066 _Timecounter_Set_clock( &tod_as_bintime, lock_context );
0067
0068 tod_as_ticks = _Watchdog_Ticks_from_timespec( tod );
0069 cpu_max = _SMP_Get_processor_maximum();
0070
0071 for ( cpu_index = 0 ; cpu_index < cpu_max ; ++cpu_index ) {
0072 Per_CPU_Control *cpu;
0073 Watchdog_Header *header;
0074 ISR_lock_Context lock_context_2;
0075 Watchdog_Control *first;
0076
0077 cpu = _Per_CPU_Get_by_index( cpu_index );
0078 header = &cpu->Watchdog.Header[ PER_CPU_WATCHDOG_REALTIME ];
0079
0080 _ISR_lock_ISR_disable_and_acquire( &cpu->Watchdog.Lock, &lock_context_2 );
0081
0082 first = _Watchdog_Header_first( header );
0083
0084 if ( first != NULL ) {
0085 _Watchdog_Tickle(
0086 header,
0087 first,
0088 tod_as_ticks,
0089 &cpu->Watchdog.Lock,
0090 &lock_context_2
0091 );
0092 }
0093
0094 _ISR_lock_Release_and_ISR_enable( &cpu->Watchdog.Lock, &lock_context_2 );
0095 }
0096
0097 _TOD.is_set = true;
0098
0099 return STATUS_SUCCESSFUL;
0100 }