106 lines
1.3 KiB
ArmAsm
106 lines
1.3 KiB
ArmAsm
/* crt0.S for the sparclet 701.
|
|
|
|
At the moment, all the necessary syscalls are here.
|
|
Convention has them in a separate file but libgloss is still in
|
|
too much flux. */
|
|
|
|
.text
|
|
|
|
.global start
|
|
start:
|
|
|
|
! zero bss
|
|
|
|
sethi %hi(_end), %o1
|
|
or %o1, %lo(_end), %o1
|
|
sethi %hi(_edata), %o0
|
|
or %o0, %lo (_edata), %o0
|
|
sub %o1, %o0, %o1
|
|
Lzero_bss:
|
|
subcc %o1, 4, %o1
|
|
clr [%o0]
|
|
bne Lzero_bss
|
|
add %o0, 4, %o0
|
|
|
|
! set up argc, argv, envp (?)
|
|
|
|
ld [%sp+64], %o0
|
|
sll %o0, 2, %o2
|
|
add %o2, 4, %o2
|
|
add %sp, 68, %o1
|
|
add %o1, %o2, %o2
|
|
sethi %hi(_environ), %o3
|
|
st %o2, [%o3+%lo(_environ)]
|
|
|
|
! call main, exit
|
|
|
|
call _main
|
|
sub %sp, 32, %sp
|
|
call _exit
|
|
nop
|
|
|
|
! void _exit (int rc)
|
|
|
|
.global __exit
|
|
__exit:
|
|
mov 1, %g1
|
|
ta 0
|
|
! If that does not work, just loop forever.
|
|
Lloop_forever:
|
|
b Lloop_forever
|
|
nop
|
|
|
|
! int _open (char *, int)
|
|
|
|
.global _open
|
|
_open:
|
|
mov 5, %g1
|
|
ta 0
|
|
bcc Lnoerr
|
|
nop
|
|
b Lcerror
|
|
nop
|
|
|
|
! int _close (int)
|
|
|
|
.global _close
|
|
_close:
|
|
mov 6, %g1
|
|
ta 0
|
|
bcc Lnoerr
|
|
nop
|
|
b Lcerror
|
|
nop
|
|
|
|
! int read (int, char *, int)
|
|
|
|
.global _read
|
|
_read:
|
|
mov 3, %g1
|
|
ta 0
|
|
bcc Lnoerr
|
|
nop
|
|
b Lcerror
|
|
nop
|
|
|
|
! int write (int, char *, int)
|
|
|
|
.global _write
|
|
_write:
|
|
mov 4, %g1
|
|
ta 0
|
|
bcc Lnoerr
|
|
nop
|
|
b Lcerror
|
|
nop
|
|
|
|
Lnoerr:
|
|
retl
|
|
nop
|
|
|
|
Lcerror:
|
|
sethi %hi(__impure_ptr), %g1
|
|
st %o0, [%g1+%lo(__impure_ptr)]
|
|
retl
|
|
mov -1, %o0
|