/* * crt0.S for the Blackfin processor * * Copyright (C) 2006 Analog Devices, Inc. * * The authors hereby grant permission to use, copy, modify, distribute, * and license this software and its documentation for any purpose, provided * that existing copyright notices are retained in all copies and that this * notice is included verbatim in any distributions. No written agreement, * license, or royalty fee is required for any of the authorized uses. * Modifications to this software may be copyrighted by their authors * and need not follow the licensing terms described here, provided that * the new terms are clearly indicated on the first page of each file where * they apply. */ .text .align 2 .global __start __start: /* Start by setting up a stack */ link 0xc; /* Zero the memory in the .bss section. */ p0.l = __edata; p0.h = __edata; p1.l = __end; p1.h = __end; p1 -= p0; r0 = 0; lsetup (L$L$clear_bss, L$L$clear_bss) lc0 = p1; L$L$clear_bss: B [p0++] = r0; #ifdef __BFIN_FDPIC__ /* Set up GOT pointer. */ P0.L = __ROFIXUP_END__; P0.H = __ROFIXUP_END__; P4 = [P0 - 4]; #endif /* Need to set up standard file handles */ /* Parse string at r1 */ p0.l = __init; p0.h = __init; P3 = P4; call (p0) p0.l = _atexit; p0.h = _atexit; #ifdef __BFIN_FDPIC__ r0 = [P4 + __fini@FUNCDESC_GOT17M4]; P3 = P4; #else r0.l = __fini; r0.h = __fini; #endif call (p0) p0.l = ___setup_argv_and_call_main; p0.h = ___setup_argv_and_call_main; P3 = P4; call (p0) p0.l = _exit; p0.h = _exit; P3 = P4; jump (p0) /* Should not return. */ nop;