128 lines
2.7 KiB
ArmAsm
128 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
|
|
|
|
|