libc/libgloss/pa/crt0.S

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