129 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
			
		
		
	
	
			129 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
/* crt0.S -- startup file for hppa.
 | 
						|
 *
 | 
						|
 * Copyright (c) 1995 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.
 | 
						|
 */
 | 
						|
	.VERSION "1.0"
 | 
						|
	.COPYRIGHT "crt0.o for the PA"
 | 
						|
 | 
						|
	.DATA
 | 
						|
 | 
						|
/* 
 | 
						|
 * Set up the standard spaces (sections) These definitions come
 | 
						|
 * from /lib/pcc_prefix.s.
 | 
						|
 */
 | 
						|
	.TEXT
 | 
						|
	
 | 
						|
/*
 | 
						|
 * stuff we need that's defined elsewhere.
 | 
						|
 */
 | 
						|
	.IMPORT main, CODE
 | 
						|
	.IMPORT exit, CODE
 | 
						|
	.IMPORT _bss_start, DATA
 | 
						|
	.IMPORT _end, DATA
 | 
						|
	.IMPORT environ, DATA
 | 
						|
 | 
						|
/*
 | 
						|
 * start -- set things up so the application will run.
 | 
						|
 *
 | 
						|
 */
 | 
						|
        .PROC
 | 
						|
        .CALLINFO SAVE_SP, FRAME=48
 | 
						|
        .EXPORT $START$,ENTRY
 | 
						|
$START$
 | 
						|
 | 
						|
	/* FIXME: this writes to page zero */
 | 
						|
	;; setup the %30 (stack pointer) with some memory
 | 
						|
	ldil 	L%_stack,%r30
 | 
						|
        ldo 	R%_stack(%r30),%r30
 | 
						|
 | 
						|
	;; we need to set %r27 (global data pointer) here too 
 | 
						|
	ldil 	L%$global$,%r27
 | 
						|
        ldo 	R%$global$(%r27),%r27		; same problem as above
 | 
						|
 | 
						|
/*
 | 
						|
 * zerobss -- zero out the bss section
 | 
						|
 */
 | 
						|
	; load the start of bss
 | 
						|
	ldil 	L%_bss_start,%r4
 | 
						|
        ldo 	R%_bss_start(%r4),%r4
 | 
						|
 | 
						|
	;  load the end of bss
 | 
						|
	ldil 	L%_end,%r5
 | 
						|
        ldo 	R%_end(%r5),%r5
 | 
						|
 | 
						|
 | 
						|
L$bssloop
 | 
						|
	addi	-1,%r5,%r5			; decrement _bss_end
 | 
						|
	stb	%r0,0(0,%r5)			; we do this by bytes for now even
 | 
						|
						; though it's slower, it's safer
 | 
						|
	combf,=	%r4,%r5, L$bssloop	
 | 
						|
	nop
 | 
						|
	
 | 
						|
	ldi	1,%ret0
 | 
						|
 | 
						|
/*
 | 
						|
 * Call the main routine from the application to get it going.
 | 
						|
 * main (argc, argv, environ)
 | 
						|
 * We pass argv as a pointer to NULL.
 | 
						|
 */
 | 
						|
 | 
						|
	ldil	L%main,%r22
 | 
						|
	ble 	R%main(%sr4,%r22)
 | 
						|
	copy	%r31,%r2
 | 
						|
/*
 | 
						|
 * Call exit() from the C library with the return value from main()
 | 
						|
 */
 | 
						|
	copy	%r28,%r26
 | 
						|
	ldil	L%exit,%r22
 | 
						|
	ble	R%exit(%sr4,%r22)
 | 
						|
	copy	%r31,%r2
 | 
						|
 | 
						|
        .PROCEND
 | 
						|
/*
 | 
						|
 * _exit -- Exit from the application. Normally we cause a user trap
 | 
						|
 * 	    to return to the ROM monitor for another run.
 | 
						|
 */
 | 
						|
	.EXPORT _exit, ENTRY
 | 
						|
_exit
 | 
						|
	.PROC
 | 
						|
	.CALLINFO
 | 
						|
	.ENTRY
 | 
						|
	
 | 
						|
	;; This just causes a breakpoint exception
 | 
						|
	break	0x0,0x0
 | 
						|
        bv,n    (%rp)
 | 
						|
	nop
 | 
						|
	.EXIT
 | 
						|
	.PROCEND
 | 
						|
 | 
						|
/*
 | 
						|
 * _sr4export -- support for called functions. (mostly for GDB)
 | 
						|
 */
 | 
						|
	.EXPORT _sr4export, ENTRY
 | 
						|
_sr4export:
 | 
						|
	.PROC
 | 
						|
	.CALLINFO
 | 
						|
	.ENTRY
 | 
						|
 | 
						|
	ble	0(%sr4,%r22)
 | 
						|
	copy	%r31,%rp
 | 
						|
	ldw	-24(%sr0,%sp),%rp
 | 
						|
	ldsid	(%sr0,%rp),%r1
 | 
						|
	mtsp	%r1,%sr0
 | 
						|
	be,n	0(%sr0,%rp)
 | 
						|
	nop
 | 
						|
	.EXIT
 | 
						|
	.PROCEND
 | 
						|
 | 
						|
 |