// crt1-tiny.S // // This is a reduced version of the code in crt1-boards.S . // For most hardware / boards, this code sets up the C calling context // (setting up stack, PS, and clearing BSS) and calls main(). // It has some limitations (see LSP Ref Manual for details) such as: // - does not setup the C library (...) // - does not call C++ static constructors and destructors // - only clears .bss , not other *.bss sections // // Control arrives here at _start from the reset vector or from crt0-app.S. // Copyright (c) 1998-2010 Tensilica Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include // Imports // __stack from linker script (see LSP Ref Manual) // _bss_start from linker script (see LSP Ref Manual) // _bss_end from linker script (see LSP Ref Manual) // main from user application #ifdef __XTENSA_CALL0_ABI__ # define CALL call0 #else # define CALL call4 #endif /**************************************************************************/ .text .global _start _start: // _start is typically NOT at the beginning of the text segment -- // it is always called from either the reset vector or other code // that does equivalent initialization (such as crt0-app.S). // See crt1-boards.S for assumptions on entry to _start , // and for comments on what is being done in this file. #if !XCHAL_HAVE_HALT || !XCHAL_HAVE_BOOTLOADER // not needed for Xtensa TX movi a0, 0 // mark base of call stack #endif movi sp, __stack // setup the stack #if XCHAL_HAVE_EXCEPTIONS # ifdef __XTENSA_CALL0_ABI__ movi a3, PS_UM // PS: WOE=0, UM=1, EXCM=0, INTLEVEL=0 # else movi a3, PS_UM|PS_WOE // PS: WOE=1, UM=1, EXCM=0, INTLEVEL=0 # endif wsr a3, PS // setup PS for the application rsync #endif // Clear the BSS (uninitialized data) segment. // // This code only supports .bss, not multiple *.bss sections. // Corresponding code in crt1-boards.S does, and is faster but bigger. #if !XCHAL_HAVE_BOOTLOADER movi a6, _bss_start movi a7, _bss_end bgeu a6, a7, 2f 1: s32i a0, a6, 0 addi a6, a6, 4 bltu a6, a7, 1b 2: #endif // We can now call C code, the C calling environment is initialized. // This tiny C runtime assumes main is declared as "void main(void)" // rather than with the usual argc,argv. So there are no arguments. CALL main // In this tiny C runtime, main() is not expected to return. // If it does, just loop forever. //CALL xthal_dcache_all_writeback // sync dirty dcaches to memory //extw // sync TIE queues/ports/etc (LX or later only) .L0: #if XCHAL_HAVE_DEBUG break 1, 15 // give control to debugger #elif XCHAL_HAVE_HALT halt #endif j .L0 .size _start, . - _start // Local Variables: // mode:fundamental // comment-start: "// " // comment-start-skip: "// *" // End: