source: rtems/cpukit/sapi/src/exinit.c @ c3db01d0

4.104.114.84.9
Last change on this file since c3db01d0 was c3db01d0, checked in by Joel Sherrill <joel.sherrill@…>, on May 9, 2007 at 6:27:26 PM

2007-05-09 Joel Sherrill <joel.sherrill@…>

  • libcsupport/include/rtems/libcsupport.h, libcsupport/src/newlibc.c, sapi/Makefile.am, sapi/include/confdefs.h, sapi/src/exinit.c, score/Makefile.am, score/preinstall.am, score/include/rtems/score/userext.h, score/src/chain.c, score/src/userext.c: Switch to newlib reentrancy extension being installed in the initial set instead of using rtems_extension_create. While implementing this, noticed that user extensions and chain code had multiple functions in a single file which is not desirable in the SuperCore? and API portions of RTEMS, so split these into multiple files with one function per file. Also noticed that some of user extension code was inlined for no particular reason so moved that to C bodies. Split executive shutdown from initialization since not every application shuts down. Moved fini call to executive shutdown to be more symmetrical with where it is called at startup.
  • sapi/src/exshutdown.c, score/src/chainappend.c, score/src/chainextract.c, score/src/chainget.c, score/src/chaininsert.c, score/src/userextaddapiset.c, score/src/userextaddset.c, score/src/userextremoveset.c, score/src/userextthreadbegin.c, score/src/userextthreadcreate.c, score/src/userextthreaddelete.c, score/src/userextthreadrestart.c, score/src/userextthreadstart.c, score/src/userextthreadswitch.c: New files.
  • score/inline/rtems/score/userext.inl: Removed.
  • Property mode set to 100644
File size: 6.6 KB
Line 
1/*
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.rtems.com/license/LICENSE.
10 *
11 *  $Id$
12 */
13
14#if HAVE_CONFIG_H
15#include "config.h"
16#endif
17
18/*
19 *  SCORE_INIT and SAPI_INIT are defined so all of the super core and
20 *  super API data will be included in this object file.
21 */
22
23#define SAPI_INIT
24#define SCORE_INIT
25
26#include <rtems/system.h>
27#include <rtems/config.h>
28#include <rtems/debug.h>
29#include <rtems/extension.h>
30#include <rtems/fatal.h>
31#include <rtems/init.h>
32#include <rtems/io.h>
33#include <rtems/score/sysstate.h>
34
35#include <rtems/score/apiext.h>
36#include <rtems/score/apimutex.h>
37#include <rtems/score/copyrt.h>
38#include <rtems/score/heap.h>
39#include <rtems/score/interr.h>
40#include <rtems/score/isr.h>
41#if defined(RTEMS_MULTIPROCESSING)
42#include <rtems/score/mpci.h>
43#endif
44#include <rtems/score/priority.h>
45#include <rtems/score/thread.h>
46#include <rtems/score/tod.h>
47#include <rtems/score/userext.h>
48#include <rtems/score/watchdog.h>
49#include <rtems/score/wkspace.h>
50
51#include <rtems/sptables.h>
52
53
54#include <rtems/rtems/rtemsapi.h>
55#ifdef RTEMS_POSIX_API
56#include <rtems/posix/posixapi.h>
57#endif
58#ifdef RTEMS_ITRON_API
59#include <rtems/itron/itronapi.h>
60#endif
61
62Objects_Information *_Internal_Objects[ OBJECTS_INTERNAL_CLASSES_LAST + 1 ];
63
64rtems_interrupt_level rtems_initialize_executive_early(
65  rtems_configuration_table *configuration_table,
66  rtems_cpu_table           *cpu_table
67)
68{
69  rtems_interrupt_level        bsp_level;
70  rtems_multiprocessing_table *multiprocessing_table;
71
72  /*
73   *  Dispatching and interrupts are disabled until the end of the
74   *  initialization sequence.  This prevents an inadvertent context
75   *  switch before the executive is initialized.
76   */
77
78  _ISR_Disable( bsp_level );
79
80  if ( configuration_table == NULL )
81    _Internal_error_Occurred(
82      INTERNAL_ERROR_CORE,
83      TRUE,
84      INTERNAL_ERROR_NO_CONFIGURATION_TABLE
85    );
86
87  /*
88   *  Initialize the system state based on whether this is an MP system.
89   */
90
91#if defined(RTEMS_MULTIPROCESSING)
92  multiprocessing_table = configuration_table->User_multiprocessing_table;
93
94  _System_state_Handler_initialization(
95    (multiprocessing_table) ? TRUE : FALSE
96  );
97#else
98  multiprocessing_table = NULL;
99
100  _System_state_Handler_initialization( FALSE );
101#endif
102
103  /*
104   *  Provided just for user convenience.
105   */
106
107  _Configuration_Table    = configuration_table;
108#if defined(RTEMS_MULTIPROCESSING)
109  _Configuration_MP_table = multiprocessing_table;
110#endif
111
112  /*
113   *  Internally we view single processor systems as a very restricted
114   *  multiprocessor system.
115   */
116
117  if ( multiprocessing_table == NULL )
118    multiprocessing_table =
119      (void *)&_Initialization_Default_multiprocessing_table;
120
121  if ( cpu_table == NULL )
122    _Internal_error_Occurred(
123      INTERNAL_ERROR_CORE,
124      TRUE,
125      INTERNAL_ERROR_NO_CPU_TABLE
126    );
127
128  _CPU_Initialize( cpu_table, _Thread_Dispatch );
129
130  /*
131   *  Do this as early as possible to insure no debugging output
132   *  is even attempted to be printed.
133   */
134
135  _Debug_Manager_initialization();
136
137  _API_extensions_Initialization();
138
139  _Thread_Dispatch_initialization();
140
141  _Workspace_Handler_initialization(
142     (void *)configuration_table->work_space_start,
143     configuration_table->work_space_size
144  );
145
146  _User_extensions_Handler_initialization(
147    configuration_table->number_of_initial_extensions,
148    configuration_table->User_extension_table
149  );
150
151  _ISR_Handler_initialization();
152
153  _Objects_Handler_initialization(
154    multiprocessing_table->node,
155    multiprocessing_table->maximum_nodes,
156    multiprocessing_table->maximum_global_objects
157  );
158
159  _Objects_Information_table[OBJECTS_INTERNAL_API] = _Internal_Objects;
160
161  _Priority_Handler_initialization();
162
163  _Watchdog_Handler_initialization();
164
165  _TOD_Handler_initialization( configuration_table->microseconds_per_tick );
166
167  _Thread_Handler_initialization(
168    configuration_table->ticks_per_timeslice,
169    configuration_table->maximum_extensions,
170    multiprocessing_table->maximum_proxies
171  );
172
173#if defined(RTEMS_MULTIPROCESSING)
174  _MPCI_Handler_initialization(
175    multiprocessing_table->User_mpci_table,
176    RTEMS_TIMEOUT
177  );
178#endif
179
180/* MANAGERS */
181
182  _RTEMS_API_Initialize( configuration_table );
183
184  _Extension_Manager_initialization( configuration_table->maximum_extensions );
185
186  _IO_Manager_initialization(
187    configuration_table->Device_driver_table,
188    configuration_table->number_of_device_drivers,
189    configuration_table->maximum_drivers,
190    configuration_table->maximum_devices
191  );
192
193#ifdef RTEMS_POSIX_API
194  _POSIX_API_Initialize( configuration_table );
195#endif
196
197#ifdef RTEMS_ITRON_API
198  _ITRON_API_Initialize( configuration_table );
199#endif
200
201  _System_state_Set( SYSTEM_STATE_BEFORE_MULTITASKING );
202
203  /*
204   *  No threads should be created before this point!!!
205   *  _Thread_Executing and _Thread_Heir are not set.
206   *
207   *  At this point all API extensions are in place.  After the call to
208   *  _Thread_Create_idle() _Thread_Executing and _Thread_Heir will be set.
209   */
210
211  _Thread_Create_idle();
212
213  /*
214   *  Scheduling can properly occur now as long as we avoid dispatching.
215   */
216
217  if ( cpu_table->pretasking_hook )
218    (*cpu_table->pretasking_hook)();
219
220#if defined(RTEMS_MULTIPROCESSING)
221  _MPCI_Create_server();
222#endif
223
224  /*
225   *  Run the API and BSPs predriver hook.
226   */
227
228  _API_extensions_Run_predriver();
229
230  if ( _CPU_Table.predriver_hook )
231    (*_CPU_Table.predriver_hook)();
232
233  /*
234   *  Initialize all the device drivers and initialize the MPCI layer.
235   *
236   *  NOTE:  The MPCI may be build upon a device driver.
237   */
238
239  _IO_Initialize_all_drivers();
240
241#if defined(RTEMS_MULTIPROCESSING)
242  if ( _System_state_Is_multiprocessing ) {
243    _MPCI_Initialization();
244    _MPCI_Internal_packets_Send_process_packet(
245      MPCI_PACKETS_SYSTEM_VERIFY
246    );
247  }
248#endif
249
250  /*
251   *  Run the APIs and BSPs postdriver hooks.
252   *
253   *  The API extensions are supposed to create user initialization tasks.
254   */
255
256  _API_extensions_Run_postdriver();
257
258  if ( _CPU_Table.postdriver_hook )
259    (*_CPU_Table.postdriver_hook)();
260
261  return bsp_level;
262}
263
264void rtems_initialize_executive_late(
265  rtems_interrupt_level bsp_level
266)
267{
268
269  _System_state_Set( SYSTEM_STATE_BEGIN_MULTITASKING );
270
271  _Thread_Start_multitasking();
272
273  /*
274   *  Restore the interrupt level to what the BSP had.  Technically,
275   *  this is unnecessary since the BSP should have all interrupts
276   *  disabled when rtems_initialize_executive is invoked.  But this keeps
277   *  the ISR Disable/Enable calls paired.
278   */
279
280  _ISR_Enable( bsp_level );
281}
Note: See TracBrowser for help on using the repository browser.