mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2025-12-25 22:07:15 +00:00
Use shared initialization.
This commit is contained in:
@@ -1,151 +0,0 @@
|
||||
/*
|
||||
* rtems-ctor.cc
|
||||
*
|
||||
* Description:
|
||||
* This file exists solely to (try to) ensure RTEMS is initialized
|
||||
* before any global constructors are run.
|
||||
*
|
||||
* The problem:
|
||||
* Global constructors might reasonably expect that new() will
|
||||
* work, but since new() uses malloc() which uses RTEMS regions,
|
||||
* it can not be called until after initialize_executive().
|
||||
*
|
||||
* Global constructors are called in GNU systems one of 2 ways:
|
||||
*
|
||||
* an "invisible" call to __main() inserted by compiler
|
||||
* This __main() calls __do_global_ctors() which
|
||||
* walks thru the table and calls all global
|
||||
* constructors.
|
||||
*
|
||||
* or -
|
||||
* A special section is put into the linked binary. The
|
||||
* system startup code knows to run the constructors in
|
||||
* this special section before calling main().
|
||||
*
|
||||
* By making RTEMS initialization a constructor, we avoid having
|
||||
* too much about all this. All we have to guarantee is that
|
||||
* this constructor is the first one run.
|
||||
*
|
||||
*
|
||||
* So for the first case above, this is what happens
|
||||
*
|
||||
* host crt0
|
||||
* main()
|
||||
* __main()
|
||||
* __do_global_ctors()
|
||||
* bsp_start()
|
||||
* init_executive_early()
|
||||
* <<any other constructors>>
|
||||
*
|
||||
* rtems_init_executive_late()
|
||||
* bsp_cleanup()
|
||||
*
|
||||
* TODO:
|
||||
*
|
||||
* COPYRIGHT (c) 1989-1998.
|
||||
* On-Line Applications Research Corporation (OAR).
|
||||
* Copyright assigned to U.S. Government, 1994.
|
||||
*
|
||||
* The license and distribution terms for this file may in
|
||||
* the file LICENSE in this distribution or at
|
||||
* http://www.OARcorp.com/rtems/license.html.
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#include <bsp.h>
|
||||
|
||||
/*
|
||||
* RTEMS program name
|
||||
* Probably not used by anyone, but it is nice to have it.
|
||||
* Actually the UNIX version of CPU_INVOKE_DEBUGGER will probably
|
||||
* need to use it
|
||||
*/
|
||||
|
||||
char *rtems_progname;
|
||||
char **rtems_environp;
|
||||
|
||||
#ifdef USE_CONSTRUCTORS_FOR_INIT_EXEC
|
||||
|
||||
class RTEMS {
|
||||
public:
|
||||
RTEMS();
|
||||
~RTEMS();
|
||||
};
|
||||
|
||||
RTEMS rtems_constructor;
|
||||
|
||||
|
||||
/* PAGE
|
||||
*
|
||||
* RTEMS::RTEMS
|
||||
*
|
||||
* RTEMS constructor routine
|
||||
*
|
||||
* Input parameters: NONE
|
||||
*
|
||||
* Output parameters: NONE
|
||||
*
|
||||
* Return values: NONE
|
||||
*/
|
||||
|
||||
RTEMS::RTEMS()
|
||||
{
|
||||
bsp_start();
|
||||
}
|
||||
|
||||
/* PAGE
|
||||
*
|
||||
* RTEMS::~RTEMS
|
||||
*
|
||||
* RTEMS distructor routine
|
||||
*
|
||||
* Input parameters: NONE
|
||||
*
|
||||
* Output parameters: NONE
|
||||
*
|
||||
* Return values: NONE
|
||||
*/
|
||||
|
||||
RTEMS::~RTEMS()
|
||||
{
|
||||
bsp_cleanup();
|
||||
}
|
||||
#endif
|
||||
|
||||
extern "C" {
|
||||
int
|
||||
main(int argc,
|
||||
char **argv,
|
||||
char **environp)
|
||||
{
|
||||
|
||||
#ifndef USE_CONSTRUCTORS_FOR_INIT_EXEC
|
||||
bsp_start();
|
||||
#endif
|
||||
|
||||
if ((argc > 0) && argv && argv[0])
|
||||
rtems_progname = argv[0];
|
||||
else
|
||||
rtems_progname = "RTEMS";
|
||||
|
||||
rtems_environp = environp;
|
||||
|
||||
/*
|
||||
* Start multitasking
|
||||
*/
|
||||
|
||||
rtems_initialize_executive_late( bsp_isr_level );
|
||||
|
||||
#ifndef USE_CONSTRUCTORS_FOR_INIT_EXEC
|
||||
bsp_cleanup();
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Returns when multitasking is stopped
|
||||
* This allows our destructors to get run normally
|
||||
*/
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user