diff options
author | Ranjith Kumaran <ranjith@cygnus.com> | 2000-03-17 22:48:54 +0000 |
---|---|---|
committer | Ranjith Kumaran <ranjith@cygnus.com> | 2000-03-17 22:48:54 +0000 |
commit | 03261851a10dd2d6900a0a00a7515a0a46fb5d76 (patch) | |
tree | 7c22ac6cbbc99fd5cd1b5426853be8d4fd7bfcf1 /libgloss/pa/crt0.S | |
parent | fae4c299f14fc23e2829c8656992eba21f79242a (diff) | |
download | cygnal-03261851a10dd2d6900a0a00a7515a0a46fb5d76.tar.gz cygnal-03261851a10dd2d6900a0a00a7515a0a46fb5d76.tar.bz2 cygnal-03261851a10dd2d6900a0a00a7515a0a46fb5d76.zip |
20000317 sourceware import
Diffstat (limited to 'libgloss/pa/crt0.S')
-rw-r--r-- | libgloss/pa/crt0.S | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/libgloss/pa/crt0.S b/libgloss/pa/crt0.S new file mode 100644 index 000000000..e9ea525a8 --- /dev/null +++ b/libgloss/pa/crt0.S @@ -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 + + |