URL
https://opencores.org/ocsvn/openrisc_2011-10-31/openrisc_2011-10-31/trunk
Subversion Repositories openrisc_2011-10-31
[/] [openrisc/] [trunk/] [rtos/] [rtems/] [c/] [src/] [lib/] [libbsp/] [unix/] [posix/] [startup/] [rtems-ctor.cc] - Rev 30
Go to most recent revision | Compare with Previous | Blame | View Log
/* * 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>> * * init_executive_late() * bsp_cleanup() * * TODO: * * $Id: rtems-ctor.cc,v 1.2 2001-09-27 12:01:15 chris Exp $ */ #include <bsp.h> #include <stdio.h> #include <stdlib.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; class RTEMS { public: RTEMS(); ~RTEMS(); }; RTEMS rtems_constructor; RTEMS::RTEMS() { bsp_start(); } RTEMS::~RTEMS() { bsp_cleanup(); } extern "C" { extern void invoke_non_gnu_constructors(void); int main(int argc, char **argv, char ** /* environp is unused */) { rtems_argc = argc; rtems_argv = argv; if ((argc > 0) && argv && argv[0]) rtems_progname = argv[0]; else rtems_progname = "RTEMS"; /* * run any non-gnu constructors we may need */ invoke_non_gnu_constructors(); /* * Start multitasking */ rtems_initialize_executive_late( bsp_isr_level ); /* * Returns when multitasking is stopped * This allows our destructors to get run normally */ fflush( stdout ); fflush( stderr ); return 0; } }
Go to most recent revision | Compare with Previous | Blame | View Log