/* 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