Mercurial > nand-ecoscentric
diff packages/language/c/libc/current/src/support/cstartup.cxx @ 0:3111d98ba7b3 ecos-v1_1-release
Initial commit of eCos version 1.1
| author | jlarmour |
|---|---|
| date | Tue, 11 May 1999 11:16:07 +0000 |
| parents | |
| children | 443894e2e912 |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/packages/language/c/libc/current/src/support/cstartup.cxx @@ -0,0 +1,166 @@ +//======================================================================= +// +// cstartup.cxx +// +// Starting C library support +// +//======================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Cygnus eCos Public License +// Version 1.0 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://sourceware.cygnus.com/ecos +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Cygnus Operating System, released +// September 30, 1998. +// +// The Initial Developer of the Original Code is Cygnus. Portions created +// by Cygnus are Copyright (C) 1998 Cygnus Solutions. All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//======================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): jlarmour +// Contributors: jlarmour@cygnus.co.uk +// Date: 1998-08-27 +// Purpose: +// Description: +// Usage: +// +//####DESCRIPTIONEND#### +// +//======================================================================== + +// CONFIGURATION + +#include <pkgconf/libc.h> // Configuration header + +// Include the C library? +#ifdef CYGPKG_LIBC + +// INCLUDES + +#include <cyg/infra/cyg_type.h> // Common type definitions and support +#include <cyg/infra/cyg_trac.h> // Common tracing support +#include <cyg/infra/cyg_ass.h> // Common assertion support +#include "clibincl/stdlibsupp.hxx" // __libc_exit() ( i.e. exit() ) + +#ifdef CYGPKG_KERNEL +# include <cyg/kernel/thread.hxx> // eCos thread support +# include <cyg/kernel/thread.inl> +#endif + + +// FUNCTION PROTOTYPES + +// We provide a weakly named main to allow this to link if the user +// doesn't provide their own main. This isn't strictly good behaviour, +// but if the user wants good performance then of _course_ they should +// play with the config options and this won't be called. Or it might +// be "giving them enough rope" etc. :-) + +// The definition of the normal user-supplied main() is here aliased +// to a dummy main function. It isn't called main itself in order to +// throw GDB off the scent, which otherwise gets confused. These +// attributes have no effect on a user-supplied main() if one is supplied + +externC int +cyg_libc_dummy_main( int argc, char *argv[] ); + +externC int +main( int argc, char *argv[] ) + CYGPRI_LIBC_WEAK_ALIAS("cyg_libc_dummy_main"); + +static inline void +invoke_main( CYG_ADDRWORD ); + +// STATICS + +#ifdef CYGPKG_KERNEL +static cyg_uint8 main_stack[ CYGNUM_LIBC_MAIN_STACK_SIZE ]; + + +// GLOBALS + +// let the main thread be global so people can play with it (e.g. suspend +// or resume etc.) if that's what they want to do +Cyg_Thread cyg_libc_main_thread( &invoke_main, (CYG_ADDRWORD) 0, + CYGNUM_LIBC_MAIN_STACK_SIZE, + (CYG_ADDRESS) &main_stack ); +#endif + + +// FUNCTIONS + +externC int +cyg_libc_dummy_main( int argc, char *argv[] ) +{ + CYG_REPORT_FUNCNAMETYPE("main", "returning %d" ); + + // try to be helpful by diagnosing malformed arguments + CYG_PRECONDITION( argv != NULL, "argv is NULL!" ); + CYG_PRECONDITION( argv[argc] == NULL, "argv[argc] isn't NULL!" ); + + CYG_REPORT_FUNCARG2("argc=%d, argv[0]=%s", argc, + (argv[0]==NULL) ? "NULL" : argv[0] ); + + CYG_TRACE0( true, "This is the system-supplied default main()" ); + + CYG_REPORT_RETVAL(0); + return 0; // some CPUs have 0 hard-wired - faster than a reg +} + +// Making invoke_main() static inline has no effect if the kernel is +// present, and makes it inline if not! Cor. +static inline void +invoke_main( CYG_ADDRWORD ) +{ + CYG_REPORT_FUNCNAME( "invoke_main" ); + CYG_REPORT_FUNCARG1( "argument is %s", "ignored" ); + + // argv[argc] must be NULL according to the ISO C standard 5.1.2.2.1 + char *temp_argv[] = CYGDAT_LIBC_ARGUMENTS ; + int rc; + + rc = main( (sizeof(temp_argv)/sizeof(char *)) - 1, &temp_argv[0] ); + + CYG_TRACE1( true, "main() has returned with code %d. Calling exit()", + rc ); + + __libc_exit(rc); + + CYG_FAIL( "__libc_exit() returned!!!" ); + + CYG_REPORT_RETURN(); + +} // invoke_main(); + +externC void +cyg_iso_c_start( void ) +{ + CYG_REPORT_FUNCNAME( "cyg_iso_c_start" ); + CYG_REPORT_FUNCARGVOID(); + +#ifdef CYGPKG_KERNEL + CYG_TRACE0( true, "Resuming cyg_libc_main_thread" ); + cyg_libc_main_thread.resume(); +#else + invoke_main(0); +#endif + + CYG_REPORT_RETURN(); +} // cyg_iso_c_start() + + +#endif // ifdef CYGPKG_LIBC + +// EOF cstartup.cxx
