diff options
Diffstat (limited to 'libgloss/sparc/cygmon-crt0.S')
-rw-r--r-- | libgloss/sparc/cygmon-crt0.S | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/libgloss/sparc/cygmon-crt0.S b/libgloss/sparc/cygmon-crt0.S new file mode 100644 index 000000000..272c00db3 --- /dev/null +++ b/libgloss/sparc/cygmon-crt0.S @@ -0,0 +1,144 @@ +/* + * C startup code for the Fujitsu SPARClite demo board + * + * Copyright (c) 1995, 1996 Cygnus Support + * + * 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. + */ +#include "asm.h" + +#ifdef TARGET_CPU_SPARC64 +#define STACK_BIAS 2047 +#define SAVE_SIZE -128 +#else +#define SAVE_SIZE -64 +#endif + +.data + .align 8 +SYM(environ): ! this is the first address in the data section + .long 0 + +SYM(argc): + .long 0 + + .text + .align 8 + + .globl SYM(start) + .globl start +SYM(start): +start: + /* see if the stack is already setup. if not, then default + * to using the value of %sp as set by the ROM monitor + */ + sethi %hi(__stack), %g1 + or %g1,%lo(__stack),%g1 + cmp %g0,%g1 + be 1f + nop +#ifdef STACK_BIAS + sub %g1, STACK_BIAS, %g1 +#endif + mov %g1, %sp ! set the stack pointer + mov 0, %fp +1: + + /* zero the bss section */ + sethi %hi(__bss_start),%g2 + or %g2,%lo(__bss_start),%g2 ! start of bss + sethi %hi(_end),%g3 + or %g3,%lo(_end),%g3 ! end of bss + mov %g0,%g1 ! so std has two zeros +zerobss: + std %g0,[%g2] + add %g2,8,%g2 + cmp %g2,%g3 + bleu,a zerobss + nop + +/* + * initialize target specific stuff. Only execute these + * functions it they exist. + */ +init: + sethi %hi(SYM(hardware_init_hook)), %g1 + or %g1,%lo(SYM(hardware_init_hook)),%g1 + cmp %g0,%g1 + be 1f + nop + call SYM(hardware_init_hook) + nop + +1: + sethi %hi(SYM(software_init_hook)), %g1 + or %g1,%lo(SYM(software_init_hook)),%g1 + cmp %g0,%g1 + be 2f + nop + call SYM(software_init_hook) + nop +2: + set SYM(__sigtramp), %o0 + call SYM(__install_signal_handler) + nop + + set do_dtors,%o0 + call SYM(atexit) + nop + + call do_ctors + nop + + set SYM(argc), %o0 + call SYM(__getProgramArgs) + nop + + mov %o0, %o1 + set SYM(argc), %o0 + ld [%o0], %o0 + call SYM(main) + nop + + /* call exit from the C library so atexit gets called, and the + * C++ destructors get run. This calls our exit routine below + * when it's done. + */ + call SYM(exit) + nop + +do_ctors: + save %sp,SAVE_SIZE,%sp + set __CTOR_LIST__,%l0 +our_entry: + ld [%l0],%l1 + add %l0,4,%l0 + tst %l1 +1: + beq 2f + nop + ld [%l0],%l2 + add %l0,4,%l0 + + call %l2 + nop + deccc %l1 + b 1b + nop +2: + ret + restore + +do_dtors: + save %sp,SAVE_SIZE,%sp + set __DTOR_LIST__,%l0 + b our_entry + nop |