1/* crt0.S -- startup file for hppa. 2 * 3 * Copyright (c) 1995 Cygnus Support 4 * 5 * The authors hereby grant permission to use, copy, modify, distribute, 6 * and license this software and its documentation for any purpose, provided 7 * that existing copyright notices are retained in all copies and that this 8 * notice is included verbatim in any distributions. No written agreement, 9 * license, or royalty fee is required for any of the authorized uses. 10 * Modifications to this software may be copyrighted by their authors 11 * and need not follow the licensing terms described here, provided that 12 * the new terms are clearly indicated on the first page of each file where 13 * they apply. 14 */ 15 .VERSION "1.0" 16 .COPYRIGHT "crt0.o for the PA" 17 18 .DATA 19 20/* 21 * Set up the standard spaces (sections) These definitions come 22 * from /lib/pcc_prefix.s. 23 */ 24 .TEXT 25 26/* 27 * stuff we need that's defined elsewhere. 28 */ 29 .IMPORT main, CODE 30 .IMPORT exit, CODE 31 .IMPORT _bss_start, DATA 32 .IMPORT _end, DATA 33 .IMPORT environ, DATA 34 35/* 36 * start -- set things up so the application will run. 37 * 38 */ 39 .PROC 40 .CALLINFO SAVE_SP, FRAME=48 41 .EXPORT $START$,ENTRY 42$START$ 43 44 /* FIXME: this writes to page zero */ 45 ;; setup the %30 (stack pointer) with some memory 46 ldil L%_stack,%r30 47 ldo R%_stack(%r30),%r30 48 49 ;; we need to set %r27 (global data pointer) here too 50 ldil L%$global$,%r27 51 ldo R%$global$(%r27),%r27 ; same problem as above 52 53/* 54 * zerobss -- zero out the bss section 55 */ 56 ; load the start of bss 57 ldil L%_bss_start,%r4 58 ldo R%_bss_start(%r4),%r4 59 60 ; load the end of bss 61 ldil L%_end,%r5 62 ldo R%_end(%r5),%r5 63 64 65L$bssloop 66 addi -1,%r5,%r5 ; decrement _bss_end 67 stb %r0,0(0,%r5) ; we do this by bytes for now even 68 ; though it's slower, it's safer 69 combf,= %r4,%r5, L$bssloop 70 nop 71 72 ldi 1,%ret0 73 74/* 75 * Call the main routine from the application to get it going. 76 * main (argc, argv, environ) 77 * We pass argv as a pointer to NULL. 78 */ 79 80 ldil L%main,%r22 81 ble R%main(%sr4,%r22) 82 copy %r31,%r2 83/* 84 * Call exit() from the C library with the return value from main() 85 */ 86 copy %r28,%r26 87 ldil L%exit,%r22 88 ble R%exit(%sr4,%r22) 89 copy %r31,%r2 90 91 .PROCEND 92/* 93 * _exit -- Exit from the application. Normally we cause a user trap 94 * to return to the ROM monitor for another run. 95 */ 96 .EXPORT _exit, ENTRY 97_exit 98 .PROC 99 .CALLINFO 100 .ENTRY 101 102 ;; This just causes a breakpoint exception 103 break 0x0,0x0 104 bv,n (%rp) 105 nop 106 .EXIT 107 .PROCEND 108 109/* 110 * _sr4export -- support for called functions. (mostly for GDB) 111 */ 112 .EXPORT _sr4export, ENTRY 113_sr4export: 114 .PROC 115 .CALLINFO 116 .ENTRY 117 118 ble 0(%sr4,%r22) 119 copy %r31,%rp 120 ldw -24(%sr0,%sp),%rp 121 ldsid (%sr0,%rp),%r1 122 mtsp %r1,%sr0 123 be,n 0(%sr0,%rp) 124 nop 125 .EXIT 126 .PROCEND 127 128 129