79 lines
1.8 KiB
ArmAsm
79 lines
1.8 KiB
ArmAsm
|
/*
|
||
|
* This is based on the file srt0.s provided with the binary
|
||
|
* distribution of the SPARC Instruction Simulator (SIS) found
|
||
|
* at ftp://ftp.estec.esa.nl/pub/ws/wsd/erc32.
|
||
|
*/
|
||
|
|
||
|
#include "asm.h"
|
||
|
|
||
|
.register %g2, #scratch
|
||
|
.register %g3, #scratch
|
||
|
|
||
|
.data
|
||
|
.align 8
|
||
|
SYM(environ):
|
||
|
.long 0
|
||
|
|
||
|
.text
|
||
|
|
||
|
.globl SYM(start)
|
||
|
SYM(start):
|
||
|
sethi %hi(__stack), %g1
|
||
|
or %g1,%lo(__stack),%g1
|
||
|
mov %g1, %sp ! set the stack pointer
|
||
|
mov %sp, %fp
|
||
|
|
||
|
/* clear the bss */
|
||
|
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
|
||
|
|
||
|
/* move data segment to proper location */
|
||
|
|
||
|
#if 0
|
||
|
relocd:
|
||
|
set (_endtext),%g2 ! g2 = start of data in aout file
|
||
|
set (_environ),%g4 ! g4 = start of where data should go
|
||
|
set (_edata),%g3 ! g3 = end of where data should go
|
||
|
subcc %g3, %g4, %g5 ! g5 = length of data
|
||
|
|
||
|
subcc %g4, %g2, %g0 ! need to relocate data ?
|
||
|
ble initok
|
||
|
ld [%g4], %g6
|
||
|
subcc %g6, 1, %g0
|
||
|
be initok
|
||
|
mvdata:
|
||
|
subcc %g5, 8, %g5
|
||
|
ldd [%g2 + %g5], %g6
|
||
|
bg mvdata
|
||
|
std %g6, [%g4 + %g5]
|
||
|
|
||
|
initok:
|
||
|
#endif
|
||
|
|
||
|
call SYM(__fix_ctors)
|
||
|
nop
|
||
|
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
|
||
|
|
||
|
.globl SYM(_exit)
|
||
|
SYM(_exit):
|
||
|
set 0xdeadd00d, %o1 ! Magic number for simulator.
|
||
|
ta 0 ! Halt if _main returns ...
|
||
|
nop
|
||
|
|