/* 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