summaryrefslogtreecommitdiffstats
path: root/c/src/exec/rtems/headers/modes.h
blob: 115898e503a5c028431038c32e4afe0e406082df (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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
/*  modes.h
 *
 *  This include file contains all constants and structures associated
 *  with the RTEMS thread and RTEMS_ASR modes.
 *
 *  COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994.
 *  On-Line Applications Research Corporation (OAR).
 *  All rights assigned to U.S. Government, 1994.
 *
 *  This material may be reproduced by or for the U.S. Government pursuant
 *  to the copyright license under the clause at DFARS 252.227-7013.  This
 *  notice must appear in all copies of this file and its derivatives.
 *
 *  $Id$
 */

#ifndef __RTEMS_MODES_h
#define __RTEMS_MODES_h

#ifdef __cplusplus
extern "C" {
#endif

#include <rtems/core/isr.h>

/*
 *  The following type defines the control block used to manage
 *  each a mode set.
 */

typedef unsigned32 Modes_Control;

/*
 *  The following constants define the individual modes and masks
 *  which may be used to compose a mode set and to alter modes.
 */

#define RTEMS_ALL_MODE_MASKS     0x0000ffff

#define RTEMS_DEFAULT_MODES     0x00000000
#define RTEMS_CURRENT_MODE      0

#define RTEMS_PREEMPT_MASK    0x00000100  /* preemption bit           */
#define RTEMS_TIMESLICE_MASK  0x00000200  /* timeslice bit            */
#define RTEMS_ASR_MASK        0x00000400  /* RTEMS_ASR enable bit           */
#define RTEMS_INTERRUPT_MASK  CPU_MODES_INTERRUPT_MASK

#define RTEMS_PREEMPT      0x00000000     /* enable preemption        */
#define RTEMS_NO_PREEMPT   0x00000100     /* disable preemption       */

#define RTEMS_NO_TIMESLICE 0x00000000     /* disable timeslicing      */
#define RTEMS_TIMESLICE    0x00000200     /* enable timeslicing       */

#define RTEMS_ASR          0x00000000     /* enable RTEMS_ASR               */
#define RTEMS_NO_ASR       0x00000400     /* disable RTEMS_ASR              */

/*
 *  The number of bits for interrupt levels is CPU dependent.
 *  RTEMS supports 0 to 256 levels in bits 0-7 of the mode.
 */

/*
 *  RTEMS_INTERRUPT_LEVEL
 *
 *  DESCRIPTION:
 *
 *  This function returns the processor dependent interrupt
 *  level which corresponds to the requested interrupt level.
 *
 * NOTE: RTEMS supports 256 interrupt levels using the least
 *       significant eight bits of MODES.CONTROL.  On any
 *       particular CPU, fewer than 256 levels may be supported.
 */

STATIC INLINE unsigned32 RTEMS_INTERRUPT_LEVEL (
  Modes_Control mode_set
);

/*
 *  _Modes_Mask_changed
 *
 *  DESCRIPTION:
 *
 *  This function returns TRUE if any of the mode flags in mask
 *  are set in mode_set, and FALSE otherwise.
 */

STATIC INLINE boolean _Modes_Mask_changed (
  Modes_Control mode_set,
  Modes_Control masks
);

/*
 *  _Modes_Is_asr_disabled
 *
 *  DESCRIPTION:
 *
 *  This function returns TRUE if mode_set indicates that Asynchronous
 *  Signal Processing is disabled, and FALSE otherwise.
 */

STATIC INLINE boolean _Modes_Is_asr_disabled (
  Modes_Control mode_set
);

/*
 *  _Modes_Is_preempt
 *
 *  DESCRIPTION:
 *
 *  This function returns TRUE if mode_set indicates that preemption
 *  is enabled, and FALSE otherwise.
 */

STATIC INLINE boolean _Modes_Is_preempt (
  Modes_Control mode_set
);

/*
 *  _Modes_Is_timeslice
 *
 *  DESCRIPTION:
 *
 *  This function returns TRUE if mode_set indicates that timeslicing
 *  is enabled, and FALSE otherwise.
 */

STATIC INLINE boolean _Modes_Is_timeslice (
  Modes_Control mode_set
);

/*
 *  _Modes_Get_interrupt_level
 *
 *  DESCRIPTION:
 *
 *  This function returns the interrupt level portion of the mode_set.
 */

STATIC INLINE ISR_Level _Modes_Get_interrupt_level (
  Modes_Control mode_set
);

/*
 *  _Modes_Set_interrupt_level
 *
 *  DESCRIPTION:
 *
 *  This routine sets the current interrupt level to that specified
 *  in the mode_set.
 */

STATIC INLINE void _Modes_Set_interrupt_level (
  Modes_Control mode_set
);

/*
 *  _Modes_Change
 *
 *  DESCRIPTION:
 *
 *  This routine changes the modes in old_mode_set indicated by
 *  mask to the requested values in new_mode_set.  The resulting
 *  mode set is returned in out_mode_set and the modes that changed
 *  is returned in changed.
 */

STATIC INLINE void _Modes_Change (
  Modes_Control  old_mode_set,
  Modes_Control  new_mode_set,
  Modes_Control  mask,
  Modes_Control *out_mode_set,
  Modes_Control *changed
);

#include <rtems/rtems/modes.inl>

#ifdef __cplusplus
}
#endif

#endif
/* end of include file */