source: rtems/cpukit/score/src/coretodset.c

Last change on this file was ab02824, checked in by Joel Sherrill <joel@…>, on 02/16/22 at 21:09:06

score/src/[a-m]*.c: Change license to BSD-2

Updates #3053.

  • Property mode set to 100644
File size: 3.1 KB
Line 
1/* SPDX-License-Identifier: BSD-2-Clause */
2
3/**
4 * @file
5 *
6 * @ingroup RTEMSScoreTOD
7 *
8 * @brief This source file contains the implementation of
9 *   _TOD_Set().
10 */
11
12/*  COPYRIGHT (c) 1989-2007.
13 *  On-Line Applications Research Corporation (OAR).
14 *
15 * Redistribution and use in source and binary forms, with or without
16 * modification, are permitted provided that the following conditions
17 * are met:
18 * 1. Redistributions of source code must retain the above copyright
19 *    notice, this list of conditions and the following disclaimer.
20 * 2. Redistributions in binary form must reproduce the above copyright
21 *    notice, this list of conditions and the following disclaimer in the
22 *    documentation and/or other materials provided with the distribution.
23 *
24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
25 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
28 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
29 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
30 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
31 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
32 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
33 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34 * POSSIBILITY OF SUCH DAMAGE.
35 */
36
37#ifdef HAVE_CONFIG_H
38#include "config.h"
39#endif
40
41#include <rtems/score/todimpl.h>
42#include <rtems/score/assert.h>
43#include <rtems/score/watchdogimpl.h>
44
45Status_Control _TOD_Set(
46  const struct timespec *tod,
47  ISR_lock_Context      *lock_context
48)
49{
50  struct bintime  tod_as_bintime;
51  uint64_t        tod_as_ticks;
52  uint32_t        cpu_max;
53  uint32_t        cpu_index;
54  Status_Control  status;
55
56  _Assert( _TOD_Is_owner() );
57  _Assert( _TOD_Is_valid_new_time_of_day( tod ) == STATUS_SUCCESSFUL );
58
59  status = _TOD_Hook_Run( TOD_ACTION_SET_CLOCK, tod );
60  if ( status != STATUS_SUCCESSFUL ) {
61    _TOD_Release( lock_context );
62    return status;
63  }
64
65  timespec2bintime( tod, &tod_as_bintime );
66  _Timecounter_Set_clock( &tod_as_bintime, lock_context );
67
68  tod_as_ticks = _Watchdog_Ticks_from_timespec( tod );
69  cpu_max = _SMP_Get_processor_maximum();
70
71  for ( cpu_index = 0 ; cpu_index < cpu_max ; ++cpu_index ) {
72    Per_CPU_Control  *cpu;
73    Watchdog_Header  *header;
74    ISR_lock_Context  lock_context_2;
75    Watchdog_Control *first;
76
77    cpu = _Per_CPU_Get_by_index( cpu_index );
78    header = &cpu->Watchdog.Header[ PER_CPU_WATCHDOG_REALTIME ];
79
80    _ISR_lock_ISR_disable_and_acquire( &cpu->Watchdog.Lock, &lock_context_2 );
81
82    first = _Watchdog_Header_first( header );
83
84    if ( first != NULL ) {
85      _Watchdog_Tickle(
86        header,
87        first,
88        tod_as_ticks,
89        &cpu->Watchdog.Lock,
90        &lock_context_2
91      );
92    }
93
94    _ISR_lock_Release_and_ISR_enable( &cpu->Watchdog.Lock, &lock_context_2 );
95  }
96
97  _TOD.is_set = true;
98
99  return STATUS_SUCCESSFUL;
100}
Note: See TracBrowser for help on using the repository browser.