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
 |