20000317 sourceware import
This commit is contained in:
128
libgloss/pa/crt0.S
Normal file
128
libgloss/pa/crt0.S
Normal file
@ -0,0 +1,128 @@
|
||||
/* 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
|
||||
|
||||
|
Reference in New Issue
Block a user