summaryrefslogtreecommitdiffstats
path: root/cpukit/rtems/include/rtems/rtems/asrimpl.h
blob: 892c58c5958b130cf393f6cca146d577e626d3fb (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/**
 * @file
 *
 * @ingroup ClassicASRImpl
 *
 * @brief Classic ASR Implementation
 */

/* COPYRIGHT (c) 1989-2008.
 * 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.
 */

#ifndef _RTEMS_RTEMS_ASRIMPL_H
#define _RTEMS_RTEMS_ASRIMPL_H

#include <rtems/rtems/asr.h>

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @defgroup ClassicASRImpl Classic ASR Implementation
 *
 * @ingroup ClassicASR
 *
 * @{
 */

/**
 *  @brief ASR_Initialize
 *
 *  This routine initializes the given RTEMS_ASR information record.
 */
RTEMS_INLINE_ROUTINE void _ASR_Initialize (
  ASR_Information *asr
)
{
  asr->is_enabled      = false;
  asr->handler         = NULL;
  asr->mode_set        = RTEMS_DEFAULT_MODES;
  asr->signals_posted  = 0;
  asr->signals_pending = 0;
  asr->nest_level      = 0;
}

RTEMS_INLINE_ROUTINE void _ASR_Create( ASR_Information *asr )
{
  _ISR_lock_Initialize( &asr->Lock, "ASR" );
  RTEMS_STATIC_ASSERT( RTEMS_DEFAULT_MODES == 0, _ASR_Create_mode_set );
}

RTEMS_INLINE_ROUTINE void _ASR_Destroy( ASR_Information *asr )
{
  _ISR_lock_Destroy( &asr->Lock );
}

RTEMS_INLINE_ROUTINE void _ASR_Acquire_critical(
  ASR_Information  *asr,
  ISR_lock_Context *lock_context
)
{
  _ISR_lock_Acquire( &asr->Lock, lock_context );
}

RTEMS_INLINE_ROUTINE void _ASR_Acquire(
  ASR_Information  *asr,
  ISR_lock_Context *lock_context
)
{
  _ISR_lock_ISR_disable( lock_context );
  _ASR_Acquire_critical( asr, lock_context );
}

RTEMS_INLINE_ROUTINE void _ASR_Release(
  ASR_Information  *asr,
  ISR_lock_Context *lock_context
)
{
  _ISR_lock_Release_and_ISR_enable( &asr->Lock, lock_context );
}

/**
 *  @brief ASR_Is_null_handler
 *
 *  This function returns TRUE if the given asr_handler is NULL and
 *  FALSE otherwise.
 */
RTEMS_INLINE_ROUTINE bool _ASR_Is_null_handler (
  rtems_asr_entry asr_handler
)
{
  return asr_handler == NULL;
}

RTEMS_INLINE_ROUTINE rtems_signal_set _ASR_Swap_signals( ASR_Information *asr )
{
  rtems_signal_set new_signals_posted;
  ISR_lock_Context lock_context;

  _ASR_Acquire( asr, &lock_context );
    new_signals_posted   = asr->signals_pending;
    asr->signals_pending = asr->signals_posted;
    asr->signals_posted  = new_signals_posted;
  _ASR_Release( asr, &lock_context );

  return new_signals_posted;
}

RTEMS_INLINE_ROUTINE void _ASR_Post_signals(
  rtems_signal_set  signals,
  rtems_signal_set *signal_set
)
{
  *signal_set |= signals;
}

RTEMS_INLINE_ROUTINE rtems_signal_set _ASR_Get_posted_signals(
  ASR_Information *asr
)
{
  rtems_signal_set signal_set;
  ISR_lock_Context lock_context;

  _ASR_Acquire( asr, &lock_context );
    signal_set = asr->signals_posted;
    asr->signals_posted = 0;
  _ASR_Release( asr, &lock_context );

  return signal_set;
}

/**@}*/

#ifdef __cplusplus
}
#endif

#endif
/* end of include file */