20000317 sourceware import
This commit is contained in:
144
libgloss/sparc/cygmon-crt0.S
Normal file
144
libgloss/sparc/cygmon-crt0.S
Normal file
@ -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
|
Reference in New Issue
Block a user