/******************************************************************************/ /* The ARGS data structure is defined according to a convention with linker. */ /* */ /* If the user want to pass arguments to loader, "--args=###" option has to */ /* be used in linking to generate executable. With this option, the linker */ /* will allocate a section starting with __c_args__, and with this "###" many */ /* bytes. The loader when parses the arguments, will dump the number of */ /* arguments, argc as the 1st arguments at address __c_args__, all the actual */ /* arguments will be dumped after that. The total space for these arguments */ /* will not exceed "###" bytes. */ /* */ /* if "--args="###" is not used as a linker option, linker will put -1 at */ /* __c_args__ location. */ /* Use _symval to load the 32-bit value corresponding to symbol __c_args__ */ /* */ /* Based on the above convention, the following code implements the access to */ /* these arguments when main is called. */ /* */ /* This function is called from boot.asm or boot.c. */ /******************************************************************************/ #include "cargs.h" /*---------------------------------------------------------------------------*/ /* __TI_args_main indicates that the default TI _args_main routine is being */ /* used. The linker makes assumptions about what _args_main does when this */ /* symbol is seen. This symbols should NOT be defined if a customized */ /* _args_main routine is used. */ /*---------------------------------------------------------------------------*/ __asm("\t.global __TI_args_main"); __asm("__TI_args_main .set 1"); int _args_main() { register ARGS *pargs = (ARGS*)_symval(&__c_args__); register int argc = 0; register char **argv = 0; if (_symval(&__c_args__) != NO_C_ARGS) { argc = pargs->argc; argv = pargs->argv; } return main(argc, argv); }