OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [rtems-20020807/] [cpukit/] [sapi/] [src/] [exinit.c] - Blame information for rev 1774

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1026 ivang
/*
2
 *  Initialization Manager
3
 *
4
 *  COPYRIGHT (c) 1989-1999.
5
 *  On-Line Applications Research Corporation (OAR).
6
 *
7
 *  The license and distribution terms for this file may be
8
 *  found in the file LICENSE in this distribution or at
9
 *  http://www.OARcorp.com/rtems/license.html.
10
 *
11
 *  exinit.c,v 1.29 2002/07/04 16:22:54 joel Exp
12
 */
13
 
14
/*
15
 *  SCORE_INIT and SAPI_INIT are defined so all of the super core and
16
 *  super API data will be included in this object file.
17
 */
18
 
19
#define SAPI_INIT
20
#define SCORE_INIT
21
 
22
#include <rtems/system.h>
23
#include <rtems/config.h>
24
#include <rtems/debug.h>
25
#include <rtems/extension.h>
26
#include <rtems/fatal.h>
27
#include <rtems/init.h>
28
#include <rtems/io.h>
29
#include <rtems/score/sysstate.h>
30
 
31
#include <rtems/score/apiext.h>
32
#include <rtems/score/apimutex.h>
33
#include <rtems/score/copyrt.h>
34
#include <rtems/score/heap.h>
35
#include <rtems/score/interr.h>
36
#include <rtems/score/isr.h>
37
#if defined(RTEMS_MULTIPROCESSING)
38
#include <rtems/score/mpci.h>
39
#endif
40
#include <rtems/score/priority.h>
41
#include <rtems/score/thread.h>
42
#include <rtems/score/tod.h>
43
#include <rtems/score/userext.h>
44
#include <rtems/score/watchdog.h>
45
#include <rtems/score/wkspace.h>
46
 
47
#include <rtems/sptables.h>
48
 
49
 
50
#include <rtems/rtems/rtemsapi.h>
51
#ifdef RTEMS_POSIX_API
52
#include <rtems/posix/posixapi.h>
53
#endif
54
#ifdef RTEMS_ITRON_API
55
#include <rtems/itron/itronapi.h>
56
#endif
57
 
58
Objects_Information *_Internal_Objects[ OBJECTS_INTERNAL_CLASSES_LAST + 1 ];
59
 
60
/*PAGE
61
 *
62
 *  rtems_initialize_executive
63
 *
64
 *  This directive initializes all the kernels data structures
65
 *  to the states necessary for the kernel to begin execution.  All
66
 *  include files that contain global variable definitions should be
67
 *  included in this file.  The system threads and initialization threads
68
 *  are created and started by this routine.  This routine then
69
 *  initiates multithreading.
70
 *
71
 *  Input parameters:
72
 *    configuration_table - pointer to the user's configuration table
73
 *    cpu_table           - pointer to the user's CPU configuration table
74
 *
75
 *  Output parameters:  NONE
76
 */
77
 
78
void rtems_initialize_executive(
79
  rtems_configuration_table *configuration_table,
80
  rtems_cpu_table           *cpu_table
81
)
82
{
83
  rtems_interrupt_level bsp_level;
84
 
85
  bsp_level = rtems_initialize_executive_early(configuration_table, cpu_table);
86
  rtems_initialize_executive_late( bsp_level );
87
}
88
 
89
rtems_interrupt_level rtems_initialize_executive_early(
90
  rtems_configuration_table *configuration_table,
91
  rtems_cpu_table           *cpu_table
92
)
93
{
94
  rtems_interrupt_level        bsp_level;
95
  rtems_multiprocessing_table *multiprocessing_table;
96
 
97
  /*
98
   *  Dispatching and interrupts are disabled until the end of the
99
   *  initialization sequence.  This prevents an inadvertent context
100
   *  switch before the executive is initialized.
101
   */
102
 
103
  _ISR_Disable( bsp_level );
104
 
105
  if ( configuration_table == NULL )
106
    _Internal_error_Occurred(
107
      INTERNAL_ERROR_CORE,
108
      TRUE,
109
      INTERNAL_ERROR_NO_CONFIGURATION_TABLE
110
    );
111
 
112
  /*
113
   *  Initialize the system state based on whether this is an MP system.
114
   */
115
 
116
#if defined(RTEMS_MULTIPROCESSING)
117
  multiprocessing_table = configuration_table->User_multiprocessing_table;
118
 
119
  _System_state_Handler_initialization(
120
    (multiprocessing_table) ? TRUE : FALSE
121
  );
122
#else
123
  multiprocessing_table = NULL;
124
 
125
  _System_state_Handler_initialization( FALSE );
126
#endif
127
 
128
  /*
129
   *  Provided just for user convenience.
130
   */
131
 
132
  _Configuration_Table    = configuration_table;
133
  _Configuration_MP_table = multiprocessing_table;
134
 
135
  /*
136
   *  Internally we view single processor systems as a very restricted
137
   *  multiprocessor system.
138
   */
139
 
140
  if ( multiprocessing_table == NULL )
141
    multiprocessing_table =
142
      (void *)&_Initialization_Default_multiprocessing_table;
143
 
144
  if ( cpu_table == NULL )
145
    _Internal_error_Occurred(
146
      INTERNAL_ERROR_CORE,
147
      TRUE,
148
      INTERNAL_ERROR_NO_CPU_TABLE
149
    );
150
 
151
  _CPU_Initialize( cpu_table, _Thread_Dispatch );
152
 
153
  /*
154
   *  Do this as early as possible to insure no debugging output
155
   *  is even attempted to be printed.
156
   */
157
 
158
  _Debug_Manager_initialization();
159
 
160
  _API_extensions_Initialization();
161
 
162
  _Thread_Dispatch_initialization();
163
 
164
  _Workspace_Handler_initialization(
165
     (void *)configuration_table->work_space_start,
166
     configuration_table->work_space_size
167
  );
168
 
169
  _User_extensions_Handler_initialization(
170
    configuration_table->number_of_initial_extensions,
171
    configuration_table->User_extension_table
172
  );
173
 
174
  _ISR_Handler_initialization();
175
 
176
  _Objects_Handler_initialization(
177
    multiprocessing_table->node,
178
    multiprocessing_table->maximum_nodes,
179
    multiprocessing_table->maximum_global_objects
180
  );
181
 
182
  _Objects_Information_table[OBJECTS_INTERNAL_API] = _Internal_Objects;
183
 
184
  _Priority_Handler_initialization();
185
 
186
  _Watchdog_Handler_initialization();
187
 
188
  _TOD_Handler_initialization( configuration_table->microseconds_per_tick );
189
 
190
  _Thread_Handler_initialization(
191
    configuration_table->ticks_per_timeslice,
192
    configuration_table->maximum_extensions,
193
    multiprocessing_table->maximum_proxies
194
  );
195
 
196
#if defined(RTEMS_MULTIPROCESSING)
197
  _MPCI_Handler_initialization(
198
    multiprocessing_table->User_mpci_table,
199
    RTEMS_TIMEOUT
200
  );
201
#endif
202
 
203
/* MANAGERS */
204
 
205
  _RTEMS_API_Initialize( configuration_table );
206
 
207
  _Extension_Manager_initialization( configuration_table->maximum_extensions );
208
 
209
  _IO_Manager_initialization(
210
    configuration_table->Device_driver_table,
211
    configuration_table->number_of_device_drivers,
212
    configuration_table->maximum_drivers,
213
    configuration_table->maximum_devices
214
  );
215
 
216
#ifdef RTEMS_POSIX_API
217
  _POSIX_API_Initialize( configuration_table );
218
#endif
219
 
220
#ifdef RTEMS_ITRON_API
221
  _ITRON_API_Initialize( configuration_table );
222
#endif
223
 
224
  _System_state_Set( SYSTEM_STATE_BEFORE_MULTITASKING );
225
 
226
  /*
227
   *  No threads should be created before this point!!!
228
   *  _Thread_Executing and _Thread_Heir are not set.
229
   *
230
   *  At this point all API extensions are in place.  After the call to
231
   *  _Thread_Create_idle() _Thread_Executing and _Thread_Heir will be set.
232
   */
233
 
234
  _Thread_Create_idle();
235
 
236
 
237
  /*
238
   *  Scheduling can properly occur now as long as we avoid dispatching.
239
   */
240
 
241
  if ( cpu_table->pretasking_hook )
242
    (*cpu_table->pretasking_hook)();
243
 
244
#if defined(RTEMS_MULTIPROCESSING)
245
  _MPCI_Create_server();
246
#endif
247
 
248
  /*
249
   *  Run the API and BSPs predriver hook.
250
   */
251
 
252
  _API_extensions_Run_predriver();
253
 
254
  if ( _CPU_Table.predriver_hook )
255
    (*_CPU_Table.predriver_hook)();
256
 
257
  /*
258
   *  Initialize all the device drivers and initialize the MPCI layer.
259
   *
260
   *  NOTE:  The MPCI may be build upon a device driver.
261
   */
262
 
263
  _IO_Initialize_all_drivers();
264
 
265
#if defined(RTEMS_MULTIPROCESSING)
266
  if ( _System_state_Is_multiprocessing ) {
267
    _MPCI_Initialization();
268
    _MPCI_Internal_packets_Send_process_packet(
269
      MPCI_PACKETS_SYSTEM_VERIFY
270
    );
271
  }
272
#endif
273
 
274
  /*
275
   *  Run the APIs and BSPs postdriver hooks.
276
   *
277
   *  The API extensions are supposed to create user initialization tasks.
278
   */
279
 
280
  _API_extensions_Run_postdriver();
281
 
282
  if ( _CPU_Table.postdriver_hook )
283
    (*_CPU_Table.postdriver_hook)();
284
 
285
  return bsp_level;
286
}
287
 
288
void rtems_initialize_executive_late(
289
  rtems_interrupt_level bsp_level
290
)
291
{
292
 
293
  _System_state_Set( SYSTEM_STATE_BEGIN_MULTITASKING );
294
 
295
  _Thread_Start_multitasking();
296
 
297
  /*
298
   *  Restore the interrupt level to what the BSP had.  Technically,
299
   *  this is unnecessary since the BSP should have all interrupts
300
   *  disabled when rtems_initialize_executive is invoked.  But this keeps
301
   *  the ISR Disable/Enable calls paired.
302
   */
303
 
304
  _ISR_Enable( bsp_level );
305
}
306
 
307
/*PAGE
308
 *
309
 *  rtems_shutdown_executive
310
 *
311
 *  This kernel routine shutdowns the executive.  It halts multitasking
312
 *  and returns control to the application execution "thread" which
313
 *  initialially invoked the rtems_initialize_executive directive.
314
 *
315
 *  Input parameters:   NONE
316
 *
317
 *  Output parameters:  NONE
318
 */
319
 
320
void rtems_shutdown_executive(
321
   unsigned32 result
322
)
323
{
324
  if ( _System_state_Current != SYSTEM_STATE_SHUTDOWN ) {
325
    _System_state_Set( SYSTEM_STATE_SHUTDOWN );
326
    _Thread_Stop_multitasking();
327
  }
328
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.