summaryrefslogtreecommitdiffstats
path: root/cpukit/score/include/rtems/score/context.h
blob: 7c0b5df16d79fc9ffb38377fcd995f62daef796c (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
/** 
 *  @file context.h
 *
 *  This include file contains all information about each thread's context.
 */

/*
 *  COPYRIGHT (c) 1989-2004.
 *  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.com/license/LICENSE.
 *
 *  $Id$
 */

#ifndef __RTEMS_CONTEXT_h
#define __RTEMS_CONTEXT_h

/**
 *  @defgroup ScoreContext Context Handler
 *
 *  This group contains functionality which abstracts thread context
 *  management in a portable manner.
 */
/**@{*/

#ifdef __cplusplus
extern "C" {
#endif

#include <rtems/score/cpu.h>

/**
 *  @ingroup ScoreContext
 *  This constant defines the number of bytes required
 *  to store a full floating point context.
 */
#define CONTEXT_FP_SIZE CPU_CONTEXT_FP_SIZE

/**
 *  @ingroup ScoreContext
 *  This variable is set to TRUE when a reschedule operation
 *  has determined that the processor should be taken away from the
 *  currently executing thread and given to the heir thread.
 */

SCORE_EXTERN volatile boolean _Context_Switch_necessary;

/**
 *  @ingroup ScoreContext
 *  This routine initializes @a _the_context such that the stack
 *  pointer, interrupt level, and entry point are correct for the
 *  thread's initial state.
 *
 *  @param _the_context (in) will be initialized
 *  @param _stack (in) is the lowest physical address of the thread's 
 *         context
 *  @param _size (in) is the size in octets of the thread's context
 *  @param _isr (in) is the ISR enable level for this thread
 *  @param _entry (in) is this thread's entry point
 *  @param _is_fp (in) is set to TRUE if this thread has floating point
 *         enabled
 */
#define \
   _Context_Initialize( _the_context, _stack, _size, _isr, _entry, _is_fp ) \
   _CPU_Context_Initialize( _the_context, _stack, _size, _isr, _entry, _is_fp )

/**
 *  @ingroup ScoreContext
 *  This routine saves the current context into the @a _executing
 *  context record and restores the context specified by @a _heir.
 *
 *  @param _executing (in) is the currently executing thread's context
 *  @param _heir (in) is the context of the thread to be switched to
 */
#define _Context_Switch( _executing, _heir ) \
   _CPU_Context_switch( _executing, _heir )

/**
 *  @ingroup ScoreContext
 *  This routine restarts the calling thread by restoring its initial
 *  stack pointer and returning to the thread's entry point.
 *
 *  @param _the_context (in) is the context of the thread to restart
 */
#define _Context_Restart_self( _the_context ) \
   _CPU_Context_Restart_self( _the_context )

/**
 *  @ingroup ScoreContext
 *  This function returns the starting address of the floating
 *  point context save area.  It is assumed that the are reserved
 *  for the floating point save area is large enough.
 *
 *  @param _base (in) is lowest physical address of the floating point
 *         context save area.
 *  @param _offset (in) is XXX
 *
 *  @return the initial FP context pointer
 */
#define _Context_Fp_start( _base, _offset ) \
   _CPU_Context_Fp_start( (_base), (_offset) )

/**
 *  @ingroup ScoreContext
 *  This routine initializes the floating point context save
 *  area to contain an initial known state.
 *
 *  @param _fp_area (in) is the base address of the floating point
 *         context save area to initialize.
 */
#define _Context_Initialize_fp( _fp_area ) \
   _CPU_Context_Initialize_fp( _fp_area )

/**
 *  @ingroup ScoreContext
 *  This routine restores the floating point context contained
 *  in the @a _fp area.  It is assumed that the current
 *  floating point context has been saved by a previous invocation
 *  of @a _Context_Save_fp.
 *
 *  @param _fp (in) points to the floating point context area to restore.
 */
#define _Context_Restore_fp( _fp ) \
   _CPU_Context_restore_fp( _fp )

/**
 *  @ingroup ScoreContext
 *  This routine saves the current floating point context
 *  in the @a _fp area.
 *
 *  @param _fp (in) points to the floating point context area to restore.
 */
#define _Context_Save_fp( _fp ) \
   _CPU_Context_save_fp( _fp )

#ifdef __cplusplus
}
#endif

/**@}*/

#endif
/* end of include file */